diff --git a/OpenNest.Engine/PlateProcessor.cs b/OpenNest.Engine/PlateProcessor.cs index 99391b8..b408f19 100644 --- a/OpenNest.Engine/PlateProcessor.cs +++ b/OpenNest.Engine/PlateProcessor.cs @@ -44,7 +44,7 @@ namespace OpenNest.Engine } // Pierce point: program start point in plate space - var pierceLocal = GetProgramStartPoint(part.Program); + var pierceLocal = GetProgramStartPoint(processedProgram); var piercePoint = ToPlateSpace(pierceLocal, part); // Plan rapid from currentPoint to pierce point diff --git a/OpenNest/Controls/PlateView.cs b/OpenNest/Controls/PlateView.cs index 7cb876a..28c2317 100644 --- a/OpenNest/Controls/PlateView.cs +++ b/OpenNest/Controls/PlateView.cs @@ -826,14 +826,35 @@ namespace OpenNest.Controls var part = Plate.Parts[i]; var pgm = part.Program; - DrawLine(g, pos, part.Location, ColorScheme.RapidPen); + // Draw approach rapid directly to the program's first pierce + // point instead of to part.Location (the coordinate origin), + // which may not be at a cutting feature. + var piercePoint = GetFirstPiercePoint(pgm, part.Location); + DrawLine(g, pos, piercePoint, ColorScheme.RapidPen); + pos = part.Location; - DrawRapids(g, pgm, ref pos); + DrawRapids(g, pgm, ref pos, skipFirstRapid: true); } } - private void DrawRapids(Graphics g, Program pgm, ref Vector pos) + private static Vector GetFirstPiercePoint(Program pgm, Vector partLocation) { + for (var i = 0; i < pgm.Length; i++) + { + if (pgm[i] is Motion motion) + { + if (pgm.Mode == Mode.Incremental) + return motion.EndPoint + partLocation; + return motion.EndPoint; + } + } + return partLocation; + } + + private void DrawRapids(Graphics g, Program pgm, ref Vector pos, bool skipFirstRapid = false) + { + var firstRapidSkipped = false; + for (int i = 0; i < pgm.Length; ++i) { var code = pgm[i]; @@ -857,13 +878,23 @@ namespace OpenNest.Controls var endpt = motion.EndPoint + pos; if (code.Type == CodeType.RapidMove) - DrawLine(g, pos, endpt, ColorScheme.RapidPen); + { + if (skipFirstRapid && !firstRapidSkipped) + firstRapidSkipped = true; + else + DrawLine(g, pos, endpt, ColorScheme.RapidPen); + } pos = endpt; } else { if (code.Type == CodeType.RapidMove) - DrawLine(g, pos, motion.EndPoint, ColorScheme.RapidPen); + { + if (skipFirstRapid && !firstRapidSkipped) + firstRapidSkipped = true; + else + DrawLine(g, pos, motion.EndPoint, ColorScheme.RapidPen); + } pos = motion.EndPoint; } }