refactor(engine): use RemnantFiller in NestEngineBase.Nest

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-16 22:38:53 -04:00
parent 75cb6b2bac
commit 5bb637f3e2
+25 -18
View File
@@ -71,29 +71,36 @@ namespace OpenNest
.Where(i => i.Quantity == 1) .Where(i => i.Quantity == 1)
.ToList(); .ToList();
// Phase 1: Fill multi-quantity drawings sequentially. // Phase 1: Fill multi-quantity drawings using RemnantFiller.
if (fillItems.Count > 0)
{
var remnantFiller = new RemnantFiller(workArea, Plate.PartSpacing);
Func<NestItem, Box, List<Part>> fillFunc = (ni, b) =>
FillExact(ni, b, progress, token);
var fillParts = remnantFiller.FillItems(fillItems, fillFunc, token, progress);
if (fillParts.Count > 0)
{
allParts.AddRange(fillParts);
// Deduct placed quantities
foreach (var item in fillItems) foreach (var item in fillItems)
{ {
if (token.IsCancellationRequested) var placed = fillParts.Count(p =>
break; p.BaseDrawing.Name == item.Drawing.Name);
item.Quantity = System.Math.Max(0, item.Quantity - placed);
}
if (item.Quantity <= 0 || workArea.Width <= 0 || workArea.Length <= 0) // Update workArea for pack phase
continue; var placedObstacles = fillParts.Select(p => p.BoundingBox.Offset(Plate.PartSpacing)).ToList();
var parts = FillExact(
new NestItem { Drawing = item.Drawing, Quantity = item.Quantity },
workArea, progress, token);
if (parts.Count > 0)
{
allParts.AddRange(parts);
item.Quantity = System.Math.Max(0, item.Quantity - parts.Count);
var placedObstacles = parts.Select(p => p.BoundingBox.Offset(Plate.PartSpacing)).ToList();
var finder = new RemnantFinder(workArea, placedObstacles); var finder = new RemnantFinder(workArea, placedObstacles);
var remnants = finder.FindRemnants(); var remnants = finder.FindRemnants();
if (remnants.Count == 0) if (remnants.Count > 0)
break; workArea = remnants[0];
workArea = remnants[0]; // Largest remnant else
workArea = new Box(0, 0, 0, 0);
} }
} }