fix: apply SubProgramCall offset additively and restore curpos after expansion
ConvertMode.ToIncremental skips SubProgramCalls when computing deltas, so all code paths that expand SubProgramCalls must: (1) set curpos to savedPos + Offset before expanding, and (2) restore curpos afterward so subsequent incremental codes get correct deltas. Fixed in ConvertProgram, GraphicsHelper (AddProgram, AddProgramSplit), PlateRenderer (DrawRapids, DrawProgramPiercePoints, GetFirstPiercePoint), and CutDirectionArrows. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -18,7 +18,12 @@ namespace OpenNest.Controls
|
||||
{
|
||||
var subpgm = (SubProgramCall)code;
|
||||
if (subpgm.Program != null)
|
||||
{
|
||||
var savedPos = pos;
|
||||
pos = new Vector(savedPos.X + subpgm.Offset.X, savedPos.Y + subpgm.Offset.Y);
|
||||
DrawProgram(g, view, subpgm.Program, ref pos, pen, spacing, arrowSize);
|
||||
pos = savedPos;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -404,6 +404,9 @@ namespace OpenNest.Controls
|
||||
{
|
||||
for (var i = 0; i < pgm.Length; i++)
|
||||
{
|
||||
if (pgm[i] is SubProgramCall call && call.Program != null)
|
||||
return GetFirstPiercePoint(call.Program, partLocation + call.Offset);
|
||||
|
||||
if (pgm[i] is Motion motion)
|
||||
{
|
||||
if (pgm.Mode == Mode.Incremental)
|
||||
@@ -428,7 +431,12 @@ namespace OpenNest.Controls
|
||||
var program = subpgm.Program;
|
||||
|
||||
if (program != null)
|
||||
{
|
||||
var savedPos = pos;
|
||||
pos = new Vector(savedPos.X + subpgm.Offset.X, savedPos.Y + subpgm.Offset.Y);
|
||||
DrawRapids(g, program, ref pos);
|
||||
pos = savedPos;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -489,7 +497,12 @@ namespace OpenNest.Controls
|
||||
{
|
||||
var subpgm = (SubProgramCall)code;
|
||||
if (subpgm.Program != null)
|
||||
{
|
||||
var savedPos = pos;
|
||||
pos = new Vector(savedPos.X + subpgm.Offset.X, savedPos.Y + subpgm.Offset.Y);
|
||||
DrawProgramPiercePoints(g, subpgm.Program, ref pos, brush, pen);
|
||||
pos = savedPos;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -147,7 +147,10 @@ namespace OpenNest
|
||||
{
|
||||
cutPath.StartFigure();
|
||||
leadPath.StartFigure();
|
||||
var savedPos = curpos;
|
||||
curpos = new Vector(savedPos.X + subpgm.Offset.X, savedPos.Y + subpgm.Offset.Y);
|
||||
AddProgramSplit(cutPath, leadPath, subpgm.Program, mode, ref curpos);
|
||||
curpos = savedPos;
|
||||
}
|
||||
mode = tmpmode;
|
||||
break;
|
||||
@@ -305,7 +308,10 @@ namespace OpenNest
|
||||
|
||||
if (subpgm.Program != null)
|
||||
{
|
||||
var savedPos = curpos;
|
||||
curpos = new Vector(savedPos.X + subpgm.Offset.X, savedPos.Y + subpgm.Offset.Y);
|
||||
AddProgram(path, subpgm.Program, mode, ref curpos);
|
||||
curpos = savedPos;
|
||||
}
|
||||
|
||||
mode = tmpmode;
|
||||
|
||||
Reference in New Issue
Block a user