fix(cutting): plan support-tabbed perimeters that have a lead-out

Every part the support grid could not hold level got a tabbed perimeter
with the outside lead-out after its tab, and planning refused any lead-out
after its own open cut, so with a lead-out configured no such part could
be planned. Pre-post review already proves such cuts release nothing (the
lead-out stays out of the tab gap); planning now runs the same proof, so
planning and review agree and a lead-out that reaches into the tab is
still refused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ajandClaude Opus 5.5 committed 2026-11-02 09:33:57 -05:00
1 parent af9886c355
commit e0bc97a719
4 files changed
+11 -12

No files matched your search

@@ -101,7 +101,7 @@ public sealed class ReleasedContourState
internal void AnalyzeMoves(IReadOnlyList<ExecutionMotion> moves, bool cutoff,
List<PostVerificationFinding> findings, int plate, int part, CancellationToken token,
Func<int, bool> isFixed = null, List<PostVerificationFinding> fixedFindings = null,
bool proveOpenCuts = false, int contoursBefore = 0, List<PostVerificationFinding> raisedFindings = null)
int contoursBefore = 0, List<PostVerificationFinding> raisedFindings = null)
{
var current = new CutGroup();
var unfinished = new List<CutGroup>();
@@ -261,14 +261,13 @@ public sealed class ReleasedContourState
Finish();
loose.Leads.AddRange(leadIns);
// Open cuts that provably enclose nothing retain all their material, however many
// pieces a tabbed cutout was cut in. Otherwise they need manual review. Planning proves
// them too (its own tabbed cutouts are cut in pieces without lead-outs), but only
// pre-post review lets the proof clear a lead-out: planning keeps refusing to certify
// its own tabs followed by a lead-out.
// pieces a tabbed cutout was cut in, and so does a tabbed perimeter whose lead-out stays
// out of its tab: planning and pre-post review prove them alike. Otherwise they need
// manual review.
var retained = !cutoff && (unfinished.Count > 1 || deferred.Count > 0)
&& unfinished.All(LeadsClearOpenEnds)
&& OpenCutsEncloseNothing(closed, unfinished.Concat(otherOpen).Append(loose).ToList(), token);
for (var i = deferred.Count - 1; i >= 0 && !(retained && proveOpenCuts); i--)
for (var i = deferred.Count - 1; i >= 0 && !retained; i--)
deferred[i].Target.Insert(deferred[i].Index, deferred[i].Finding);
// Only one open fragment per part can be the planner's own certified tab, so a
// further fragment that a fixed emission cut makes this uncertainty that emission's.
@@ -144,8 +144,7 @@ public static class PostVerificationAnalyzer
&& move.Layer is LayerType.Cut or LayerType.Display
&& move.Curve.Length > PostVerificationGeometry.Epsilon))
Incomplete("Placed program has no cutting contour motions for this drawing.");
obstacles.AnalyzeMoves(moves, cutoff, findings, plateNumber, partNumber, cancellationToken,
proveOpenCuts: true);
obstacles.AnalyzeMoves(moves, cutoff, findings, plateNumber, partNumber, cancellationToken);
if (clamps is { Count: > 0 })
foreach (var move in moves)
{
+3 -2
View File
@@ -508,8 +508,9 @@ or retraced cut) is kept as given with a fixed-lead warning instead; see below.
no-parameter route retains its narrower compatibility contract and still refuses
fixed-program violations. A planned lead-out that may bridge a tab, or a malformed
emitted arc, is refused, not automatically repaired. Tabbed lead-outs leave from the
trimmed cut end, but a lead-out after an open contour still needs manual review of
its retention gap, so confirmed-parameters planning refuses it in a planned contour.
trimmed cut end; planning runs pre-post review's open-cut proof on them (see
[post verification](post-verification.md)), so a support-tabbed or tabbed perimeter with a
lead-out that stays out of its tab plans like any other, and one that reaches into it is refused.
### Fixed emissions warn
+2 -2
View File
@@ -155,8 +155,8 @@ end it leaves, and a lead-in never behind the start it enters. Anything else (pi
meet exactly, a lead that bridges or curls into a tab, cuts from edge to edge) is reported
as incomplete, needing manual review. Kerf, tab strength and other parts' cuts are not modeled. Plan
Cutting runs the same proof, so its own [tabbed cutouts](tabbed-cutouts.md) (pieces without
lead-outs) pass, but keeps its stricter rule and does not certify its own tabs followed by a
lead-out. A program that still has a tabbed cutout's `Tab` motions (never planned) is
lead-outs) pass, and so do its tabbed perimeters followed by a lead-out that stays out of the
tab. A program that still has a tabbed cutout's `Tab` motions (never planned) is
incomplete: a post may cut through them.
## Explicit override