From 616575e0eecf31165a6b31891a0e010f3b589cd6 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Thu, 12 Mar 2026 23:57:17 -0400 Subject: [PATCH] feat: wire contour re-indexing into ContourCuttingStrategy.Apply() Co-Authored-By: Claude Sonnet 4.6 --- .../CuttingStrategy/ContourCuttingStrategy.cs | 37 +++++++++++++++++-- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/OpenNest.Core/CNC/CuttingStrategy/ContourCuttingStrategy.cs b/OpenNest.Core/CNC/CuttingStrategy/ContourCuttingStrategy.cs index 6882f3f..418da09 100644 --- a/OpenNest.Core/CNC/CuttingStrategy/ContourCuttingStrategy.cs +++ b/OpenNest.Core/CNC/CuttingStrategy/ContourCuttingStrategy.cs @@ -36,9 +36,9 @@ namespace OpenNest.CNC.CuttingStrategy var leadOut = SelectLeadOut(contourType); result.Codes.AddRange(leadIn.Generate(closestPt, normal, winding)); - // Contour re-indexing: split shape entities at closestPt so cutting - // starts there, convert to ICode, and add to result.Codes - throw new System.NotImplementedException("Contour re-indexing not yet implemented"); + var reindexed = cutout.ReindexAt(closestPt, entity); + result.Codes.AddRange(ConvertShapeToMoves(reindexed, closestPt)); + // TODO: MicrotabLeadOut — trim last cutting move by GapSize result.Codes.AddRange(leadOut.Generate(closestPt, normal, winding)); currentPoint = closestPt; @@ -54,7 +54,9 @@ namespace OpenNest.CNC.CuttingStrategy var leadOut = SelectLeadOut(ContourType.External); result.Codes.AddRange(leadIn.Generate(perimeterPt, normal, winding)); - throw new System.NotImplementedException("Contour re-indexing not yet implemented"); + var reindexed = profile.Perimeter.ReindexAt(perimeterPt, perimeterEntity); + result.Codes.AddRange(ConvertShapeToMoves(reindexed, perimeterPt)); + // TODO: MicrotabLeadOut — trim last cutting move by GapSize result.Codes.AddRange(leadOut.Generate(perimeterPt, normal, winding)); } @@ -173,5 +175,32 @@ namespace OpenNest.CNC.CuttingStrategy _ => Parameters.ExternalLeadOut }; } + + private List ConvertShapeToMoves(Shape shape, Vector startPoint) + { + var moves = new List(); + + foreach (var entity in shape.Entities) + { + if (entity is Line line) + { + moves.Add(new LinearMove(line.EndPoint)); + } + else if (entity is Arc arc) + { + moves.Add(new ArcMove(arc.EndPoint(), arc.Center, arc.IsReversed ? RotationType.CW : RotationType.CCW)); + } + else if (entity is Circle circle) + { + moves.Add(new ArcMove(startPoint, circle.Center, circle.Rotation)); + } + else + { + throw new System.InvalidOperationException($"Unsupported entity type: {entity.Type}"); + } + } + + return moves; + } } }