diff --git a/OpenNest.Core/CNC/Program.cs b/OpenNest.Core/CNC/Program.cs index 4781e20..71b1587 100644 --- a/OpenNest.Core/CNC/Program.cs +++ b/OpenNest.Core/CNC/Program.cs @@ -1,6 +1,7 @@ using OpenNest.Converters; using OpenNest.Geometry; using OpenNest.Math; +using System; using System.Collections.Generic; namespace OpenNest.CNC @@ -9,6 +10,8 @@ namespace OpenNest.CNC { public List Codes; + public Dictionary Variables { get; } = new(StringComparer.OrdinalIgnoreCase); + private Mode mode; public Program(Mode mode = Mode.Absolute) @@ -454,6 +457,9 @@ namespace OpenNest.CNC pgm.Codes.AddRange(codes); + foreach (var kvp in Variables) + pgm.Variables[kvp.Key] = kvp.Value; + return pgm; } diff --git a/OpenNest.Tests/CNC/ProgramVariableTests.cs b/OpenNest.Tests/CNC/ProgramVariableTests.cs index e5146dd..a04f555 100644 --- a/OpenNest.Tests/CNC/ProgramVariableTests.cs +++ b/OpenNest.Tests/CNC/ProgramVariableTests.cs @@ -101,4 +101,35 @@ public class ProgramVariableTests move.Offset(5.0, 0); Assert.Null(move.VariableRefs); } + + [Fact] + public void Program_Variables_EmptyByDefault() + { + var pgm = new Program(); + Assert.Empty(pgm.Variables); + } + + [Fact] + public void Program_Variables_CaseInsensitive() + { + var pgm = new Program(); + pgm.Variables["Diameter"] = new VariableDefinition("Diameter", "0.3", 0.3); + Assert.True(pgm.Variables.ContainsKey("diameter")); + } + + [Fact] + public void Program_Clone_DeepCopiesVariables() + { + var pgm = new Program(); + pgm.Variables["diameter"] = new VariableDefinition("diameter", "0.3", 0.3); + pgm.Codes.Add(new LinearMove(1.0, 0)); + + var clone = (Program)pgm.Clone(); + + Assert.Single(clone.Variables); + Assert.Equal(0.3, clone.Variables["diameter"].Value); + // Verify it's a separate dictionary + clone.Variables.Remove("diameter"); + Assert.Single(pgm.Variables); + } }