diff --git a/OpenNest.Engine/DefaultNestEngine.cs b/OpenNest.Engine/DefaultNestEngine.cs index 118471d..abae5cf 100644 --- a/OpenNest.Engine/DefaultNestEngine.cs +++ b/OpenNest.Engine/DefaultNestEngine.cs @@ -176,6 +176,13 @@ namespace OpenNest } } + // Always report the final winner so the UI's temporary parts + // match the returned result. + var winPhase = PhaseResults.Count > 0 + ? PhaseResults.OrderByDescending(r => r.PartCount).First().Phase + : NestPhase.Linear; + ReportProgress(progress, winPhase, PlateNumber, best, workArea, BuildProgressSummary()); + return best ?? new List(); } @@ -320,6 +327,11 @@ namespace OpenNest Debug.WriteLine("[FindBestFill] Cancelled, returning current best"); } + // Always report the final winner so the UI's temporary parts + // match the returned result (sub-phases may have reported their + // own intermediate results via progress). + ReportProgress(progress, WinnerPhase, PlateNumber, best, workArea, BuildProgressSummary()); + return best ?? new List(); } diff --git a/OpenNest.Engine/FillExtents.cs b/OpenNest.Engine/FillExtents.cs index bbcbf47..bcb0689 100644 --- a/OpenNest.Engine/FillExtents.cs +++ b/OpenNest.Engine/FillExtents.cs @@ -177,9 +177,13 @@ namespace OpenNest // startOffset = pairHeight (no extra spacing), copyDist = height - slide. var copyDist = pairHeight - minSlide; - // Clamp: never let geometry quirks produce a distance smaller than - // the bounding box height (which would overlap). - return System.Math.Max(copyDist, pairHeight + partSpacing); + // Boundaries are inflated by halfSpacing, so the geometry-aware + // distance already guarantees partSpacing gap. Only fall back to + // bounding-box distance if the calculation produced a non-positive value. + if (copyDist <= Tolerance.Epsilon) + return pairHeight + partSpacing; + + return copyDist; } private static double SlideDistance( diff --git a/OpenNest.Engine/PairFiller.cs b/OpenNest.Engine/PairFiller.cs index 8d69362..f1a30aa 100644 --- a/OpenNest.Engine/PairFiller.cs +++ b/OpenNest.Engine/PairFiller.cs @@ -50,6 +50,12 @@ namespace OpenNest var pairParts = result.BuildParts(item.Drawing); var angles = result.HullAngles; var engine = new FillLinear(workArea, partSpacing); + + // Let the remainder strip try pair-based filling too. + var p0 = DefaultNestEngine.BuildRotatedPattern(pairParts, 0); + var p90 = DefaultNestEngine.BuildRotatedPattern(pairParts, Angle.HalfPI); + engine.RemainderPatterns = new List { p0, p90 }; + var filled = DefaultNestEngine.FillPattern(engine, pairParts, angles, workArea); if (filled != null && filled.Count > 0)