From 786b6e2e88ccd379613dd8ee8c7582277b8daebc Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Wed, 8 Apr 2026 14:32:41 -0400 Subject: [PATCH] fix: show cutting parameters dialog before assigning lead-ins Auto-assign lead-ins silently reused existing plate parameters with no way to change them after the first assignment. Now a dialog with the full CuttingPanel is shown every time, pre-populated with the current settings, so the user can review and modify before confirming. Co-Authored-By: Claude Opus 4.6 (1M context) --- OpenNest/Forms/CuttingParametersDialog.cs | 68 +++++++++++++++++++ OpenNest/Forms/EditNestForm.cs | 81 ++++++++++++----------- 2 files changed, 112 insertions(+), 37 deletions(-) create mode 100644 OpenNest/Forms/CuttingParametersDialog.cs diff --git a/OpenNest/Forms/CuttingParametersDialog.cs b/OpenNest/Forms/CuttingParametersDialog.cs new file mode 100644 index 0000000..d26b4a3 --- /dev/null +++ b/OpenNest/Forms/CuttingParametersDialog.cs @@ -0,0 +1,68 @@ +using OpenNest.CNC.CuttingStrategy; +using OpenNest.Controls; +using System.Drawing; +using System.Windows.Forms; + +namespace OpenNest.Forms +{ + public class CuttingParametersDialog : Form + { + private readonly CuttingPanel cuttingPanel; + + public CuttingParametersDialog() + { + Text = "Cutting Parameters"; + Size = new Size(400, 560); + FormBorderStyle = FormBorderStyle.FixedDialog; + MaximizeBox = false; + MinimizeBox = false; + StartPosition = FormStartPosition.CenterParent; + + cuttingPanel = new CuttingPanel + { + Dock = DockStyle.Fill + }; + + var buttonPanel = new Panel + { + Dock = DockStyle.Bottom, + Height = 40 + }; + + var btnOk = new Button + { + Text = "OK", + DialogResult = DialogResult.OK, + Size = new Size(80, 28), + Location = new Point(220, 6) + }; + + var btnCancel = new Button + { + Text = "Cancel", + DialogResult = DialogResult.Cancel, + Size = new Size(80, 28), + Location = new Point(305, 6) + }; + + buttonPanel.Controls.Add(btnOk); + buttonPanel.Controls.Add(btnCancel); + + Controls.Add(cuttingPanel); + Controls.Add(buttonPanel); + + AcceptButton = btnOk; + CancelButton = btnCancel; + } + + public void LoadParameters(CuttingParameters parameters) + { + cuttingPanel.LoadFromParameters(parameters); + } + + public CuttingParameters GetParameters() + { + return cuttingPanel.BuildParameters(); + } + } +} diff --git a/OpenNest/Forms/EditNestForm.cs b/OpenNest/Forms/EditNestForm.cs index 4fa4b99..845ea22 100644 --- a/OpenNest/Forms/EditNestForm.cs +++ b/OpenNest/Forms/EditNestForm.cs @@ -719,19 +719,17 @@ namespace OpenNest.Forms var plate = PlateView.Plate; - if (plate.CuttingParameters == null) - { - var json = Properties.Settings.Default.CuttingParametersJson; - if (!string.IsNullOrEmpty(json)) - { - try { plate.CuttingParameters = CuttingParametersSerializer.Deserialize(json); } - catch { plate.CuttingParameters = new CuttingParameters(); } - } - else - { - plate.CuttingParameters = new CuttingParameters(); - } - } + var parameters = LoadOrDefaultParameters(plate.CuttingParameters); + + using var dlg = new CuttingParametersDialog(); + dlg.LoadParameters(parameters); + + if (dlg.ShowDialog() != DialogResult.OK) + return; + + parameters = dlg.GetParameters(); + plate.CuttingParameters = parameters; + SaveCuttingParameters(parameters); var assigner = new LeadInAssigner { @@ -782,17 +780,16 @@ namespace OpenNest.Forms if (Nest == null) return; - CuttingParameters parameters; - var json = Properties.Settings.Default.CuttingParametersJson; - if (!string.IsNullOrEmpty(json)) - { - try { parameters = CuttingParametersSerializer.Deserialize(json); } - catch { parameters = new CuttingParameters(); } - } - else - { - parameters = new CuttingParameters(); - } + var parameters = LoadOrDefaultParameters(PlateView?.Plate?.CuttingParameters); + + using var dlg = new CuttingParametersDialog(); + dlg.LoadParameters(parameters); + + if (dlg.ShowDialog() != DialogResult.OK) + return; + + parameters = dlg.GetParameters(); + SaveCuttingParameters(parameters); var assigner = new LeadInAssigner { @@ -840,24 +837,34 @@ namespace OpenNest.Forms var plate = PlateView.Plate; - // If no cutting parameters exist, initialize from saved settings or defaults if (plate.CuttingParameters == null) - { - var json = Properties.Settings.Default.CuttingParametersJson; - if (!string.IsNullOrEmpty(json)) - { - try { plate.CuttingParameters = CuttingParametersSerializer.Deserialize(json); } - catch { plate.CuttingParameters = new CuttingParameters(); } - } - else - { - plate.CuttingParameters = new CuttingParameters(); - } - } + plate.CuttingParameters = LoadOrDefaultParameters(null); PlateView.SetAction(typeof(Actions.ActionLeadIn)); } + private static CuttingParameters LoadOrDefaultParameters(CuttingParameters existing) + { + if (existing != null) + return existing; + + var json = Properties.Settings.Default.CuttingParametersJson; + if (!string.IsNullOrEmpty(json)) + { + try { return CuttingParametersSerializer.Deserialize(json); } + catch { /* fall through */ } + } + + return new CuttingParameters(); + } + + private static void SaveCuttingParameters(CuttingParameters parameters) + { + var json = CuttingParametersSerializer.Serialize(parameters); + Properties.Settings.Default.CuttingParametersJson = json; + Properties.Settings.Default.Save(); + } + private void ImportDrawings_Click(object sender, EventArgs e) { Import();