From 7c918a237850ad665385d805fb94f041a55f8301 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Mon, 6 Apr 2026 14:16:10 -0400 Subject: [PATCH] feat: integrate MultiPlateNester into MainForm auto-nest workflow Wires part-first mode from AutoNestForm into RunAutoNestAsync: reads PartFirstMode, SortOrder, MinRemnantSize, and AllowPlateCreation from the form, passes them through to a new part-first branch that delegates to MultiPlateNester.Nest instead of the plate-first loop. Co-Authored-By: Claude Sonnet 4.6 --- OpenNest/Forms/MainForm.cs | 43 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) diff --git a/OpenNest/Forms/MainForm.cs b/OpenNest/Forms/MainForm.cs index 61e4b05..4a61d7b 100644 --- a/OpenNest/Forms/MainForm.cs +++ b/OpenNest/Forms/MainForm.cs @@ -932,6 +932,10 @@ namespace OpenNest.Forms var optimizePlateSize = form.OptimizePlateSize; var plateOptions = optimizePlateSize ? form.GetPlateOptions() : null; var salvageRate = form.SalvageRate; + var partFirstMode = form.PartFirstMode; + var sortOrder = form.SortOrder; + var minRemnantSize = form.MinRemnantSize; + var allowPlateCreation = form.AllowPlateCreation; if (optimizePlateSize) { @@ -960,7 +964,7 @@ namespace OpenNest.Forms try { await RunAutoNestAsync(items, progressForm, progress, nestingCts.Token, - plateOptions, salvageRate); + plateOptions, salvageRate, partFirstMode, sortOrder, minRemnantSize, allowPlateCreation); } catch (Exception ex) { @@ -984,8 +988,43 @@ namespace OpenNest.Forms IProgress progress, CancellationToken token, List plateOptions = null, - double salvageRate = 0.5) + double salvageRate = 0.5, + bool partFirstMode = false, + PartSortOrder sortOrder = PartSortOrder.BoundingBoxArea, + double minRemnantSize = 12.0, + bool allowPlateCreation = true) { + if (partFirstMode) + { + var existingPlates = new List(); + for (var i = 0; i < activeForm.Nest.Plates.Count; i++) + { + var p = activeForm.Nest.Plates[i]; + if (p.Parts.Count > 0) + existingPlates.Add(p); + } + + var template = activeForm.PlateView.Plate; + + var result = await Task.Run(() => + MultiPlateNester.Nest(items, template, plateOptions, salvageRate, + sortOrder, minRemnantSize, allowPlateCreation, existingPlates, progress, token)); + + foreach (var pr in result.Plates) + { + if (pr.IsNew) + { + var plate = GetOrCreatePlate(progressForm); + plate.Size = pr.Plate.Size; + plate.Parts.AddRange(pr.Parts); + } + } + + activeForm.Nest.UpdateDrawingQuantities(); + progressForm.ShowCompleted(); + return; + } + const int maxPlates = 100; for (var plateIndex = 0; plateIndex < maxPlates; plateIndex++)