/// <summary>
 /// Добавляет рабочую зону в коллекцию.
 /// </summary>
 /// <param name="robotWorkspace">Рабочая зона</param>
 public void Add(RobotWorkspace robotWorkspace)
 {
     if (!robotWorkspaces.Contains(robotWorkspace))
     {
         robotWorkspaces.Add(robotWorkspace);
     }
 }
        /// <summary>
        /// Возвращает коллекцию положений плеч, которых необходимо достичь плечу чтобы оказаться
        /// в нулевой точке рабочей зоны <paramref name="workspace"/>.
        /// </summary>
        /// <param name="workspace">Рабочая зона</param>
        /// <returns>Коллекция положений плеч, которых необходимо достичь плечу чтобы оказаться в нулевой точке рабочей зоны</returns>
        public IEnumerable <LeverPosition> GetLeverPositionsToWorkspaceZero(RobotWorkspace workspace)
        {
            if (workspace.HorizontalLever.ABzero == null)
            {
                throw new DesignParametersException(LeverType.Horizontal.ToRuString() + ": не задана нулевая точка. Перемещение невозможно");
            }
            else
            {
                yield return(new LeverPosition(LeverType.Horizontal, (double)workspace.HorizontalLever.ABzero));
            }

            if (workspace.Lever1.ABzero == null)
            {
                throw new DesignParametersException(LeverType.Lever1.ToRuString() + ": не задана нулевая точка. Перемещение невозможно");
            }
            else
            {
                yield return(new LeverPosition(LeverType.Lever1, (double)workspace.Lever1.ABzero));
            }

            if (workspace.Lever2.ABzero == null)
            {
                throw new DesignParametersException(LeverType.Lever2.ToRuString() + ": не задана нулевая точка. Перемещение невозможно");
            }
            else
            {
                yield return(new LeverPosition(LeverType.Lever2, (double)workspace.Lever2.ABzero));
            }
        }
        /// <summary>
        /// Возвращает истину, если текущее положение плеч робота-манипулятора соответствует рабочей зоне <paramref name="workspace"/>.
        /// </summary>
        /// <param name="workspace">Рабочая зона</param>
        /// <returns>Истина, если текущее положение плеч робота-манипулятора соответствует рабочей зоне</returns>
        public bool IsRobotInWorkspace(RobotWorkspace workspace)
        {
            var horizontal = workspace.HorizontalLever.IsBetweenMinAndMax(parameters.HorizontalLever.AB);
            var lever1     = workspace.Lever1.IsBetweenMinAndMax(parameters.Lever1.AB);
            var lever2     = workspace.Lever2.IsBetweenMinAndMax(parameters.Lever2.AB);

            return(horizontal && lever1 && lever2);
        }
Exemple #4
0
        /// <summary>
        /// Создает новый объект, являющийся копией текущего экземпляра.
        /// </summary>
        /// <returns>Новый объект, являющийся копией текущего экземпляра.</returns>
        public object Clone()
        {
            var workspace = new RobotWorkspace(this.Name);

            workspace.HorizontalLever = this.HorizontalLever.Clone() as IWorkspace;
            workspace.Lever1          = this.Lever1.Clone() as IWorkspace;
            workspace.Lever2          = this.Lever2.Clone() as IWorkspace;

            return(workspace);
        }
        /// <summary>
        /// Возвращает коллекцию положений плеч, которых необходимо достичь плечу чтобы оказаться
        /// в пределах рабочей зоны <paramref name="workspace"/>.
        /// </summary>
        /// <param name="workspace">Рабочая зона</param>
        /// <returns>Коллекция положений плеч, которых необходимо достичь плечу чтобы оказаться в пределах рабочей зоны</returns>
        public IEnumerable <LeverPosition> GetLeversPositionToWorkspaceRange(RobotWorkspace workspace)
        {
            if (!workspace.HorizontalLever.IsBetweenMinAndMax(parameters.HorizontalLever.AB))
            {
                yield return(new LeverPosition(LeverType.Horizontal, GetNearestPositionInWorkspace(workspace.HorizontalLever, parameters.HorizontalLever.AB)));
            }

            if (!workspace.Lever1.IsBetweenMinAndMax(parameters.Lever1.AB))
            {
                yield return(new LeverPosition(LeverType.Lever1, GetNearestPositionInWorkspace(workspace.Lever1, parameters.Lever1.AB)));
            }

            if (!workspace.Lever2.IsBetweenMinAndMax(parameters.Lever2.AB))
            {
                yield return(new LeverPosition(LeverType.Lever2, GetNearestPositionInWorkspace(workspace.Lever2, parameters.Lever2.AB)));
            }
        }
        /// <summary>
        /// Возвращает тип плеч, которые не расположены в пределах рабочей зоны <paramref name="workspace"/>.
        /// </summary>
        /// <param name="workspace">Рабочая зона</param>
        /// <returns>Коллекция типов плеч, которые не расположены в рабочей зоне</returns>
        public IEnumerable <LeverType> GetLeversOutOfWorkspaceRange(RobotWorkspace workspace)
        {
            if (!workspace.HorizontalLever.IsBetweenMinAndMax(parameters.HorizontalLever.AB))
            {
                yield return(LeverType.Horizontal);
            }

            if (!workspace.Lever1.IsBetweenMinAndMax(parameters.Lever1.AB))
            {
                yield return(LeverType.Lever1);
            }

            if (!workspace.Lever2.IsBetweenMinAndMax(parameters.Lever2.AB))
            {
                yield return(LeverType.Lever2);
            }
        }
        // Устанавливает заданную рабочую зону в качестве активной рабочей зоны.
        private void SetActiveWorkspace(RobotWorkspace workspace)
        {
            var outOfRange = GetLeversOutOfWorkspaceRange(workspace).Select(lever => lever.ToRuString());

            if (outOfRange.Count() != 0)
            {
                throw new ArgumentException("Текущее положение плеч робота находится вне рабочей зоны. " +
                                            "Необходимо переместить следующие механизмы робота:\n" + string.Join("\n", outOfRange).Trim());
            }

            if (!robotWorkspaces.Contains(workspace))
            {
                robotWorkspaces.Add(workspace);
            }

            parameters.Lever1.Workspace          = workspace.Lever1;
            parameters.Lever2.Workspace          = workspace.Lever2;
            parameters.HorizontalLever.Workspace = workspace.HorizontalLever;

            activeWorkspace = workspace;

            OnActiveWorkspaceChanged(this, EventArgs.Empty);
        }
 /// <summary>
 /// Устанавливает в качестве рабочей зоны конструктивные параметры робота.
 /// </summary>
 public void SetDefaultWorkspace()
 {
     RemoveWorkspacesFromDesignParameters(this.parameters);
     this.activeWorkspace = null;
 }
 /// <summary>
 /// Устанавливает рабочую зону <paramref name="workspace"/> на индекс <paramref name="index"/>.
 /// </summary>
 public void SetWorkspace(int index, RobotWorkspace workspace)
 {
     robotWorkspaces[index] = workspace;
 }
 /// <summary>
 /// Удаляет рабочую зону из коллекции.
 /// </summary>
 /// <param name="workspace">Рабочая зона</param>
 public void Remove(RobotWorkspace workspace)
 {
     Remove(robotWorkspaces.IndexOf(workspace));
 }