mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-11-14 02:15:07 -05:00
On a plate packed edge to edge, an overlap left by hand-placing extra parts could not be fixed: straight push chains ran into the edge and the relaxation gave up on pairs that share material, which have no contact normal. The relaxation now pushes such a pair along its shortest straight way out and lets the rest settle, which cleared a 0.92 sq in overlap on a 38-part plate with every part kept square. When moves alone still cannot settle, the relaxation runs again as a rigid one: an off-center push also turns a part, up to 3 degrees, if its drawing is free to rotate. Moves stay first because a tilt turns every part the push reaches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
56 lines
3.6 KiB
Markdown
56 lines
3.6 KiB
Markdown
# Fix Spacing
|
|
|
|
`Plate > Fix Spacing` clears the pairs the overlap check flags (parts sharing material, and
|
|
parts closer than the plate's `PartSpacing`, or than their kerf for common-line partners) with
|
|
the smallest moves it can find. It moves parts by translation, tilts them slightly only as a
|
|
last resort (below), and never changes `PartSpacing` or `EdgeSpacing`. Unlike [Expand Spacing](expand-spacing.md) it needs no
|
|
selection and does not open up the rest of the layout: parts nothing crowds stay where they
|
|
are. With parts selected, only flagged pairs that include a selected part are fixed. The
|
|
engine entry point is `SpacingFixer.Fix`.
|
|
|
|
## How a pair is opened
|
|
|
|
Pairs are fixed in turn, overlaps first, then the tightest gaps. Gaps are measured on the
|
|
same native contours the overlap check confirms with (`NativeContours`), flattened a little
|
|
coarser for speed; that understates gaps, so a push errs slightly long.
|
|
|
|
1. **Straight chains.** One part of the pair is pushed straight away from the other, in each
|
|
of 16 directions, by just enough to reach the spacing plus the check's slack. Any part that
|
|
push brings closer than its floor is pushed the same way by its own shortfall, and so on
|
|
down the chain, so a fix can ripple through rows already locked in at the spacing. A chain
|
|
fails when it would push the pair's other part, a common-line member, or a part past the
|
|
work-area edge or into a clamp. The chain with the least total travel wins.
|
|
2. **Relaxation.** When no straight chain has room (a plate packed edge to edge), each crowded
|
|
pair is pushed apart along the normal between its closest points, the shortfall shared
|
|
between its two parts; a part held by the work-area edge or locked passes its share to the
|
|
other. Passes repeat until every gap holds, so the moves can differ in direction (one part
|
|
right and up, its partner down and left). Parts that share material have no contact normal;
|
|
they are pushed along their shortest straight way out (16 directions) instead. A move under
|
|
0.0001 that the layout does not need is undone.
|
|
3. **Tilt.** When moves alone cannot settle, the relaxation runs again as a rigid one: a push
|
|
at a contact off a part's center also turns it about that center, by up to
|
|
`SpacingFixer.DefaultMaxTilt` (3 degrees) from where it started. Only parts whose drawing is
|
|
free to rotate tilt (no rotation constraints, or a full turn allowed); the rest only move.
|
|
A tilted part's lead-ins turn with it. The status bar names how many parts tilted and by
|
|
how much. Moves are always tried first: tilting turns every part the push reaches.
|
|
|
|
A pair's **floor** is its required gap, or its gap before the fix when that is already
|
|
smaller (another flagged pair never gets worse), less 0.00001 of rounding allowance.
|
|
|
|
## Validation
|
|
|
|
The plan for every pair is checked once with the overlap check. The result is applied only
|
|
when it has fewer findings than before and nothing new: no new pair, edge, clamp or
|
|
unreadable finding. Otherwise the pairs are redone one at a time, each fix kept only when the
|
|
overlap check rates the plate better. A pair with no room is left as it was and counted in the
|
|
status bar ("Fixed 3 of 4 flagged pairs ... - 1 flagged pair left").
|
|
|
|
Cut-offs are not obstacles: they are regenerated around the moved parts. Irregular sheet
|
|
outlines are honored through the final overlap check, which reports parts outside them.
|
|
|
|
## Desktop
|
|
|
|
The command runs on a worker behind the same Cancel window as Expand Spacing, and refuses
|
|
while Auto Nest or a fill is still running on the nest. A canceled run moves nothing. It records
|
|
one undo step, "Fix Spacing", and does not save.
|