refactor(engine): use RemnantFiller in NestEngineBase.Nest
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user