fix: draw approach rapid directly to first pierce point, not part origin
The approach rapid from sheet origin was drawing to part.Location (the program coordinate origin) then a second rapid to the actual first pierce point. This created a dog-leg through the part origin instead of a single straight rapid to the lead-in. Also fixed PlateProcessor using the original program's start point instead of the processed one when the cutting strategy is applied on-the-fly. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -44,7 +44,7 @@ namespace OpenNest.Engine
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Pierce point: program start point in plate space
|
// Pierce point: program start point in plate space
|
||||||
var pierceLocal = GetProgramStartPoint(part.Program);
|
var pierceLocal = GetProgramStartPoint(processedProgram);
|
||||||
var piercePoint = ToPlateSpace(pierceLocal, part);
|
var piercePoint = ToPlateSpace(pierceLocal, part);
|
||||||
|
|
||||||
// Plan rapid from currentPoint to pierce point
|
// Plan rapid from currentPoint to pierce point
|
||||||
|
|||||||
@@ -826,14 +826,35 @@ namespace OpenNest.Controls
|
|||||||
var part = Plate.Parts[i];
|
var part = Plate.Parts[i];
|
||||||
var pgm = part.Program;
|
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;
|
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)
|
for (int i = 0; i < pgm.Length; ++i)
|
||||||
{
|
{
|
||||||
var code = pgm[i];
|
var code = pgm[i];
|
||||||
@@ -857,13 +878,23 @@ namespace OpenNest.Controls
|
|||||||
var endpt = motion.EndPoint + pos;
|
var endpt = motion.EndPoint + pos;
|
||||||
|
|
||||||
if (code.Type == CodeType.RapidMove)
|
if (code.Type == CodeType.RapidMove)
|
||||||
|
{
|
||||||
|
if (skipFirstRapid && !firstRapidSkipped)
|
||||||
|
firstRapidSkipped = true;
|
||||||
|
else
|
||||||
DrawLine(g, pos, endpt, ColorScheme.RapidPen);
|
DrawLine(g, pos, endpt, ColorScheme.RapidPen);
|
||||||
|
}
|
||||||
pos = endpt;
|
pos = endpt;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (code.Type == CodeType.RapidMove)
|
if (code.Type == CodeType.RapidMove)
|
||||||
|
{
|
||||||
|
if (skipFirstRapid && !firstRapidSkipped)
|
||||||
|
firstRapidSkipped = true;
|
||||||
|
else
|
||||||
DrawLine(g, pos, motion.EndPoint, ColorScheme.RapidPen);
|
DrawLine(g, pos, motion.EndPoint, ColorScheme.RapidPen);
|
||||||
|
}
|
||||||
pos = motion.EndPoint;
|
pos = motion.EndPoint;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user