diff --git a/OpenNest/Controls/DrawingListBox.cs b/OpenNest/Controls/DrawingListBox.cs index 2f5bdf63..1c8834dd 100644 --- a/OpenNest/Controls/DrawingListBox.cs +++ b/OpenNest/Controls/DrawingListBox.cs @@ -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 /// Why Save to Drawing Library is disabled, shown as its tooltip; null enables it. public string SaveToLibraryUnavailableReason { get; set; } + /// Raised when Open in CAD Converter is chosen for the selected drawing. + public event EventHandler OpenInConverterRequested; + /// /// Raised when the left button is pressed on a drawing's row. /// diff --git a/OpenNest/Forms/EditNestForm.cs b/OpenNest/Forms/EditNestForm.cs index e372ac5d..d22084a0 100644 --- a/OpenNest/Forms/EditNestForm.cs +++ b/OpenNest/Forms/EditNestForm.cs @@ -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 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)) {