fix(cutting): emit open contours raw instead of applying lead-in/lead-out
Open (non-closed) shapes like scribe lines or partial cuts don't have a meaningful pierce point or closing segment, so applying lead-in/out would produce invalid toolpaths. Skip the lead-in/out logic and emit them as raw contours in both Apply and ApplySingle paths. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -69,8 +69,16 @@ namespace OpenNest.CNC.CuttingStrategy
|
|||||||
EmitScribeContours(result, scribeEntities);
|
EmitScribeContours(result, scribeEntities);
|
||||||
|
|
||||||
foreach (var entry in cutoutEntries)
|
foreach (var entry in cutoutEntries)
|
||||||
|
{
|
||||||
|
if (!entry.Shape.IsClosed())
|
||||||
|
EmitRawContour(result, entry.Shape);
|
||||||
|
else
|
||||||
EmitContour(result, entry.Shape, entry.Point, entry.Entity);
|
EmitContour(result, entry.Shape, entry.Point, entry.Entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!profile.Perimeter.IsClosed())
|
||||||
|
EmitRawContour(result, profile.Perimeter);
|
||||||
|
else
|
||||||
EmitContour(result, profile.Perimeter, perimeterPt, perimeterEntity, ContourType.External);
|
EmitContour(result, profile.Perimeter, perimeterPt, perimeterEntity, ContourType.External);
|
||||||
|
|
||||||
result.Mode = Mode.Incremental;
|
result.Mode = Mode.Incremental;
|
||||||
@@ -99,10 +107,14 @@ namespace OpenNest.CNC.CuttingStrategy
|
|||||||
// Find the target shape that contains the clicked entity
|
// Find the target shape that contains the clicked entity
|
||||||
var (targetShape, matchedEntity) = FindTargetShape(profile, point, entity);
|
var (targetShape, matchedEntity) = FindTargetShape(profile, point, entity);
|
||||||
|
|
||||||
// Emit cutouts — only the target gets lead-in/out
|
// Emit cutouts — only the target gets lead-in/out (skip open contours)
|
||||||
foreach (var cutout in profile.Cutouts)
|
foreach (var cutout in profile.Cutouts)
|
||||||
{
|
{
|
||||||
if (cutout == targetShape)
|
if (!cutout.IsClosed())
|
||||||
|
{
|
||||||
|
EmitRawContour(result, cutout);
|
||||||
|
}
|
||||||
|
else if (cutout == targetShape)
|
||||||
{
|
{
|
||||||
var ct = DetectContourType(cutout);
|
var ct = DetectContourType(cutout);
|
||||||
EmitContour(result, cutout, point, matchedEntity, ct);
|
EmitContour(result, cutout, point, matchedEntity, ct);
|
||||||
@@ -114,7 +126,11 @@ namespace OpenNest.CNC.CuttingStrategy
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Emit perimeter
|
// Emit perimeter
|
||||||
if (profile.Perimeter == targetShape)
|
if (!profile.Perimeter.IsClosed())
|
||||||
|
{
|
||||||
|
EmitRawContour(result, profile.Perimeter);
|
||||||
|
}
|
||||||
|
else if (profile.Perimeter == targetShape)
|
||||||
{
|
{
|
||||||
EmitContour(result, profile.Perimeter, point, matchedEntity, ContourType.External);
|
EmitContour(result, profile.Perimeter, point, matchedEntity, ContourType.External);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user