diff --git a/OpenNest.Tests/CincinnatiCIFiber/CIFiberPostProcessorTests.cs b/OpenNest.Tests/CincinnatiCIFiber/CIFiberPostProcessorTests.cs index d4a1138..c06ce18 100644 --- a/OpenNest.Tests/CincinnatiCIFiber/CIFiberPostProcessorTests.cs +++ b/OpenNest.Tests/CincinnatiCIFiber/CIFiberPostProcessorTests.cs @@ -309,4 +309,24 @@ public class CIFiberPostProcessorTests Assert.Contains("G0X50Y50", output); Assert.Contains("V.E.R3=1", output); } + + [Fact] + public void MaterialCodes_MatchIgnoringCase_AfterJsonReload() + { + var options = new System.Text.Json.JsonSerializerOptions(); + var json = System.Text.Json.JsonSerializer.Serialize( + new CIFiberPostConfig + { + MaterialCodes = new() { ["Stainless"] = "SSN" }, + DefaultMaterialCode = "MSN", + }, + options + ); + + var config = System.Text.Json.JsonSerializer.Deserialize(json, options)!; + + Assert.Equal("SSN", config.ResolveMaterialCode("stainless")); + Assert.Equal("SSN", config.ResolveMaterialCode(" STAINLESS ")); + Assert.Equal("MSN", config.ResolveMaterialCode("Aluminum")); + } } diff --git a/Posts/OpenNest.Posts.CincinnatiCIFiber/CIFiberPostConfig.cs b/Posts/OpenNest.Posts.CincinnatiCIFiber/CIFiberPostConfig.cs index a5f1711..ead1ccc 100644 --- a/Posts/OpenNest.Posts.CincinnatiCIFiber/CIFiberPostConfig.cs +++ b/Posts/OpenNest.Posts.CincinnatiCIFiber/CIFiberPostConfig.cs @@ -139,12 +139,36 @@ namespace OpenNest.Posts.CincinnatiCIFiber [PostSetting(MacrosSection, 6)] public string ProgramEndMacro { get; set; } = "PROGRAMEND.NC"; - /// Material name (case-insensitive) to machine material code map for V.E.MATERIAL. + /// + /// Material name (case-insensitive) to machine material code map for + /// V.E.MATERIAL. The setter re-keys any assigned map (including one + /// deserialized from JSON, which is case-sensitive) case-insensitively; + /// if names collide by case, the later entry wins. + /// [DisplayName("Material codes")] [Description("Material name (not case-sensitive) and the code written to V.E.MATERIAL.")] [PostSetting(MaterialSection, 0, KeyHeader = "Material name", ValueHeader = "Machine code")] - public Dictionary MaterialCodes { get; set; } = - new(StringComparer.OrdinalIgnoreCase) { ["Mild Steel"] = "MSN" }; + public Dictionary MaterialCodes + { + get => _materialCodes; + set => _materialCodes = IgnoreCase(value); + } + + private Dictionary _materialCodes = new(StringComparer.OrdinalIgnoreCase) + { + ["Mild Steel"] = "MSN", + }; + + private static Dictionary IgnoreCase(Dictionary map) + { + if (map == null || map.Comparer == StringComparer.OrdinalIgnoreCase) + return map; + + var copy = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var entry in map) + copy[entry.Key] = entry.Value; + return copy; + } /// Fallback V.E.MATERIAL code when the material name has no mapping. [DisplayName("Default material code")]