feat: integrate PlateOptimizer into autonest flow

When "Optimize plate size" is enabled in AutoNestForm, NestSinglePlateAsync
calls PlateOptimizer.Optimize instead of engine.Nest, trying multiple plate
sizes and resizing the plate to the winning option.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-05 00:36:29 -04:00
parent b3e9e5e28b
commit a360452da3

View File

@@ -908,6 +908,10 @@ namespace OpenNest.Forms
if (!items.Any(it => it.Quantity > 0))
return;
var optimizePlateSize = form.OptimizePlateSize;
var plateOptions = optimizePlateSize ? form.GetPlateOptions() : null;
var salvageRate = form.SalvageRate;
nestingCts = new CancellationTokenSource();
var progressForm = new NestProgressForm(nestingCts, showPlateRow: true);
progressForm.PreviewPlate = CreatePreviewPlate(activeForm.PlateView.Plate);
@@ -928,7 +932,8 @@ namespace OpenNest.Forms
try
{
await RunAutoNestAsync(items, progressForm, progress, nestingCts.Token);
await RunAutoNestAsync(items, progressForm, progress, nestingCts.Token,
plateOptions, salvageRate);
}
catch (Exception ex)
{
@@ -950,7 +955,9 @@ namespace OpenNest.Forms
List<NestItem> items,
NestProgressForm progressForm,
IProgress<NestProgress> progress,
CancellationToken token)
CancellationToken token,
List<PlateOption> plateOptions = null,
double salvageRate = 0.5)
{
const int maxPlates = 100;
@@ -964,7 +971,8 @@ namespace OpenNest.Forms
var plate = GetOrCreatePlate(progressForm);
var placed = await NestSinglePlateAsync(
plate, plateIndex, remaining, progressForm, progress, token);
plate, plateIndex, remaining, progressForm, progress, token,
plateOptions, salvageRate);
if (!placed)
break;
@@ -993,13 +1001,32 @@ namespace OpenNest.Forms
List<NestItem> items,
NestProgressForm progressForm,
IProgress<NestProgress> progress,
CancellationToken token)
CancellationToken token,
List<PlateOption> plateOptions = null,
double salvageRate = 0.5)
{
var engine = NestEngineRegistry.Create(plate);
engine.PlateNumber = plateIndex;
List<Part> nestParts;
var nestParts = await Task.Run(() =>
engine.Nest(items, progress, token));
if (plateOptions != null && plateOptions.Count > 0)
{
var result = await Task.Run(() =>
PlateOptimizer.Optimize(items, plateOptions, salvageRate, plate, progress, token));
if (result == null || result.Parts.Count == 0 ||
(token.IsCancellationRequested && !progressForm.Accepted))
return false;
plate.Size = new Geometry.Size(result.ChosenSize.Width, result.ChosenSize.Length);
nestParts = result.Parts;
}
else
{
var engine = NestEngineRegistry.Create(plate);
engine.PlateNumber = plateIndex;
nestParts = await Task.Run(() =>
engine.Nest(items, progress, token));
}
activeForm.PlateView.ClearPreviewParts();