From 09fef203df646931d17f74c2e5b82e23f9f7aec3 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Fri, 13 Mar 2026 08:32:17 -0400 Subject: [PATCH] feat(ui): make FillPlate_Click async with progress and cancellation Co-Authored-By: Claude Opus 4.6 --- OpenNest/Forms/MainForm.cs | 46 +++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/OpenNest/Forms/MainForm.cs b/OpenNest/Forms/MainForm.cs index 6536ec9..09576c8 100644 --- a/OpenNest/Forms/MainForm.cs +++ b/OpenNest/Forms/MainForm.cs @@ -861,7 +861,7 @@ namespace OpenNest.Forms activeForm.SetCurrentPlateAsNestDefault(); } - private void FillPlate_Click(object sender, EventArgs e) + private async void FillPlate_Click(object sender, EventArgs e) { if (activeForm == null) return; @@ -877,13 +877,49 @@ namespace OpenNest.Forms if (drawing == null) return; - var engine = new NestEngine(activeForm.PlateView.Plate); - engine.Fill(new NestItem + nestingCts = new CancellationTokenSource(); + var token = nestingCts.Token; + + var progressForm = new NestProgressForm(nestingCts, showPlateRow: false); + + var progress = new Progress(p => { - Drawing = drawing + progressForm.UpdateProgress(p); + activeForm.PlateView.SetTemporaryParts(p.BestParts); }); - activeForm.PlateView.Invalidate(); + progressForm.Show(this); + SetNestingLockout(true); + + try + { + var plate = activeForm.PlateView.Plate; + var engine = new NestEngine(plate); + + var parts = await Task.Run(() => + engine.Fill(new NestItem { Drawing = drawing }, + plate.WorkArea(), progress, token)); + + if (parts.Count > 0) + activeForm.PlateView.AcceptTemporaryParts(); + else + activeForm.PlateView.ClearTemporaryParts(); + + progressForm.ShowCompleted(); + } + catch (Exception ex) + { + activeForm.PlateView.ClearTemporaryParts(); + MessageBox.Show($"Nesting error: {ex.Message}", "Error", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + finally + { + progressForm.Close(); + SetNestingLockout(false); + nestingCts.Dispose(); + nestingCts = null; + } } private void FillArea_Click(object sender, EventArgs e)