refactor: move ProgramVariableManager to Core, add config file support
- Move ProgramVariable and ProgramVariableManager from OpenNest.Posts.Cincinnati to OpenNest.Core/CNC (namespace OpenNest.CNC) so they can be used internally in nest programs - Add parameterless constructor to CincinnatiPostProcessor that loads config from a .json file next to the DLL (creates defaults on first run) - Enums serialize as readable strings (e.g., "Inches", "ControllerSide") - Config file: OpenNest.Posts.Cincinnati.json in the Posts/ directory Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
namespace OpenNest.Posts.Cincinnati
|
namespace OpenNest.CNC
|
||||||
{
|
{
|
||||||
public sealed class ProgramVariable
|
public sealed class ProgramVariable
|
||||||
{
|
{
|
||||||
+1
-1
@@ -2,7 +2,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace OpenNest.Posts.Cincinnati
|
namespace OpenNest.CNC
|
||||||
{
|
{
|
||||||
public sealed class ProgramVariableManager
|
public sealed class ProgramVariableManager
|
||||||
{
|
{
|
||||||
@@ -1,23 +1,63 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
using OpenNest.CNC;
|
||||||
|
|
||||||
namespace OpenNest.Posts.Cincinnati
|
namespace OpenNest.Posts.Cincinnati
|
||||||
{
|
{
|
||||||
public sealed class CincinnatiPostProcessor : IPostProcessor
|
public sealed class CincinnatiPostProcessor : IPostProcessor
|
||||||
{
|
{
|
||||||
|
private static readonly JsonSerializerOptions JsonOptions = new()
|
||||||
|
{
|
||||||
|
WriteIndented = true,
|
||||||
|
Converters = { new JsonStringEnumConverter() }
|
||||||
|
};
|
||||||
|
|
||||||
public string Name => "Cincinnati CL-707";
|
public string Name => "Cincinnati CL-707";
|
||||||
public string Author => "OpenNest";
|
public string Author => "OpenNest";
|
||||||
public string Description => "Cincinnati CL-707/CL-800/CL-900/CL-940/CLX family";
|
public string Description => "Cincinnati CL-707/CL-800/CL-900/CL-940/CLX family";
|
||||||
|
|
||||||
public CincinnatiPostConfig Config { get; }
|
public CincinnatiPostConfig Config { get; }
|
||||||
|
|
||||||
|
public CincinnatiPostProcessor()
|
||||||
|
{
|
||||||
|
var configPath = GetConfigPath();
|
||||||
|
if (File.Exists(configPath))
|
||||||
|
{
|
||||||
|
var json = File.ReadAllText(configPath);
|
||||||
|
Config = JsonSerializer.Deserialize<CincinnatiPostConfig>(json, JsonOptions);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Config = new CincinnatiPostConfig();
|
||||||
|
SaveConfig();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public CincinnatiPostProcessor(CincinnatiPostConfig config)
|
public CincinnatiPostProcessor(CincinnatiPostConfig config)
|
||||||
{
|
{
|
||||||
Config = config;
|
Config = config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SaveConfig()
|
||||||
|
{
|
||||||
|
var configPath = GetConfigPath();
|
||||||
|
var json = JsonSerializer.Serialize(Config, JsonOptions);
|
||||||
|
File.WriteAllText(configPath, json);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetConfigPath()
|
||||||
|
{
|
||||||
|
var assemblyPath = typeof(CincinnatiPostProcessor).Assembly.Location;
|
||||||
|
var dir = Path.GetDirectoryName(assemblyPath);
|
||||||
|
var name = Path.GetFileNameWithoutExtension(assemblyPath);
|
||||||
|
return Path.Combine(dir, name + ".json");
|
||||||
|
}
|
||||||
|
|
||||||
public void Post(Nest nest, Stream outputStream)
|
public void Post(Nest nest, Stream outputStream)
|
||||||
{
|
{
|
||||||
// 1. Create variable manager and register standard variables
|
// 1. Create variable manager and register standard variables
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using OpenNest;
|
using OpenNest;
|
||||||
|
using OpenNest.CNC;
|
||||||
|
|
||||||
namespace OpenNest.Posts.Cincinnati;
|
namespace OpenNest.Posts.Cincinnati;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
using OpenNest.CNC;
|
using OpenNest.CNC;
|
||||||
using OpenNest.Geometry;
|
using OpenNest.Geometry;
|
||||||
using OpenNest.Posts.Cincinnati;
|
using OpenNest.Posts.Cincinnati;
|
||||||
@@ -96,6 +98,47 @@ public class CincinnatiPostProcessorTests
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void Config_RoundTripsAsJson()
|
||||||
|
{
|
||||||
|
var config = new CincinnatiPostConfig
|
||||||
|
{
|
||||||
|
ConfigurationName = "CL940_CORONA",
|
||||||
|
DefaultLibraryFile = "MS135N2PANEL.lib",
|
||||||
|
PostedUnits = Units.Inches,
|
||||||
|
KerfCompensation = KerfMode.ControllerSide,
|
||||||
|
UseAntiDive = true
|
||||||
|
};
|
||||||
|
|
||||||
|
var opts = new JsonSerializerOptions
|
||||||
|
{
|
||||||
|
WriteIndented = true,
|
||||||
|
Converters = { new JsonStringEnumConverter() }
|
||||||
|
};
|
||||||
|
var json = JsonSerializer.Serialize(config, opts);
|
||||||
|
var deserialized = JsonSerializer.Deserialize<CincinnatiPostConfig>(json, opts);
|
||||||
|
|
||||||
|
Assert.Equal("CL940_CORONA", deserialized.ConfigurationName);
|
||||||
|
Assert.Equal("MS135N2PANEL.lib", deserialized.DefaultLibraryFile);
|
||||||
|
Assert.Equal(Units.Inches, deserialized.PostedUnits);
|
||||||
|
Assert.Equal(KerfMode.ControllerSide, deserialized.KerfCompensation);
|
||||||
|
Assert.True(deserialized.UseAntiDive);
|
||||||
|
|
||||||
|
// Enums serialize as strings
|
||||||
|
Assert.Contains("\"Inches\"", json);
|
||||||
|
Assert.Contains("\"ControllerSide\"", json);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void ParameterlessConstructor_LoadsOrCreatesConfig()
|
||||||
|
{
|
||||||
|
// The parameterless constructor reads from a .json file next to the assembly,
|
||||||
|
// or creates defaults if none exists. Either way, Config should be non-null.
|
||||||
|
var post = new CincinnatiPostProcessor();
|
||||||
|
Assert.NotNull(post.Config);
|
||||||
|
Assert.Equal("CL940", post.Config.ConfigurationName);
|
||||||
|
}
|
||||||
|
|
||||||
private static Nest CreateTestNest()
|
private static Nest CreateTestNest()
|
||||||
{
|
{
|
||||||
var nest = new Nest("TestNest");
|
var nest = new Nest("TestNest");
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using OpenNest.CNC;
|
||||||
using OpenNest.Posts.Cincinnati;
|
using OpenNest.Posts.Cincinnati;
|
||||||
|
|
||||||
namespace OpenNest.Tests.Cincinnati;
|
namespace OpenNest.Tests.Cincinnati;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using OpenNest.Posts.Cincinnati;
|
using OpenNest.CNC;
|
||||||
|
|
||||||
namespace OpenNest.Tests.Cincinnati;
|
namespace OpenNest.Tests.Cincinnati;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user