Example #1
0
        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();
        }
Example #2
0
        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}");
            }
        }
Example #3
0
        private void lvLanes_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            currentLane = lvLanes.SelectedItem as LaneItem;

            RefreshLaneAttendances();
            RefreshLanePayments();

            RefreshUI();
        }
Example #4
0
        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}");
                        }
                    }
                }
            }
        }
Example #5
0
        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);
                    }
                }
            }
        }
Example #6
0
    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);
    }
Example #7
0
    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();
                }
            }
        }
    }