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

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.
foreach (var item in fillItems) if (fillItems.Count > 0)
{ {
if (token.IsCancellationRequested) var remnantFiller = new RemnantFiller(workArea, Plate.PartSpacing);
break;
if (item.Quantity <= 0 || workArea.Width <= 0 || workArea.Length <= 0) Func<NestItem, Box, List<Part>> fillFunc = (ni, b) =>
continue; FillExact(ni, b, progress, token);
var parts = FillExact( var fillParts = remnantFiller.FillItems(fillItems, fillFunc, token, progress);
new NestItem { Drawing = item.Drawing, Quantity = item.Quantity },
workArea, progress, token);
if (parts.Count > 0) if (fillParts.Count > 0)
{ {
allParts.AddRange(parts); allParts.AddRange(fillParts);
item.Quantity = System.Math.Max(0, item.Quantity - parts.Count);
var placedObstacles = parts.Select(p => p.BoundingBox.Offset(Plate.PartSpacing)).ToList(); // Deduct placed quantities
foreach (var item in fillItems)
{
var placed = fillParts.Count(p =>
p.BaseDrawing.Name == item.Drawing.Name);
item.Quantity = System.Math.Max(0, item.Quantity - placed);
}
// Update workArea for pack phase
var placedObstacles = fillParts.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);
} }
} }