From 28653e3a9fa119df8612b8b903e5c1aadd64cddf Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Thu, 16 Apr 2026 15:48:45 -0400 Subject: [PATCH] feat(shapes): generate unique drawing names from parameters and add toolbar button Shape library drawings now get descriptive names based on their parameters (e.g. "Rectangle 12x6", "Circle 8 Dia") instead of generic type names, preventing silent duplicates in the DrawingCollection HashSet. Added a Shape Library button to the Drawings tab toolbar and removed separators between toolbar buttons for a cleaner look. Co-Authored-By: Claude Opus 4.6 (1M context) --- OpenNest.Core/Shapes/CircleShape.cs | 2 + .../Shapes/IsoscelesTriangleShape.cs | 2 + OpenNest.Core/Shapes/LShape.cs | 2 + OpenNest.Core/Shapes/NgonShape.cs | 2 + OpenNest.Core/Shapes/PipeFlangeShape.cs | 8 ++++ OpenNest.Core/Shapes/RectangleShape.cs | 2 + OpenNest.Core/Shapes/RightTriangleShape.cs | 2 + OpenNest.Core/Shapes/RingShape.cs | 2 + OpenNest.Core/Shapes/RoundedRectangleShape.cs | 2 + OpenNest.Core/Shapes/ShapeDefinition.cs | 10 ++++ OpenNest.Core/Shapes/TShape.cs | 2 + OpenNest.Core/Shapes/TrapezoidShape.cs | 2 + OpenNest/Forms/EditNestForm.Designer.cs | 45 +++++++----------- OpenNest/Forms/EditNestForm.cs | 12 +++++ OpenNest/Forms/MainForm.cs | 2 +- OpenNest/Forms/ShapeLibraryForm.cs | 23 ++++++++- OpenNest/Properties/Resources.Designer.cs | 12 ++++- OpenNest/Properties/Resources.resx | 3 ++ OpenNest/Resources/shapes.png | Bin 0 -> 19621 bytes 19 files changed, 105 insertions(+), 30 deletions(-) create mode 100644 OpenNest/Resources/shapes.png diff --git a/OpenNest.Core/Shapes/CircleShape.cs b/OpenNest.Core/Shapes/CircleShape.cs index 1375abc..89fe138 100644 --- a/OpenNest.Core/Shapes/CircleShape.cs +++ b/OpenNest.Core/Shapes/CircleShape.cs @@ -7,6 +7,8 @@ namespace OpenNest.Shapes { public double Diameter { get; set; } + public override string GenerateName() => $"Circle {Dim(Diameter)} Dia"; + public override void SetPreviewDefaults() { Diameter = 8; diff --git a/OpenNest.Core/Shapes/IsoscelesTriangleShape.cs b/OpenNest.Core/Shapes/IsoscelesTriangleShape.cs index 499f55f..5771830 100644 --- a/OpenNest.Core/Shapes/IsoscelesTriangleShape.cs +++ b/OpenNest.Core/Shapes/IsoscelesTriangleShape.cs @@ -8,6 +8,8 @@ namespace OpenNest.Shapes public double Base { get; set; } public double Height { get; set; } + public override string GenerateName() => $"Isosceles Triangle {Dim(Base)}x{Dim(Height)}"; + public override void SetPreviewDefaults() { Base = 8; diff --git a/OpenNest.Core/Shapes/LShape.cs b/OpenNest.Core/Shapes/LShape.cs index c91c9fd..9e54ffb 100644 --- a/OpenNest.Core/Shapes/LShape.cs +++ b/OpenNest.Core/Shapes/LShape.cs @@ -10,6 +10,8 @@ namespace OpenNest.Shapes public double LegWidth { get; set; } public double LegHeight { get; set; } + public override string GenerateName() => $"L {Dim(Width)}x{Dim(Height)}"; + public override void SetPreviewDefaults() { Width = 8; diff --git a/OpenNest.Core/Shapes/NgonShape.cs b/OpenNest.Core/Shapes/NgonShape.cs index ee631c7..55238c1 100644 --- a/OpenNest.Core/Shapes/NgonShape.cs +++ b/OpenNest.Core/Shapes/NgonShape.cs @@ -8,6 +8,8 @@ namespace OpenNest.Shapes public int Sides { get; set; } public double Width { get; set; } + public override string GenerateName() => $"{Sides}-Sided Polygon {Dim(Width)}"; + public override void SetPreviewDefaults() { Sides = 8; diff --git a/OpenNest.Core/Shapes/PipeFlangeShape.cs b/OpenNest.Core/Shapes/PipeFlangeShape.cs index 7c5de3d..980fd79 100644 --- a/OpenNest.Core/Shapes/PipeFlangeShape.cs +++ b/OpenNest.Core/Shapes/PipeFlangeShape.cs @@ -13,6 +13,14 @@ namespace OpenNest.Shapes public double PipeClearance { get; set; } public bool Blind { get; set; } + public override string GenerateName() + { + var name = $"Pipe Flange {Dim(OD)} OD"; + if (!string.IsNullOrEmpty(PipeSize)) + name += $" {PipeSize} Pipe"; + return name; + } + public override void SetPreviewDefaults() { OD = 7.5; diff --git a/OpenNest.Core/Shapes/RectangleShape.cs b/OpenNest.Core/Shapes/RectangleShape.cs index dc7b2e6..5914dc8 100644 --- a/OpenNest.Core/Shapes/RectangleShape.cs +++ b/OpenNest.Core/Shapes/RectangleShape.cs @@ -8,6 +8,8 @@ namespace OpenNest.Shapes public double Length { get; set; } public double Width { get; set; } + public override string GenerateName() => $"Rectangle {Dim(Length)}x{Dim(Width)}"; + public override void SetPreviewDefaults() { Length = 12; diff --git a/OpenNest.Core/Shapes/RightTriangleShape.cs b/OpenNest.Core/Shapes/RightTriangleShape.cs index 7fef22b..7aec564 100644 --- a/OpenNest.Core/Shapes/RightTriangleShape.cs +++ b/OpenNest.Core/Shapes/RightTriangleShape.cs @@ -8,6 +8,8 @@ namespace OpenNest.Shapes public double Width { get; set; } public double Height { get; set; } + public override string GenerateName() => $"Right Triangle {Dim(Width)}x{Dim(Height)}"; + public override void SetPreviewDefaults() { Width = 8; diff --git a/OpenNest.Core/Shapes/RingShape.cs b/OpenNest.Core/Shapes/RingShape.cs index 991ba4d..ba60ce8 100644 --- a/OpenNest.Core/Shapes/RingShape.cs +++ b/OpenNest.Core/Shapes/RingShape.cs @@ -8,6 +8,8 @@ namespace OpenNest.Shapes public double OuterDiameter { get; set; } public double InnerDiameter { get; set; } + public override string GenerateName() => $"Ring {Dim(OuterDiameter)}x{Dim(InnerDiameter)}"; + public override void SetPreviewDefaults() { OuterDiameter = 10; diff --git a/OpenNest.Core/Shapes/RoundedRectangleShape.cs b/OpenNest.Core/Shapes/RoundedRectangleShape.cs index dc5314c..0a61887 100644 --- a/OpenNest.Core/Shapes/RoundedRectangleShape.cs +++ b/OpenNest.Core/Shapes/RoundedRectangleShape.cs @@ -10,6 +10,8 @@ namespace OpenNest.Shapes public double Width { get; set; } public double Radius { get; set; } + public override string GenerateName() => $"Rounded Rectangle {Dim(Length)}x{Dim(Width)} R{Dim(Radius)}"; + public override void SetPreviewDefaults() { Length = 12; diff --git a/OpenNest.Core/Shapes/ShapeDefinition.cs b/OpenNest.Core/Shapes/ShapeDefinition.cs index f078ba5..3aef511 100644 --- a/OpenNest.Core/Shapes/ShapeDefinition.cs +++ b/OpenNest.Core/Shapes/ShapeDefinition.cs @@ -26,6 +26,14 @@ namespace OpenNest.Shapes public abstract Drawing GetDrawing(); + public virtual string GenerateName() + { + var typeName = GetType().Name; + return typeName.EndsWith("Shape") + ? typeName.Substring(0, typeName.Length - 5) + : typeName; + } + public virtual void SetPreviewDefaults() { } public static List LoadFromJson(string path) where T : ShapeDefinition @@ -34,6 +42,8 @@ namespace OpenNest.Shapes return JsonSerializer.Deserialize>(json, JsonOptions); } + protected static string Dim(double value) => value.ToString("0.###"); + protected Drawing CreateDrawing(List entities) { var pgm = ConvertGeometry.ToProgram(entities); diff --git a/OpenNest.Core/Shapes/TShape.cs b/OpenNest.Core/Shapes/TShape.cs index d889479..8a8bfee 100644 --- a/OpenNest.Core/Shapes/TShape.cs +++ b/OpenNest.Core/Shapes/TShape.cs @@ -10,6 +10,8 @@ namespace OpenNest.Shapes public double StemWidth { get; set; } public double BarHeight { get; set; } + public override string GenerateName() => $"T {Dim(Width)}x{Dim(Height)}"; + public override void SetPreviewDefaults() { Width = 10; diff --git a/OpenNest.Core/Shapes/TrapezoidShape.cs b/OpenNest.Core/Shapes/TrapezoidShape.cs index 7414bc6..660c9be 100644 --- a/OpenNest.Core/Shapes/TrapezoidShape.cs +++ b/OpenNest.Core/Shapes/TrapezoidShape.cs @@ -9,6 +9,8 @@ namespace OpenNest.Shapes public double BottomWidth { get; set; } public double Height { get; set; } + public override string GenerateName() => $"Trapezoid {Dim(TopWidth)}x{Dim(BottomWidth)}x{Dim(Height)}"; + public override void SetPreviewDefaults() { TopWidth = 6; diff --git a/OpenNest/Forms/EditNestForm.Designer.cs b/OpenNest/Forms/EditNestForm.Designer.cs index 479b0c5..03449da 100644 --- a/OpenNest/Forms/EditNestForm.Designer.cs +++ b/OpenNest/Forms/EditNestForm.Designer.cs @@ -47,11 +47,9 @@ drawingListBox1 = new OpenNest.Controls.DrawingListBox(); toolStrip2 = new System.Windows.Forms.ToolStrip(); toolStripButton2 = new System.Windows.Forms.ToolStripButton(); - toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + shapeLibraryButton = new System.Windows.Forms.ToolStripButton(); editDrawingsButton = new System.Windows.Forms.ToolStripButton(); - toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); toolStripButton3 = new System.Windows.Forms.ToolStripButton(); - toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); hideNestedButton = new System.Windows.Forms.ToolStripButton(); ((System.ComponentModel.ISupportInitialize)splitContainer).BeginInit(); splitContainer.Panel1.SuspendLayout(); @@ -219,7 +217,7 @@ // toolStrip2.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; toolStrip2.ImageScalingSize = new System.Drawing.Size(20, 20); - toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripButton2, toolStripSeparator4, editDrawingsButton, toolStripSeparator1, toolStripButton3, toolStripSeparator2, hideNestedButton }); + toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { toolStripButton2, shapeLibraryButton, editDrawingsButton, toolStripButton3, hideNestedButton }); toolStrip2.Location = new System.Drawing.Point(4, 3); toolStrip2.Name = "toolStrip2"; toolStrip2.Size = new System.Drawing.Size(265, 27); @@ -237,14 +235,19 @@ toolStripButton2.Size = new System.Drawing.Size(34, 24); toolStripButton2.Text = "Import Drawings"; toolStripButton2.Click += ImportDrawings_Click; - // - // toolStripSeparator4 - // - toolStripSeparator4.Name = "toolStripSeparator4"; - toolStripSeparator4.Size = new System.Drawing.Size(6, 27); - // + // + // shapeLibraryButton + // + shapeLibraryButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + shapeLibraryButton.Image = Properties.Resources.shapes; + shapeLibraryButton.Name = "shapeLibraryButton"; + shapeLibraryButton.Padding = new System.Windows.Forms.Padding(5, 0, 5, 0); + shapeLibraryButton.Size = new System.Drawing.Size(34, 24); + shapeLibraryButton.Text = "Shape Library"; + shapeLibraryButton.Click += ShapeLibrary_Click; + // // editDrawingsButton - // + // editDrawingsButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; editDrawingsButton.Image = (System.Drawing.Image)resources.GetObject("editDrawingsButton.Image"); editDrawingsButton.Name = "editDrawingsButton"; @@ -252,14 +255,9 @@ editDrawingsButton.Size = new System.Drawing.Size(34, 24); editDrawingsButton.Text = "Edit Drawings in Converter"; editDrawingsButton.Click += EditDrawingsInConverter_Click; - // - // toolStripSeparator1 - // - toolStripSeparator1.Name = "toolStripSeparator1"; - toolStripSeparator1.Size = new System.Drawing.Size(6, 27); - // + // // toolStripButton3 - // + // toolStripButton3.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; toolStripButton3.Image = (System.Drawing.Image)resources.GetObject("toolStripButton3.Image"); toolStripButton3.Name = "toolStripButton3"; @@ -268,12 +266,7 @@ toolStripButton3.Size = new System.Drawing.Size(34, 24); toolStripButton3.Text = "Cleanup unused Drawings"; toolStripButton3.Click += CleanUnusedDrawings_Click; - // - // toolStripSeparator2 - // - toolStripSeparator2.Name = "toolStripSeparator2"; - toolStripSeparator2.Size = new System.Drawing.Size(6, 27); - // + // // hideNestedButton // hideNestedButton.CheckOnClick = true; @@ -329,11 +322,9 @@ private System.Windows.Forms.ColumnHeader utilColumn; private System.Windows.Forms.ToolStrip toolStrip2; private System.Windows.Forms.ToolStripButton toolStripButton2; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.ToolStripButton shapeLibraryButton; private System.Windows.Forms.ToolStripButton editDrawingsButton; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripButton toolStripButton3; - private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; private System.Windows.Forms.ToolStripButton hideNestedButton; private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; private System.Windows.Forms.ToolStripButton toolStripLabel1; diff --git a/OpenNest/Forms/EditNestForm.cs b/OpenNest/Forms/EditNestForm.cs index f26abcc..1e68e2e 100644 --- a/OpenNest/Forms/EditNestForm.cs +++ b/OpenNest/Forms/EditNestForm.cs @@ -875,6 +875,18 @@ namespace OpenNest.Forms Import(); } + private void ShapeLibrary_Click(object sender, EventArgs e) + { + var form = new ShapeLibraryForm(Nest.Drawings.Select(d => d.Name)); + form.ShowDialog(); + + var drawings = form.GetDrawings(); + if (drawings.Count == 0) return; + + drawings.ForEach(d => Nest.Drawings.Add(d)); + UpdateDrawingList(); + } + private void EditDrawingsInConverter_Click(object sender, EventArgs e) { if (Nest.Drawings.Count == 0) diff --git a/OpenNest/Forms/MainForm.cs b/OpenNest/Forms/MainForm.cs index 566eae4..09f8e51 100644 --- a/OpenNest/Forms/MainForm.cs +++ b/OpenNest/Forms/MainForm.cs @@ -837,7 +837,7 @@ namespace OpenNest.Forms { if (activeForm == null) return; - var form = new ShapeLibraryForm(); + var form = new ShapeLibraryForm(activeForm.Nest.Drawings.Select(d => d.Name)); form.ShowDialog(); var drawings = form.GetDrawings(); diff --git a/OpenNest/Forms/ShapeLibraryForm.cs b/OpenNest/Forms/ShapeLibraryForm.cs index 3c9e6bd..123ab7f 100644 --- a/OpenNest/Forms/ShapeLibraryForm.cs +++ b/OpenNest/Forms/ShapeLibraryForm.cs @@ -21,12 +21,17 @@ namespace OpenNest.Forms private readonly List addedDrawings = new List(); private readonly List shapeEntries = new List(); private readonly List parameterBindings = new List(); + private readonly HashSet existingNames; private ShapeEntry selectedEntry; private bool suppressPreview; - public ShapeLibraryForm() + public ShapeLibraryForm(IEnumerable existingDrawingNames = null) { + existingNames = existingDrawingNames != null + ? new HashSet(existingDrawingNames, StringComparer.OrdinalIgnoreCase) + : new HashSet(StringComparer.OrdinalIgnoreCase); + InitializeComponent(); DiscoverShapes(); PopulateShapeList(); @@ -259,6 +264,7 @@ namespace OpenNest.Forms if (shape == null) return; var drawing = shape.GetDrawing(); + nameTextBox.Text = shape.GenerateName(); previewBox.ShowDrawing(drawing); if (drawing?.Program != null) @@ -405,10 +411,12 @@ namespace OpenNest.Forms if (shape == null) return; var drawing = shape.GetDrawing(); + drawing.Name = GetUniqueName(drawing.Name); drawing.Color = Drawing.GetNextColor(); drawing.Quantity.Required = (int)quantityUpDown.Value; addedDrawings.Add(drawing); + existingNames.Add(drawing.Name); DialogResult = DialogResult.OK; addButton.Text = $"Added ({addedDrawings.Count})"; @@ -423,6 +431,19 @@ namespace OpenNest.Forms } } + private string GetUniqueName(string baseName) + { + if (!existingNames.Contains(baseName)) + return baseName; + + for (var i = 2; ; i++) + { + var candidate = $"{baseName} ({i})"; + if (!existingNames.Contains(candidate)) + return candidate; + } + } + private static string FriendlyName(string name) { if (name.EndsWith("Shape")) diff --git a/OpenNest/Properties/Resources.Designer.cs b/OpenNest/Properties/Resources.Designer.cs index 6873a6e..099fce3 100644 --- a/OpenNest/Properties/Resources.Designer.cs +++ b/OpenNest/Properties/Resources.Designer.cs @@ -249,7 +249,17 @@ namespace OpenNest.Properties { return ((System.Drawing.Bitmap)(obj)); } } - + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap shapes { + get { + object obj = ResourceManager.GetObject("shapes", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// Looks up a localized resource of type System.Drawing.Bitmap. /// diff --git a/OpenNest/Properties/Resources.resx b/OpenNest/Properties/Resources.resx index dbaeb93..327c346 100644 --- a/OpenNest/Properties/Resources.resx +++ b/OpenNest/Properties/Resources.resx @@ -187,4 +187,7 @@ ..\Resources\delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\shapes.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/OpenNest/Resources/shapes.png b/OpenNest/Resources/shapes.png new file mode 100644 index 0000000000000000000000000000000000000000..c31e38ae5394270cb79f891c92219ff5b97d1cde GIT binary patch literal 19621 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 literal 0 HcmV?d00001