Curved leads turned with the contour winding, which is backwards on outside perimeters: arc lead-ins arrived against the cut, and Line + Arc / arc lead-outs went the long way round on one winding. LeadTurn now gives the arc's turn direction for emission, the pierce-zone check and the preview, and the arc geometry mirrors with it. At convex outside corners, curved lead-ins use the first-cut edge's normal and arc lead-outs the last-cut edge's, whichever edge was picked. ArcLeadIn gains SweepAngle (degrees, (0, 180], default 180) in the cutting panel, settings, nest files and cut pins; older files read as 180. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5.5 KiB
Lead-in placement at corners
Straight (LineLeadIn) lead-ins at closed internal contour corners use the
inward angle bisector instead of the normal of whichever edge was selected.
With the default 90-degree approach angle, a rectangular cutout therefore gets
a diagonal lead-in into the scrap, rather than one lying along the other edge.
This applies to automatic assignment and manual placement. The manual preview
uses the same Core calculation, including when the lead-in style changes while
the cursor is stationary.
ContourCuttingStrategy.ComputeLeadInNormal combines the two adjacent inward
unit normals. It handles either winding, either selected edge, rotated parts,
and line/arc junctions using their local normals. Summing vectors avoids angle
wraparound and edge-length weighting. Open contours, disconnected endpoints,
zero-length edges, and cusps without a unique bisector retain the entity normal.
The configured approach-angle offset is still applied relative to the computed normal; 90 degrees follows the bisector. Lead-in length is unchanged. Mid-edge points, external contours, circles, curved/composite lead-in styles, and lead-outs keep their existing placement rules.
This is a local direction correction, not a whole-path clearance guarantee. An excessively long lead-in or an approach angle rotated away from the bisector can still leave a small cutout. General non-circular containment/length clamping and sharp-corner handling for curved/composite lead-ins remain separate work.
Outside perimeter corners
A straight (LineLeadIn) lead-in at a convex corner of the outside perimeter
(interior angle under 180 degrees) extends the edge cut first: the pierce sits on
that edge's line, behind the corner, and the torch travels straight into the corner
and keeps cutting along the same line. Which of the two edges was picked (auto
assignment or the manual cursor) does not matter; the cut direction never changes.
The approach angle is ignored at such a corner.
The straight lead is used only while its pierce stays at least
CuttingParameters.PierceClearance (or the pierce zone radius, when larger)
from the contour and the lead crosses the
contour nowhere but at the corner. Very flat corners (about 165 degrees and over for
a 0.25 lead with 0.0625 clearance) fall back to the normal lead-in, perpendicular to
the first-cut edge, so tessellated curves do not get straight leads. Reflex perimeter
corners (the inside corner of an L) use the notch bisector, like cutout corners.
A LineLeadOut mirrors this: at a convex perimeter corner it runs straight on past
the corner along the last-cut edge, with the same clearance fallback to the last-cut
edge's normal and a bisector at reflex corners. A tabbed perimeter gets no run-out:
every lead-out style leaves from where the trimmed cut actually ends, on that end's
normal, so an arc lead-out starts on its own radius and the tab gap stays uncut.
ContourCuttingStrategy.ResolveLeadIn/ResolveLeadOut own these rules;
program generation and the manual preview share them. Other lead-in styles are
unchanged.
Curved leads
Every curved lead (Arc, Line + Arc, Clean Hole, the arc lead-out) meets the cut tangentially and
in the cut direction. Its arc center lies along the contour normal, away from the material, so
the arc turns with a cutout's winding and against an outside perimeter's;
ContourCuttingStrategy.LeadTurn gives that direction, and program generation, the pierce-zone
check and the manual preview all pass it to the lead. A Line + Arc approach angle is measured
back from the normal on the side the arc turns from, so the arc takes the short way round
under either winding.
An Arc lead-in's SweepAngle (degrees, in (0, 180], default 180) sets how much of a circle it
is: 90 is a quarter circle, 180 a half circle that pierces two radii out on the normal. Settings
and cut pins saved before the sweep existed read as 180.
At a convex corner of an outside perimeter, an Arc, Line + Arc or Clean Hole lead-in uses the normal of the edge cut first, and an Arc lead-out that of the edge cut last, whichever of the corner's edges was picked; the arc then lies wholly on the scrap side of that edge. Reflex corners and cutout corners keep the picked edge's normal: a tangent arc there would cross the part.
Regression checks
Run dotnet test OpenNest.Tests/OpenNest.Tests.csproj --filter "FullyQualifiedName~CutoutCornerLeadInTests|FullyQualifiedName~PerimeterCornerLeadInTests".
The cutout tests exercise generated part programs, default automatic placement, every
rectangular corner with both adjoining edges and windings, part rotation, acute
and obtuse angles, reflex corners, line/arc corners, preview agreement, and
unchanged/fallback behavior. The perimeter tests cover every square corner under both
windings and a rotation, auto and manual placement from either edge, preview
agreement, approach-angle handling, the flat-corner clearance fallback, reflex
notches, and straight lead-outs. ArcLeadInTangentTests checks curved-lead tangency, direction
and sweep on perimeters and cutouts under both windings, and at every perimeter corner from
either edge.
Windows manual check: import a part with small rectangular cutouts and use Plate > Plan Cutting. Confirm diagonal lead-ins at the cutout corners. Under Plate > Place Lead-in, select the part, lock a cutout, and hover a corner: the preview should point into the cutout and the committed lead-in should match. Hover a mid-edge point and confirm perpendicular placement is unchanged. Windows visual interaction is not verified by the Linux cross-build.