Files
OpenNest/docs/breakoffs.md
T
ajandClaude Opus 5.5 8c7dc41ce8 feat(planning): warn about tipping parts and retire legacy lead-in assignment
Plan Cutting is now the only automatic lead-in assignment, and parts the
support grid cannot hold level are reported wherever they lack a
steadying tab.

- Remove Assign Lead-ins (plate and nest), LeadInAssigner, the lead-in
  tool's Auto-Assign button and the Auto Tab size range; old settings
  with autoTab sizes still load
- Manual Place Lead-in tabs the clicked entry when support tabs are on
  and the grid cannot hold the part (SupportTabSettings)
- New PartSupport finding: Plan Cutting replay and best-effort plans
  warn when a drawing pin, a lead-in that does not fit or no single tab
  leaves a part unsteady; the pre-post review checks each placed
  program's outside tab gap. These warnings replace the advisory
  weak-tab notes; only the inside-corner tab note stays advisory, and
  never for a pin
- Pinned perimeters keep their pin but carry the support analysis
- Draw grid points as pixel-snapped squares without anti-aliasing
- Post fixtures build lead-ins through a test-only TestLeadIns helper
- Docs: support tabs, pre-post verification and planner notes

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 23:54:40 -04:00

65 lines
3.7 KiB
Markdown

# Breakoffs
A breakoff is scrap drawn on a part, such as a forming backgauge tab, that must stay
attached through cutting and forming and is snapped off afterwards. In the CAD
Converter's **Breakoffs** panel, **Add Breakoff**, then click the line that joins the
part and the scrap. Lines or arcs that end partway along another visible line or arc
first split it there (the first piece keeps its entity ID), so a joining line can end
exactly where it meets the outline. The clicked entity then grows into the chain that
continues as a single path. Its ends must touch, within 0.001, one closed outline
drawn around both part and scrap, and the chain must run inside it: either a separate
line drawn across the outline, or a section of the part outline with the scrap's
outside edges drawn separately.
The smaller side is the scrap; **Flip** (or "Larger side is scrap" in the dialog)
swaps it. The dialog sets the tab count (both end tabs included, at least 2) and tab
width; tabs start evenly spaced and can be dragged along the joining line. Edit
re-spaces the tabs only when the count or width changes. The view shades the scrap,
draws the cuts and marks where each cut is pierced.
## Geometry contract
`BreakoffBuilder` (`OpenNest.Core/Breakoffs`) resolves each `Drawing.Breakoffs` entry
against the entities being cut:
- The two sides are the outline from one end of the joining line to the other, closed
back along the joining line. They must add up to the outline within 1%. Tab
positions are measured from the joining line's end with the smaller X (then Y).
- The outline is kept, with every joint snapped exact (lines move their endpoint; a
short connecting line is added between arcs), because the planner closes contours within
1e-6 and the program is re-chained from any entity.
- The joining line between consecutive tabs becomes open cuts on the `Break` layer
(`LayerType.Break`, `SpecialLayers.Break`), each travelling with the scrap on its
left. The joining line itself is not cut at the tabs; end tabs keep cuts off the
outline.
## Cutting break cuts
Break cuts cut like `Cut` motions but are not material: `SpecialLayers.IsMaterial`,
material capture, overlap checks, nesting and area ignore them. `ShapeProfile` and
`ConvertGeometry` pass them through in order without re-chaining or re-winding.
Both Plan Cutting (`PreparedContours`, emitted after scribes and before contours in
every full or prefix emission, never in single-contour probes) and the manual lead-in tool
(`ContourCuttingStrategy.Apply`/`ApplySingle`) emit them through
`ContourCuttingStrategy.EmitBreakCuts`:
- Each cut is entered from its scrap side with the internal lead-in; `NoLeadIn`
pierces on the line. There is no lead-out, since the cut ends at a tab.
- It is entered at whichever end has more scrap before the part's contours along the
scrap direction (`BreakCutEntry`), because the scrap narrows to a wedge near the
outline. Entering at the far end cuts it in reverse.
Checks treat them as intentional open cuts retained by tabs: `ReleasedContourState`
never makes them rapid obstacles or "open fragment" warnings, but reports a missing
lead-in like any contour. `LeadPathValidator` lets a lead into a break cut run
through its own part's material, and still refuses one that touches any of the part's
boundaries or another part. The posts cut them: Gravograph IS maps `Break` to its cut
settings; CI Fiber and Cincinnati treat any non-lead, non-scribe layer as cut.
Breakoffs that do not resolve (hidden or missing joining line, overlapping tabs) are
listed with the reason and not applied, but stay on the drawing.
`CadImporter.BuildDrawing` applies breakoffs and copies them to the drawing;
`SourceEntities` keep the original geometry so a reopened drawing can be edited. Split
pieces get no breakoffs.