feat(ui): add Open in CAD Converter to drawing context menu

Lets a single drawing be opened and edited in the CAD converter
directly from the drawing list, reusing the existing apply-back
logic from the Edit Drawings button (now shared via
EditDrawingsInConverter).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
ajandClaude Sonnet 5 committed 2026-10-17 14:59:28 -04:00
1 parent adc12e175d
commit ca09c33c38
2 files changed
+29 -3

No files matched your search

+13
View File
@@ -36,6 +36,13 @@ namespace OpenNest.Controls
SaveToLibraryRequested?.Invoke(this, drawing);
};
var saveToLibrarySeparator = new ToolStripSeparator();
var openInConverterItem = new ToolStripMenuItem("Open in CAD Converter...");
openInConverterItem.Click += (s, e) =>
{
if (SelectedItem is Drawing drawing)
OpenInConverterRequested?.Invoke(this, drawing);
};
var openInConverterSeparator = new ToolStripSeparator();
menu.ShowItemToolTips = true;
menu.Opening += (s, e) =>
{
@@ -49,9 +56,12 @@ namespace OpenNest.Controls
saveToLibraryItem.Visible = saveToLibrarySeparator.Visible = SaveToLibraryRequested != null;
saveToLibraryItem.Enabled = SaveToLibraryUnavailableReason == null;
saveToLibraryItem.ToolTipText = SaveToLibraryUnavailableReason ?? "";
openInConverterItem.Visible = openInConverterSeparator.Visible = OpenInConverterRequested != null;
};
menu.Items.Add(saveToLibraryItem);
menu.Items.Add(saveToLibrarySeparator);
menu.Items.Add(openInConverterItem);
menu.Items.Add(openInConverterSeparator);
menu.Items.Add(deleteItem);
ContextMenuStrip = menu;
}
@@ -64,6 +74,9 @@ namespace OpenNest.Controls
/// <summary>Why Save to Drawing Library is disabled, shown as its tooltip; null enables it.</summary>
public string SaveToLibraryUnavailableReason { get; set; }
/// <summary>Raised when Open in CAD Converter is chosen for the selected drawing.</summary>
public event EventHandler<Drawing> OpenInConverterRequested;
/// <summary>
/// Raised when the left button is pressed on a drawing's row.
/// </summary>
+16 -3
View File
@@ -440,6 +440,7 @@ namespace OpenNest.Forms
drawingListBox1.Units = Nest.Units;
drawingListBox1.DeleteRequested += drawingListBox1_DeleteRequested;
drawingListBox1.SaveToLibraryRequested += drawingListBox1_SaveToLibraryRequested;
drawingListBox1.OpenInConverterRequested += drawingListBox1_OpenInConverterRequested;
drawingListBox1.DrawingPickedUp += drawingListBox1_DrawingPickedUp;
drawingListBox1.DrawingDropped += drawingListBox1_DrawingDropped;
Activated += (_, _) => UpdateDrawingLibraryCommand();
@@ -1285,15 +1286,27 @@ namespace OpenNest.Forms
if (Nest.Drawings.Count == 0)
return;
EditDrawingsInConverter(Nest.Drawings);
}
private void drawingListBox1_OpenInConverterRequested(object sender, Drawing drawing)
{
EditDrawingsInConverter(new[] { drawing });
}
private void EditDrawingsInConverter(IEnumerable<Drawing> drawings)
{
var editedDrawings = drawings.ToList();
// Capture before loading the editor: its conversion can mutate programs in place.
var snapshot = DrawingProgramSnapshot.Capture(
Nest.Drawings,
editedDrawings,
program => NestWriter.GetProgramText(program) + "\0" + NestWriter.GetSubProgramsText(program)
);
var converter = new CadConverterForm();
// LoadDrawings can edit live programs even when the dialog is canceled.
PlateView.InvalidateOverlapCheck();
converter.LoadDrawings(Nest.Drawings);
converter.LoadDrawings(editedDrawings);
if (converter.ShowDialog() != DialogResult.OK)
return;
@@ -1302,7 +1315,7 @@ namespace OpenNest.Forms
var newByName = newDrawings.ToDictionary(d => d.Name);
// Update existing drawings in-place so parts keep their BaseDrawing references
foreach (var existing in Nest.Drawings.ToList())
foreach (var existing in editedDrawings)
{
if (newByName.TryGetValue(existing.Name, out var updated))
{