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) <noreply@anthropic.com>
This commit is contained in:
2026-04-08 14:32:41 -04:00
parent ba89967448
commit 786b6e2e88
2 changed files with 112 additions and 37 deletions

View File

@@ -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();
}
}
}

View File

@@ -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();