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:
2026-03-23 00:08:31 -04:00
parent da8e7e6fd3
commit 5936272ce4
7 changed files with 88 additions and 3 deletions

View File

@@ -1,4 +1,4 @@
namespace OpenNest.Posts.Cincinnati
namespace OpenNest.CNC
{
public sealed class ProgramVariable
{

View File

@@ -2,7 +2,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace OpenNest.Posts.Cincinnati
namespace OpenNest.CNC
{
public sealed class ProgramVariableManager
{

View File

@@ -1,23 +1,63 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using OpenNest.CNC;
namespace OpenNest.Posts.Cincinnati
{
public sealed class CincinnatiPostProcessor : IPostProcessor
{
private static readonly JsonSerializerOptions JsonOptions = new()
{
WriteIndented = true,
Converters = { new JsonStringEnumConverter() }
};
public string Name => "Cincinnati CL-707";
public string Author => "OpenNest";
public string Description => "Cincinnati CL-707/CL-800/CL-900/CL-940/CLX family";
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)
{
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)
{
// 1. Create variable manager and register standard variables

View File

@@ -1,6 +1,7 @@
using System;
using System.IO;
using OpenNest;
using OpenNest.CNC;
namespace OpenNest.Posts.Cincinnati;

View File

@@ -1,5 +1,7 @@
using System.IO;
using System.Text;
using System.Text.Json;
using System.Text.Json.Serialization;
using OpenNest.CNC;
using OpenNest.Geometry;
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()
{
var nest = new Nest("TestNest");

View File

@@ -1,5 +1,6 @@
using System.IO;
using System.Text;
using OpenNest.CNC;
using OpenNest.Posts.Cincinnati;
namespace OpenNest.Tests.Cincinnati;

View File

@@ -1,4 +1,4 @@
using OpenNest.Posts.Cincinnati;
using OpenNest.CNC;
namespace OpenNest.Tests.Cincinnati;