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 <noreply@anthropic.com>
This commit is contained in:
2026-04-06 14:16:10 -04:00
parent feb08a5f60
commit 7c918a2378

View File

@@ -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<NestProgress> progress,
CancellationToken token,
List<PlateOption> 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<Plate>();
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++)