/// <summary> /// Execute RepRap G92 command. /// </summary> /// <param name="repRapLine"></param> public void ProcessG92Command(string[] repRapLine) { //Read through the GCode line and parse coordinate values. for (int phrase = 1; phrase < repRapLine.Length; phrase++) { switch (repRapLine[phrase][0]) { case 'X': _parametersModel.XCoord.NewCoord(GCodeStringParsing.ParseDouble(repRapLine[phrase])); break; case 'Y': _parametersModel.YCoord.NewCoord(GCodeStringParsing.ParseDouble(repRapLine[phrase])); break; case 'Z': _parametersModel.ZCoord.NewCoord(GCodeStringParsing.ParseDouble(repRapLine[phrase])); break; case 'E': _parametersModel.ERepRapCoord.NewCoord(GCodeStringParsing.ParseDouble(repRapLine[phrase])); break; } } }
/// <summary> /// Reads the coordinate values in a movement or print command. /// </summary> /// <param name="convertedGCodeLine"></param> /// <param name="gCodeIndex"></param> /// <param name="materialModel"></param> /// <returns></returns> private MovementModel ReadCoord(string convertedGCodeLine, int gCodeIndex, MaterialModel materialModel) { //G Commands from Converted GCode are in relative positions. string[] gCodePhrases = GCodeStringParsing.GCodeTo2DArr(convertedGCodeLine)[0]; double xDistance = 0; double yDistance = 0; double zDistance = 0; double eDistance = 0; //Read the coordinates from the GCode. for (int phrase = 1; phrase < gCodePhrases.Length; phrase++) { switch (gCodePhrases[phrase][0]) { case 'X': int xSteps = (int)GCodeStringParsing.ParseDouble(gCodePhrases[phrase]); AxisModel xAxisModel = _printerModel.AxisModelList[0]; xDistance = G00Calculator.StepsToDistance(xSteps, xAxisModel.MmPerStep, xAxisModel.IsDirectionInverted); break; case 'Y': int ySteps = (int)GCodeStringParsing.ParseDouble(gCodePhrases[phrase]); AxisModel yAxisModel = _printerModel.AxisModelList[1]; yDistance = G00Calculator.StepsToDistance(ySteps, yAxisModel.MmPerStep, yAxisModel.IsDirectionInverted); break; case 'Z': int zSteps = (int)GCodeStringParsing.ParseDouble(gCodePhrases[phrase]); AxisModel zAxisModel = _printerModel.FindAxis(materialModel.PrintheadModel.AttachedZAxisModel.Name); zDistance = G00Calculator.StepsToDistance(zSteps, zAxisModel.MmPerStep, zAxisModel.IsDirectionInverted); break; case 'E': int eSteps = (int)GCodeStringParsing.ParseDouble(gCodePhrases[phrase]); MotorizedPrintheadTypeModel motorizedPrintheadTypeModel = (MotorizedPrintheadTypeModel)materialModel.PrintheadModel.PrintheadTypeModel; eDistance = G00Calculator.StepsToDistance(eSteps, motorizedPrintheadTypeModel.MmPerStep, motorizedPrintheadTypeModel.IsDirectionInverted); break; default: //Do nothing. break; } } MovementModel movementModel = new MovementModel(xDistance, yDistance, zDistance, eDistance, gCodeIndex, materialModel, _printerModel); return(movementModel); }
/// <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); }