コード例 #1
0
        /// <summary>
        /// Record the parameters from a Set Axis command.
        /// </summary>
        /// <param name="axisName"></param>
        /// <param name="maxSpeed"></param>
        /// <param name="acceleration"></param>
        public void RecordSetAxis(char axisID, string axisName, double maxSpeed, double acceleration)
        {
            AxisModel axisModel = _printerModel.FindAxis(axisName);
            double    mmPerStep = axisModel.MmPerStep;

            //Max speed is read as steps / s and acceleration is read as steps / s2.
            //These parameters are converted to this program's convention of mm / s and mm / s2.
            double convertedMaxSpeed     = maxSpeed * mmPerStep;
            double convertedAcceleration = acceleration * mmPerStep;

            //Record new data.
            switch (axisID)
            {
            case 'X':
                _xRealTimeStatusAxisModel = new RealTimeStatusAxisModel(axisName, _xRealTimeStatusAxisModel.Position, convertedMaxSpeed, convertedAcceleration);
                break;

            case 'Y':
                _yRealTimeStatusAxisModel = new RealTimeStatusAxisModel(axisName, _yRealTimeStatusAxisModel.Position, convertedMaxSpeed, convertedAcceleration);
                break;

            case 'Z':
                //If the Z Axis does not need to be changed, then keep the same position. Otherwise, create new positions assuming the Z actuator was retracted before becoming active.
                double zPosition = (axisName == _zRealTimeStatusAxisModel.Name) ? _zRealTimeStatusAxisModel.Position : _printerModel.FindAxis(axisName).MaxPosition - GlobalValues.LimitBuffer - _printerModel.FindAxis(axisName).MinPosition;
                _zRealTimeStatusAxisModel = new RealTimeStatusAxisModel(axisName, zPosition, convertedMaxSpeed, convertedAcceleration);
                break;

            default:
                //Should never reach this point.
                break;
            }

            //Notify other classes.
            OnRecordSetAxisExecuted(axisName);
        }
