From 1f159d5dcc8389a4e9090321af6ecf62cc9b675f Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Tue, 24 Mar 2026 23:07:46 -0400 Subject: [PATCH] fix: prevent PushBoundingBox from making obstacles invisible to geometry push PushBoundingBox left exactly partSpacing between bounding boxes, but the geometry push inflates offset lines by halfSpacing + chordTolerance per side (totaling partSpacing + 2*chordTolerance). The 0.002 overlap caused RayEdgeDistance to return MaxValue for negative t, making the nearest obstacle invisible and allowing the part to push through it. Subtract 2*ChordTolerance from the BB push distance so the gap is wide enough for the offset geometry lines to remain non-overlapping. Co-Authored-By: Claude Opus 4.6 (1M context) --- OpenNest.Engine/Fill/Compactor.cs | 2 +- OpenNest/Actions/ActionClone.cs | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/OpenNest.Engine/Fill/Compactor.cs b/OpenNest.Engine/Fill/Compactor.cs index 6f28a7b..cc6b4fe 100644 --- a/OpenNest.Engine/Fill/Compactor.cs +++ b/OpenNest.Engine/Fill/Compactor.cs @@ -157,7 +157,7 @@ namespace OpenNest.Engine.Fill continue; var gap = SpatialQuery.DirectionalGap(movingBox, obstacleBoxes[i], direction); - var d = gap - partSpacing; + var d = gap - partSpacing - 2 * ChordTolerance; if (d < 0) d = 0; if (d < distance) distance = d; diff --git a/OpenNest/Actions/ActionClone.cs b/OpenNest/Actions/ActionClone.cs index 663175a..463d36c 100644 --- a/OpenNest/Actions/ActionClone.cs +++ b/OpenNest/Actions/ActionClone.cs @@ -154,11 +154,9 @@ namespace OpenNest.Actions default: hDir = PushDirection.Left; vDir = PushDirection.Down; break; } - // Phase 1: BB-only push to get past irregular geometry quickly. Compactor.PushBoundingBox(movingParts, plateView.Plate, hDir); Compactor.PushBoundingBox(movingParts, plateView.Plate, vDir); - // Phase 2: Geometry push to settle against actual contours. Compactor.Push(movingParts, plateView.Plate, hDir); Compactor.Push(movingParts, plateView.Plate, vDir);