From a360452da3e9ca1a4fe6a1328c81c7ffdfd3b07a Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Sun, 5 Apr 2026 00:36:29 -0400 Subject: [PATCH] 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) --- OpenNest/Forms/MainForm.cs | 43 +++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/OpenNest/Forms/MainForm.cs b/OpenNest/Forms/MainForm.cs index fa010d7..90793b4 100644 --- a/OpenNest/Forms/MainForm.cs +++ b/OpenNest/Forms/MainForm.cs @@ -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 items, NestProgressForm progressForm, IProgress progress, - CancellationToken token) + CancellationToken token, + List 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 items, NestProgressForm progressForm, IProgress progress, - CancellationToken token) + CancellationToken token, + List plateOptions = null, + double salvageRate = 0.5) { - var engine = NestEngineRegistry.Create(plate); - engine.PlateNumber = plateIndex; + List 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();