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