internal static Position FromCommand(GCode code, Position current) { if (code.Command != GCodeCommand.G1) { throw new ApplicationException("Only valid for G1 commands"); } Position newPos = (Position)current.Clone(); foreach (GCodeParameter parm in code.Parameters) { switch (parm.Type) { case GCodeParameterType.X: newPos.X = Convert.ToDouble(parm.Value); break; case GCodeParameterType.Y: newPos.Y = Convert.ToDouble(parm.Value); break; case GCodeParameterType.Z: newPos.Z = Convert.ToDouble(parm.Value); break; case GCodeParameterType.E: newPos.E = Convert.ToDouble(parm.Value); break; default: throw new ApplicationException("Unexpected parameter"); } } return(newPos); }
internal void Translate(GCode code) { switch (code.Command) { case GCodeCommand.G1: DeltaProcessG1(code); break; case GCodeCommand.G28: current.X = current.Y = current.Z = 0; break; default: return; } }
private List <GCode> DeltaProcessG1(GCode code) { Position destination = (Position)current.Clone(); foreach (GCodeParameter parm in code.Parameters) { switch (parm.Type) { case GCodeParameterType.F: feedrate = Convert.ToDouble(parm.Value); break; case GCodeParameterType.X: destination.X = Convert.ToDouble(parm.Value); break; case GCodeParameterType.Y: destination.X = Convert.ToDouble(parm.Value); break; case GCodeParameterType.Z: destination.X = Convert.ToDouble(parm.Value); break; case GCodeParameterType.E: destination.E = Convert.ToDouble(parm.Value); break; default: throw new ApplicationException("Unknown parameter in G1"); } } double precision = Math.Pow(0.05, 2); //mm squared // double precision = 0.001; //mm deltaCalculations = 0; List <Position> candidate = PartitionInSegments(current, destination, precision, 1); int candidateCalcs = deltaCalculations; deltaCalculations = 0; List <Position> johann = JohannPartitionInSegments(current, destination); CandidateDeltaSurplus += candidateCalcs - deltaCalculations; JohanTotalSteps += johann.Count; CandidateTotalSteps += candidate.Count; double maxdist = TestPartitionAccuracy(candidate); if (maxdist > MaxCandidateError) { MaxCandidateError = maxdist; } maxdist = TestPartitionAccuracy(johann); if (maxdist > MaxJohannError) { MaxJohannError = maxdist; } current = destination; return(null); }