/// <summary>
        /// Выполняет шаги в обратном порядке для перемещения к заданной точке из траектории.
        /// </summary>
        /// <param name="scriptPosition">Точка в траектории движения к которой необходимо вернуться</param>
        public void BackTo(LeverScriptPosition scriptPosition)
        {
            if (!leverPositions.Contains(scriptPosition))
            {
                throw new ArgumentException("Не найдена заданная точка");
            }

            var startIndex = Path.IndexOf(scriptPosition);
            var count      = Path.Count - startIndex;

            if (count == 0)
            {
                return;
            }

            var movePositions = new List <LeverPosition>();

            for (int i = startIndex; i < Path.Count; i++)
            {
                var pos = leverPositions[i];
                movePositions.Add(new LeverPosition(pos.LeverType, pos.From));
            }

            movePositions.Reverse();

            leverPositions.RemoveRange(startIndex, count);

            IsMoving = true;

            movement.MoveRobotByPath(movePositions, new Action(Continue));
        }
     private void Movement_OnMovingStart(object sender, StepLever e)
     {
         if (!IsMoving)
         {
             scriptPosition = new LeverScriptPosition(e.Lever)
             {
                 From = movement.GetLeverPosition(e.Lever)
             }
         }
         ;
     }
 }
        private void Movement_OnMovingEnd(object sender, StepLever e)
        {
            if (IsMoving)
            {
                return;
            }

            if (scriptPosition.LeverType != e.Lever)
            {
                throw new Exception("Ошибка создания сценария");
            }

            scriptPosition.To = movement.GetLeverPosition(e.Lever);
            leverPositions.Add(scriptPosition);

            OnPathChanged(this, EventArgs.Empty);

            scriptPosition = null;
        }
        /// <summary>
        /// Выполняет шаги в прямом порядке для перемещения к заданной точке из траектории.
        /// </summary>
        /// <param name="scriptPosition">Точка в траектории движения к которой необходимо переместиться</param>
        public void MoveTo(LeverScriptPosition scriptPosition)
        {
            var currentPosition = movement.GetCurrentLeversPosition().OrderBy(i => i.LeverType);

            if (!StartPoint.OrderBy(i => i.LeverType).SequenceEqual(currentPosition))
            {
                throw new Exception("Необходимо переместить робот в начальное положение");
            }

            var startIndex = Path.IndexOf(scriptPosition);

            var movePositions = new List <LeverPosition>();

            for (int i = 0; i < startIndex + 1; i++)
            {
                var pos = leverPositions[i];
                movePositions.Add(new LeverPosition(pos.LeverType, pos.To));
            }

            IsMoving = true;

            movement.MoveRobotByPath(movePositions, new Action(Continue));
        }
Example #5
0
        private IEnumerable <LeverPosition> GetLeverPositions(LeverScriptPosition leverScriptPosition)
        {
            yield return(new LeverPosition(leverScriptPosition.LeverType, leverScriptPosition.From));

            yield return(new LeverPosition(leverScriptPosition.LeverType, leverScriptPosition.To));
        }