From ab09f835d32bdf9a8fa2e5890c164b4c9ce32deb Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Sun, 29 Mar 2026 23:52:07 -0400 Subject: [PATCH] refactor: extract RunAutoNest_Click into focused helper methods Break the 113-line click handler into single-responsibility methods: RunAutoNestAsync, GetOrCreatePlate, NestSinglePlateAsync, and CreatePreviewPlate (eliminates duplicated plate-cloning code). Co-Authored-By: Claude Opus 4.6 (1M context) --- OpenNest/Forms/MainForm.cs | 146 ++++++++++++++++++++----------------- 1 file changed, 80 insertions(+), 66 deletions(-) diff --git a/OpenNest/Forms/MainForm.cs b/OpenNest/Forms/MainForm.cs index bb8f218..1636740 100644 --- a/OpenNest/Forms/MainForm.cs +++ b/OpenNest/Forms/MainForm.cs @@ -901,19 +901,8 @@ namespace OpenNest.Forms return; nestingCts = new CancellationTokenSource(); - var token = nestingCts.Token; - var progressForm = new NestProgressForm(nestingCts, showPlateRow: true); - - var previewPlate = new Plate(activeForm.PlateView.Plate.Size) - { - Quadrant = activeForm.PlateView.Plate.Quadrant, - PartSpacing = activeForm.PlateView.Plate.PartSpacing, - Thickness = activeForm.PlateView.Plate.Thickness, - Material = activeForm.PlateView.Plate.Material, - }; - previewPlate.EdgeSpacing = activeForm.PlateView.Plate.EdgeSpacing; - progressForm.PreviewPlate = previewPlate; + progressForm.PreviewPlate = CreatePreviewPlate(activeForm.PlateView.Plate); var progress = new Progress(p => { @@ -931,60 +920,7 @@ namespace OpenNest.Forms try { - var maxPlates = 100; - - for (var plateCount = 0; plateCount < maxPlates; plateCount++) - { - var remaining = items.Where(i => i.Quantity > 0).ToList(); - - if (remaining.Count == 0) - break; - - if (token.IsCancellationRequested) - break; - - var plate = activeForm.PlateView.Plate.Parts.Count > 0 - ? activeForm.Nest.CreatePlate() - : activeForm.PlateView.Plate; - - if (plate != activeForm.PlateView.Plate) - { - activeForm.LoadLastPlate(); - - var newPreviewPlate = new Plate(plate.Size) - { - Quadrant = plate.Quadrant, - PartSpacing = plate.PartSpacing, - Thickness = plate.Thickness, - Material = plate.Material, - }; - newPreviewPlate.EdgeSpacing = plate.EdgeSpacing; - progressForm.PreviewPlate = newPreviewPlate; - } - - var anyPlaced = false; - - var engine = NestEngineRegistry.Create(plate); - engine.PlateNumber = plateCount; - - var nestParts = await Task.Run(() => - engine.Nest(remaining, progress, token)); - - activeForm.PlateView.ClearPreviewParts(); - - if (nestParts.Count > 0 && (!token.IsCancellationRequested || progressForm.Accepted)) - { - plate.Parts.AddRange(nestParts); - activeForm.PlateView.Invalidate(); - anyPlaced = true; - } - - if (!anyPlaced) - break; - } - - activeForm.Nest.UpdateDrawingQuantities(); - progressForm.ShowCompleted(); + await RunAutoNestAsync(items, progressForm, progress, nestingCts.Token); } catch (Exception ex) { @@ -1002,6 +938,84 @@ namespace OpenNest.Forms } } + private async Task RunAutoNestAsync( + List items, + NestProgressForm progressForm, + IProgress progress, + CancellationToken token) + { + const int maxPlates = 100; + + for (var plateIndex = 0; plateIndex < maxPlates; plateIndex++) + { + var remaining = items.Where(i => i.Quantity > 0).ToList(); + + if (remaining.Count == 0 || token.IsCancellationRequested) + break; + + var plate = GetOrCreatePlate(progressForm); + + var placed = await NestSinglePlateAsync( + plate, plateIndex, remaining, progressForm, progress, token); + + if (!placed) + break; + } + + activeForm.Nest.UpdateDrawingQuantities(); + progressForm.ShowCompleted(); + } + + private Plate GetOrCreatePlate(NestProgressForm progressForm) + { + var currentPlate = activeForm.PlateView.Plate; + + if (currentPlate.Parts.Count == 0) + return currentPlate; + + var plate = activeForm.Nest.CreatePlate(); + activeForm.LoadLastPlate(); + progressForm.PreviewPlate = CreatePreviewPlate(plate); + return plate; + } + + private async Task NestSinglePlateAsync( + Plate plate, + int plateIndex, + List items, + NestProgressForm progressForm, + IProgress progress, + CancellationToken token) + { + var engine = NestEngineRegistry.Create(plate); + engine.PlateNumber = plateIndex; + + var nestParts = await Task.Run(() => + engine.Nest(items, progress, token)); + + activeForm.PlateView.ClearPreviewParts(); + + if (nestParts.Count == 0 || (token.IsCancellationRequested && !progressForm.Accepted)) + return false; + + plate.Parts.AddRange(nestParts); + activeForm.PlateView.Invalidate(); + return true; + } + + private static Plate CreatePreviewPlate(Plate source) + { + var plate = new Plate(source.Size) + { + Quadrant = source.Quadrant, + PartSpacing = source.PartSpacing, + Thickness = source.Thickness, + Material = source.Material, + }; + plate.EdgeSpacing = source.EdgeSpacing; + return plate; + } + private void SequenceAllPlates_Click(object sender, EventArgs e) { if (activeForm == null)