diff --git a/OpenNest.Engine/NestEngineBase.cs b/OpenNest.Engine/NestEngineBase.cs index d7b7362..b7fe994 100644 --- a/OpenNest.Engine/NestEngineBase.cs +++ b/OpenNest.Engine/NestEngineBase.cs @@ -1,4 +1,5 @@ using OpenNest.Engine.Fill; +using OpenNest.Engine.Nfp; using OpenNest.Geometry; using System; using System.Collections.Generic; @@ -126,6 +127,12 @@ namespace OpenNest } } + // Compact placed parts toward the origin to close gaps. + Compactor.Settle(allParts, Plate.WorkArea(), Plate.PartSpacing); + + // NFP optimization pass — re-place parts using geometry-aware BLF. + allParts = AutoNester.Optimize(allParts, Plate); + return allParts; } diff --git a/OpenNest.Engine/StripNestEngine.cs b/OpenNest.Engine/StripNestEngine.cs index efe69e2..fae659d 100644 --- a/OpenNest.Engine/StripNestEngine.cs +++ b/OpenNest.Engine/StripNestEngine.cs @@ -1,4 +1,5 @@ using OpenNest.Engine.Fill; +using OpenNest.Engine.Nfp; using OpenNest.Geometry; using System; using System.Collections.Generic; @@ -92,12 +93,7 @@ namespace OpenNest allParts.AddRange(shrinkResult.Parts); // Compact placed parts toward the origin to close gaps. - if (allParts.Count > 1) - { - var noObstacles = new List(); - Compactor.Push(allParts, noObstacles, workArea, Plate.PartSpacing, PushDirection.Left); - Compactor.Push(allParts, noObstacles, workArea, Plate.PartSpacing, PushDirection.Down); - } + Compactor.Settle(allParts, workArea, Plate.PartSpacing); // Add unfilled items to pack list. packItems.AddRange(shrinkResult.Leftovers); @@ -127,6 +123,9 @@ namespace OpenNest } } + // NFP optimization pass — re-place parts using geometry-aware BLF. + allParts = AutoNester.Optimize(allParts, Plate); + // Deduct placed quantities from original items. foreach (var item in items) { diff --git a/OpenNest/Controls/PlateView.cs b/OpenNest/Controls/PlateView.cs index 7e7d874..7b9945b 100644 --- a/OpenNest/Controls/PlateView.cs +++ b/OpenNest/Controls/PlateView.cs @@ -2,6 +2,7 @@ using OpenNest.CNC; using OpenNest.Collections; using OpenNest.Engine.Fill; +using OpenNest.Engine.Nfp; using OpenNest.Forms; using OpenNest.Geometry; using OpenNest.Math; @@ -955,8 +956,13 @@ namespace OpenNest.Controls try { var engine = NestEngineRegistry.Create(Plate); + var spacing = Plate.PartSpacing; var parts = await Task.Run(() => - engine.Fill(groupParts, workArea, progress, cts.Token)); + { + var result = engine.Fill(groupParts, workArea, progress, cts.Token); + Compactor.Settle(result, workArea, spacing); + return AutoNester.Optimize(result, workArea, spacing); + }); if (parts.Count > 0 && (!cts.IsCancellationRequested || progressForm.Accepted)) {