private void RefreshLanes() { lvLanes.ItemsSource = null; lanes.Clear(); var tsb = ops.TSB.GetCurrent().Value(); if (null != tsb) { var tsbLanes = ops.TSB.GetTSBLanes(tsb).Value(); if (null != tsbLanes) { tsbLanes.ForEach(tsbLane => { var inst = new LaneItem(); tsbLane.AssignTo(inst); // find Attendance. var search = Search.Lanes.Current.AttendanceByLane.Create(tsbLane); inst.Attendance = ops.Lanes.GetCurrentAttendancesByLane(search).Value(); lanes.Add(inst); }); } } lvLanes.ItemsSource = lanes; RefreshUI(); }
protected override void Handle(LaneFlow flow) { if (_laneBlocks.ContainsKey(flow.DataId)) { LaneItem laneItem = _laneBlocks[flow.DataId]; if (laneItem.RoadSection != null) { flow.SectionId = laneItem.RoadSection.SectionId; flow.SectionType = laneItem.RoadSection.SectionType; flow.SectionLength = laneItem.RoadSection.Length; flow.FreeSpeed = laneItem.RoadSection.FreeSpeed; } flow.Distance = flow.Vehicle * laneItem.Length; flow.TravelTime = flow.AverageSpeedData > 0 ? flow.Vehicle * laneItem.Length / Convert.ToDouble(flow.AverageSpeedData * 1000 / 3600) : 0; laneItem.LaneBlock.InputBlock.Post(flow); _laneFlowCacheBlock.InputBlock.Post(flow); laneItem.Total += 1; _ok += 1; } else { _unknown += 1; _logger.LogWarning((int)LogEvent.流量数据块, $"未知的车道 {flow.DataId}"); } }
private void lvLanes_SelectionChanged(object sender, SelectionChangedEventArgs e) { currentLane = lvLanes.SelectedItem as LaneItem; RefreshLaneAttendances(); RefreshLanePayments(); RefreshUI(); }
protected override void ResetCore(List <FlowDevice> devices) { foreach (FlowDevice newDevice in devices) { foreach (var relation in newDevice.FlowDevice_FlowChannels) { foreach (Lane lane in relation.Channel.Lanes) { if (!_laneBlocks.ContainsKey(lane.DataId)) { LaneFlowStatisticsBlock laneBlock = new LaneFlowStatisticsBlock(_serviceProvider); laneBlock.LinkTo(_oneBatchBlock, _fiveBatchBlock, _fifteenBatchBlock, _sixtyBatchBlock); LaneItem laneItem = new LaneItem { LaneBlock = laneBlock, Length = lane.Length, RoadSection = relation.Channel.SectionId.HasValue ? relation.Channel.RoadSection : null }; _laneBlocks.TryAdd(lane.DataId, laneItem); _logger.LogInformation((int)LogEvent.流量数据块, $"添加车道 {lane.DataId}"); } } } } foreach (FlowDevice oldDevice in _devices) { foreach (var relation in oldDevice.FlowDevice_FlowChannels) { foreach (Lane lane in relation.Channel.Lanes) { if (devices.SelectMany(d => d.FlowDevice_FlowChannels) .Select(r => r.Channel) .SelectMany(c => c.Lanes) .All(l => l.DataId != lane.DataId)) { if (_laneBlocks.TryRemove(lane.DataId, out LaneItem item)) { item.LaneBlock.InputBlock.Complete(); item.LaneBlock.WaitCompletion(); } _logger.LogInformation((int)LogEvent.流量数据块, $"删除车道 {lane.DataId}"); } } } } }
protected override void OpenCore() { //重置计数 _ok = 0; _unknown = 0; //车道 _laneFlowCacheBlock = new LaneFlowCacheBlock(_serviceProvider); _oneBatchBlock = new BatchBlock <LaneFlow>(BatchSize); _fiveBatchBlock = new BatchBlock <LaneFlow>(BatchSize); _fifteenBatchBlock = new BatchBlock <LaneFlow>(BatchSize); _sixtyBatchBlock = new BatchBlock <LaneFlow>(BatchSize); _laneFlowDbBlock = new LaneFlowDbBlock(ThreadCount, _serviceProvider); _oneBatchBlock.LinkTo(_laneFlowDbBlock.InputBlock, new DataflowLinkOptions { PropagateCompletion = false }); _fiveBatchBlock.LinkTo(_laneFlowDbBlock.InputBlock, new DataflowLinkOptions { PropagateCompletion = false }); _fifteenBatchBlock.LinkTo(_laneFlowDbBlock.InputBlock, new DataflowLinkOptions { PropagateCompletion = false }); _sixtyBatchBlock.LinkTo(_laneFlowDbBlock.InputBlock, new DataflowLinkOptions { PropagateCompletion = false }); _laneBlocks.Clear(); foreach (FlowDevice device in _devices) { foreach (var relation in device.FlowDevice_FlowChannels) { foreach (Lane lane in relation.Channel.Lanes) { LaneFlowStatisticsBlock laneBlock = new LaneFlowStatisticsBlock(_serviceProvider); laneBlock.LinkTo(_oneBatchBlock, _fiveBatchBlock, _fifteenBatchBlock, _sixtyBatchBlock); LaneItem laneItem = new LaneItem { LaneBlock = laneBlock, Length = lane.Length, RoadSection = relation.Channel.SectionId.HasValue ? relation.Channel.RoadSection : null }; _laneBlocks.TryAdd(lane.DataId, laneItem); } } } }
public void Split() { HeldItem upHeldItem = new HeldItem(new ConveyorItem(lane.stage.conveyor, Definitions.Item(Definitions.Items.Part), heldItem.conveyorItem.settings)); LaneItem upItem = new LaneItem(upHeldItem, lane); upHeldItem.conveyorItem.Destroy(); upHeldItem.Destroy(); lane.Add(upItem); upItem.SetPosition(new Vector3(position.x, upItem.position.y, upItem.position.z)); upItem.changeLane = upItem.ChangeLane(-1); HeldItem downHeldItem = new HeldItem(new ConveyorItem(lane.stage.conveyor, Definitions.Item(Definitions.Items.Part), heldItem.conveyorItem.settings)); LaneItem downItem = new LaneItem(downHeldItem, lane); downHeldItem.conveyorItem.Destroy(); downHeldItem.Destroy(); lane.Add(downItem); downItem.SetPosition(new Vector3(position.x, downItem.position.y, downItem.position.z)); downItem.changeLane = downItem.ChangeLane(1); }
public void Interaction <T>(T laneObject) where T : LaneObject { if (laneObject is LaneItem) { LaneItem laneItem = laneObject as LaneItem; bool destroy = true; for (int i = 0; laneItem.effects.Count > i; i++) { switch (laneItem.effects[i]) { case Definitions.Effects.Damage: Damage(laneItem.damage); break; case Definitions.Effects.LaneDown: changeLane = ChangeLane(laneItem.heldItem.conveyorItem.level + 1); break; case Definitions.Effects.LaneUp: changeLane = ChangeLane(-laneItem.heldItem.conveyorItem.level - 1); break; case Definitions.Effects.Leap: laneItem.LeapEntity(this); destroy = false; break; case Definitions.Effects.PushBack: pushBack = PushBack(); break; case Definitions.Effects.Split: laneItem.Split(); break; } } if (destroy) { laneItem.Destroy(); } } else { LaneEntity laneEntity = laneObject as LaneEntity; LaneEntity front = position.x > laneEntity.position.x ? this : laneEntity; LaneEntity back = front == this ? laneEntity : this; if (front is Enemy) { if ((back.scale.z * 0.5f > Mathf.Abs(front.position.z - back.position.z)) && (front.Contains(back.frontPoint) || front.Contains(back.frontPoint + (Vector3.forward * back.scale.z * 0.5f)) || front.Contains(back.frontPoint + (Vector3.back * back.scale.z * 0.5f)))) { if (front.pushBack != null) { back.position = new Vector3(front.back - (back.scale.x * 0.6f), back.position.y, back.position.z); back.pushBack = back.PushBack(); back.Damage(); } else { back.position = new Vector3(front.back - (back.scale.x * 0.5f), back.position.y, back.position.z); } } else { bool up = position.z > laneEntity.position.z; position = new Vector3(position.x, position.y, up ? laneEntity.top + scale.z + (laneEntity.scale.z * 0.125f) : laneEntity.bottom - scale.z - (laneEntity.scale.z * 0.125f)); changeLane = ChangeLane(up ? -1 : 1); Damage(); } } else if (front is Hero) { if (back.melee == null && (back.scale.z * 0.5f > Mathf.Abs(front.position.z - back.position.z)) && (front.Contains(back.frontPoint) || front.Contains(back.frontPoint + (Vector3.forward * back.scale.z * 0.5f)) || front.Contains(back.frontPoint + (Vector3.back * back.scale.z * 0.5f)))) { back.position = new Vector3(front.back - (front.scale.x * 0.6f), back.position.y, back.position.z); back.melee = back.Melee(front); //back.pushBack = back.PushBack(); //back.Damage(); } else if (back.melee == null) { bool up = position.z > laneEntity.position.z; position = new Vector3(position.x, position.y, up ? laneEntity.top + scale.z + (laneEntity.scale.z * 0.125f) : laneEntity.bottom - scale.z - (laneEntity.scale.z * 0.125f)); changeLane = ChangeLane(up ? -1 : 1); Damage(); } } } }