コード例 #2
0
        /// <summary>
        /// Set initial values for all data.
        /// </summary>
        private void InitializeRealTimeStatusDataModel()
        {
            _xRealTimeStatusAxisModel = new RealTimeStatusAxisModel("Unset", 0, 0, 0);
            _yRealTimeStatusAxisModel = new RealTimeStatusAxisModel("Unset", 0, 0, 0);
            _zRealTimeStatusAxisModel = new RealTimeStatusAxisModel("Unset", 0, 0, 0);

            _activePrintheadType  = PrintheadType.Unset;
            _activePrintheadModel = new RealTimeStatusUnsetPrintheadModel("Unset");
        }
        /// <summary>
        /// Sets the minimum and/or maximum position of actuator-based equipment as its current position.
        /// </summary>
        /// <param name="commandSet"></param>
        /// <returns></returns>
        private List <string> InterpretSetMinMaxPosition(string commandSet)
        {
            //Remove "*SetMinMaxPos" from the beginning of the command set.
            commandSet = commandSet.Substring(12);

            for (int index = 0; index < commandSet.Length; index++)
            {
                switch (commandSet[index])
                {
                case 'E':
                    if (_realTimeStatusDataModel.ActivePrintheadType == PrintheadType.Motorized)
                    {
                        //Set the current position as the parameter value.
                        RealTimeStatusMotorizedPrintheadModel realTimeStatusMotorizedPrintheadModel = (RealTimeStatusMotorizedPrintheadModel)_realTimeStatusDataModel.ActivePrintheadModel;
                        MotorizedPrintheadTypeModel           motorizedPrintheadTypeModel           = (MotorizedPrintheadTypeModel)_printerModel.FindPrinthead(_realTimeStatusDataModel.ActivePrintheadModel.Name).PrintheadTypeModel;
                        double ePreviousPosition = realTimeStatusMotorizedPrintheadModel.Position;
                        realTimeStatusMotorizedPrintheadModel.Position = ParseDouble(commandSet.Substring(index));
                        double ePositionDifference = realTimeStatusMotorizedPrintheadModel.Position - ePreviousPosition;

                        //Set the Min or Max Position property as the parameter value.
                        //Adjust the Min and Max positions such that the distance between Max and Min Position remains the same.
                        switch (commandSet[index + 1])
                        {
                        case 'N':
                            motorizedPrintheadTypeModel.MinPosition  = realTimeStatusMotorizedPrintheadModel.Position;
                            motorizedPrintheadTypeModel.MaxPosition += ePositionDifference;
                            break;

                        case 'M':
                            motorizedPrintheadTypeModel.MaxPosition  = realTimeStatusMotorizedPrintheadModel.Position;
                            motorizedPrintheadTypeModel.MinPosition += ePositionDifference;
                            break;

                        default:
                            //Set position value only.
                            //Do nothing here.
                            break;
                        }
                    }
                    break;

                case 'X':
                    //Set the current position as the parameter value.
                    RealTimeStatusAxisModel xRealTimeStatusAxisModel = _realTimeStatusDataModel.XRealTimeStatusAxisModel;
                    AxisModel xAxisModel        = _printerModel.AxisModelList[0];
                    double    xPreviousPosition = xRealTimeStatusAxisModel.Position;
                    xRealTimeStatusAxisModel.Position = ParseDouble(commandSet.Substring(index));
                    double xPositionDifference = xRealTimeStatusAxisModel.Position - xPreviousPosition;

                    //Set the Min or Max Position property as the parameter value.
                    //Adjust the Min and Max positions such that the distance between Max and Min Position remains the same.
                    switch (commandSet[index + 1])
                    {
                    case 'N':
                        xAxisModel.MinPosition  = xRealTimeStatusAxisModel.Position;
                        xAxisModel.MaxPosition += xPositionDifference;
                        break;

                    case 'M':
                        xAxisModel.MaxPosition  = xRealTimeStatusAxisModel.Position;
                        xAxisModel.MinPosition += xPositionDifference;
                        break;

                    default:
                        //Set position value only.
                        //Do nothing here.
                        break;
                    }
                    break;

                case 'Y':
                    //Set the current position as the parameter value.
                    RealTimeStatusAxisModel yRealTimeStatusAxisModel = _realTimeStatusDataModel.YRealTimeStatusAxisModel;
                    AxisModel yAxisModel        = _printerModel.AxisModelList[1];
                    double    yPreviousPosition = yRealTimeStatusAxisModel.Position;
                    yRealTimeStatusAxisModel.Position = ParseDouble(commandSet.Substring(index));
                    double yPositionDifference = yRealTimeStatusAxisModel.Position - yPreviousPosition;

                    //Set the Min or Max Position property as the parameter value.
                    //Adjust the Min and Max positions such that the distance between Max and Min Position remains the same.
                    switch (commandSet[index + 1])
                    {
                    case 'N':
                        yAxisModel.MinPosition  = yRealTimeStatusAxisModel.Position;
                        yAxisModel.MaxPosition += yPositionDifference;
                        break;

                    case 'M':
                        yAxisModel.MaxPosition  = yRealTimeStatusAxisModel.Position;
                        yAxisModel.MinPosition += yPositionDifference;
                        break;

                    default:
                        //Set position value only.
                        //Do nothing here.
                        break;
                    }
                    break;

                case 'Z':
                    //Set the current position as the parameter value.
                    RealTimeStatusAxisModel zRealTimeStatusAxisModel = _realTimeStatusDataModel.ZRealTimeStatusAxisModel;
                    AxisModel zAxisModel        = _printerModel.FindAxis(zRealTimeStatusAxisModel.Name);
                    double    zPreviousPosition = zRealTimeStatusAxisModel.Position;
                    zRealTimeStatusAxisModel.Position = ParseDouble(commandSet.Substring(index));
                    double zPositionDifference = zRealTimeStatusAxisModel.Position - zPreviousPosition;

                    //Set the Min or Max Position property as the parameter value.
                    //Adjust the Min and Max positions such that the distance between Max and Min Position remains the same.
                    switch (commandSet[index + 1])
                    {
                    case 'N':
                        zAxisModel.MinPosition  = zRealTimeStatusAxisModel.Position;
                        zAxisModel.MaxPosition += zPositionDifference;
                        break;

                    case 'M':
                        zAxisModel.MaxPosition  = zRealTimeStatusAxisModel.Position;
                        zAxisModel.MinPosition += zPositionDifference;
                        break;

                    default:
                        //Set position value only.
                        //Do nothing here.
                        break;
                    }

                    break;
                }
            }

            OnCommandSetPositionChanged();
            OnCommandSetMinMaxPositionChanged();

            //No commands to return.
            return(null);
        }
        /// <summary>
        /// Interpret a center axes command set and return an array of commands.
        /// </summary>
        /// <param name="commandSet"></param>
        /// <returns></returns>
        private List <string> InterpretCenterAxes(string commandSet)
        {
            //Command set to be returned.
            List <string> returnCommands = new List <string>();

            AxisModel xAxisModel = _printerModel.AxisModelList[0];
            AxisModel yAxisModel = _printerModel.AxisModelList[1];
            RealTimeStatusAxisModel xRealTimeStatusAxisModel = _realTimeStatusDataModel.XRealTimeStatusAxisModel;
            RealTimeStatusAxisModel yRealTimeStatusAxisModel = _realTimeStatusDataModel.YRealTimeStatusAxisModel;
            double xNewPosition = xRealTimeStatusAxisModel.Position;
            double yNewPosition = yRealTimeStatusAxisModel.Position;

            //mmPerStep for each actuator.
            double xmmPerStep = 0;
            double ymmPerStep = 0;

            //InvertDirection for each actuator.
            bool xInvertDirection = (xAxisModel.IsDirectionInverted == false) ? false : true;
            bool yInvertDirection = (yAxisModel.IsDirectionInverted == false) ? false : true;

            //Distances from the center.
            double xDistanceFromCenter = 0;
            double yDistanceFromCenter = 0;

            string[] gCodePhrases = GCodeStringParsing.GCodeTo2DArr(commandSet)[0];
            foreach (string phrase in gCodePhrases)
            {
                switch (phrase[0])
                {
                case 'X':
                    xDistanceFromCenter = GCodeStringParsing.ParseDouble(phrase);
                    break;

                case 'Y':
                    yDistanceFromCenter = GCodeStringParsing.ParseDouble(phrase);
                    break;

                default:
                    //Do nothing.
                    break;
                }
            }

            //Centering the actuator involves:
            // 1. Finding the median position directly in the center of the max and min position.
            // 2. Finding the distance between median position and the current position.
            // 3. Executing that difference worth of movement.

            if (commandSet.Contains("X"))
            {
                xNewPosition = (xAxisModel.MaxPosition - xAxisModel.MinPosition) / 2 + xAxisModel.MinPosition + xDistanceFromCenter;
                xmmPerStep   = xAxisModel.MmPerStep;
            }

            if (commandSet.Contains("Y"))
            {
                yNewPosition = (yAxisModel.MaxPosition - yAxisModel.MinPosition) / 2 + yAxisModel.MinPosition + yDistanceFromCenter;
                ymmPerStep   = yAxisModel.MmPerStep;
            }

            double unused = 0;

            returnCommands.Add(GCodeLinesConverter.GCodeLinesListToString(
                                   WriteG00.WriteAxesMovement(
                                       xmmPerStep, ymmPerStep, 0,
                                       xNewPosition - xRealTimeStatusAxisModel.Position, yNewPosition - yRealTimeStatusAxisModel.Position, 0,
                                       xInvertDirection, yInvertDirection, false,
                                       ref unused, ref unused, ref unused)));

            return(returnCommands);
        }
コード例 #5
0
        public RealTimeStatusAxisViewModel(RealTimeStatusAxisModel RealTimeStatusAxisModel)
        {
            _realTimeStatusAxisModel = RealTimeStatusAxisModel;

            UpdateProperties();
        }