feat: add MachineConfig, MaterialConfig, MachineSummary with parameter lookup
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,26 @@
|
|||||||
|
using OpenNest.Math;
|
||||||
|
|
||||||
|
namespace OpenNest.Data;
|
||||||
|
|
||||||
|
public class MachineConfig
|
||||||
|
{
|
||||||
|
public Guid Id { get; set; } = Guid.NewGuid();
|
||||||
|
public int SchemaVersion { get; set; } = 1;
|
||||||
|
public string Name { get; set; } = "";
|
||||||
|
public MachineType Type { get; set; } = MachineType.Laser;
|
||||||
|
public UnitSystem Units { get; set; } = UnitSystem.Inches;
|
||||||
|
public List<MaterialConfig> Materials { get; set; } = new();
|
||||||
|
|
||||||
|
public ThicknessConfig? GetParameters(string material, double thickness)
|
||||||
|
{
|
||||||
|
var mat = GetMaterial(material);
|
||||||
|
if (mat is null) return null;
|
||||||
|
return mat.Thicknesses.FirstOrDefault(t => t.Value.IsEqualTo(thickness));
|
||||||
|
}
|
||||||
|
|
||||||
|
public MaterialConfig? GetMaterial(string name)
|
||||||
|
{
|
||||||
|
return Materials.FirstOrDefault(m =>
|
||||||
|
string.Equals(m.Name, name, StringComparison.OrdinalIgnoreCase));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
namespace OpenNest.Data;
|
||||||
|
|
||||||
|
public record MachineSummary(Guid Id, string Name);
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
namespace OpenNest.Data;
|
||||||
|
|
||||||
|
public class MaterialConfig
|
||||||
|
{
|
||||||
|
public string Name { get; set; } = "";
|
||||||
|
public string Grade { get; set; } = "";
|
||||||
|
public double Density { get; set; }
|
||||||
|
public List<ThicknessConfig> Thicknesses { get; set; } = new();
|
||||||
|
}
|
||||||
@@ -3,6 +3,8 @@
|
|||||||
<TargetFramework>net8.0-windows</TargetFramework>
|
<TargetFramework>net8.0-windows</TargetFramework>
|
||||||
<RootNamespace>OpenNest.Data</RootNamespace>
|
<RootNamespace>OpenNest.Data</RootNamespace>
|
||||||
<AssemblyName>OpenNest.Data</AssemblyName>
|
<AssemblyName>OpenNest.Data</AssemblyName>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\OpenNest.Core\OpenNest.Core.csproj" />
|
<ProjectReference Include="..\OpenNest.Core\OpenNest.Core.csproj" />
|
||||||
|
|||||||
@@ -0,0 +1,131 @@
|
|||||||
|
using OpenNest.Data;
|
||||||
|
|
||||||
|
namespace OpenNest.Tests.Data;
|
||||||
|
|
||||||
|
public class MachineConfigTests
|
||||||
|
{
|
||||||
|
private static MachineConfig CreateTestMachine()
|
||||||
|
{
|
||||||
|
return new MachineConfig
|
||||||
|
{
|
||||||
|
Id = Guid.NewGuid(),
|
||||||
|
Name = "Test Laser",
|
||||||
|
Type = MachineType.Laser,
|
||||||
|
Units = UnitSystem.Inches,
|
||||||
|
Materials = new List<MaterialConfig>
|
||||||
|
{
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Name = "Mild Steel",
|
||||||
|
Grade = "A36",
|
||||||
|
Density = 0.2836,
|
||||||
|
Thicknesses = new List<ThicknessConfig>
|
||||||
|
{
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Value = 0.250,
|
||||||
|
Kerf = 0.012,
|
||||||
|
AssistGas = "O2",
|
||||||
|
LeadIn = new LeadConfig { Type = "Arc", Radius = 0.25 },
|
||||||
|
LeadOut = new LeadConfig { Type = "Line", Length = 0.125 },
|
||||||
|
PlateSizes = new List<string> { "60x120", "48x96" }
|
||||||
|
},
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Value = 0.500,
|
||||||
|
Kerf = 0.020,
|
||||||
|
AssistGas = "O2",
|
||||||
|
LeadIn = new LeadConfig { Type = "Arc", Radius = 0.375 },
|
||||||
|
LeadOut = new LeadConfig { Type = "Line", Length = 0.25 },
|
||||||
|
PlateSizes = new List<string> { "60x120" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Name = "Stainless Steel",
|
||||||
|
Grade = "304",
|
||||||
|
Density = 0.289,
|
||||||
|
Thicknesses = new List<ThicknessConfig>
|
||||||
|
{
|
||||||
|
new()
|
||||||
|
{
|
||||||
|
Value = 0.250,
|
||||||
|
Kerf = 0.014,
|
||||||
|
AssistGas = "N2"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetParameters_ExactMatch_ReturnsThickness()
|
||||||
|
{
|
||||||
|
var machine = CreateTestMachine();
|
||||||
|
var result = machine.GetParameters("Mild Steel", 0.250);
|
||||||
|
Assert.NotNull(result);
|
||||||
|
Assert.Equal(0.012, result.Kerf);
|
||||||
|
Assert.Equal("O2", result.AssistGas);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetParameters_WithinTolerance_ReturnsThickness()
|
||||||
|
{
|
||||||
|
var machine = CreateTestMachine();
|
||||||
|
var result = machine.GetParameters("Mild Steel", 0.250001);
|
||||||
|
Assert.NotNull(result);
|
||||||
|
Assert.Equal(0.012, result.Kerf);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetParameters_NoMatch_ReturnsNull()
|
||||||
|
{
|
||||||
|
var machine = CreateTestMachine();
|
||||||
|
var result = machine.GetParameters("Mild Steel", 0.375);
|
||||||
|
Assert.Null(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetParameters_CaseInsensitiveMaterial()
|
||||||
|
{
|
||||||
|
var machine = CreateTestMachine();
|
||||||
|
var result = machine.GetParameters("mild steel", 0.250);
|
||||||
|
Assert.NotNull(result);
|
||||||
|
Assert.Equal(0.012, result.Kerf);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetParameters_UnknownMaterial_ReturnsNull()
|
||||||
|
{
|
||||||
|
var machine = CreateTestMachine();
|
||||||
|
var result = machine.GetParameters("Titanium", 0.250);
|
||||||
|
Assert.Null(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetMaterial_ReturnsMaterialByName()
|
||||||
|
{
|
||||||
|
var machine = CreateTestMachine();
|
||||||
|
var result = machine.GetMaterial("Stainless Steel");
|
||||||
|
Assert.NotNull(result);
|
||||||
|
Assert.Equal("304", result.Grade);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetMaterial_CaseInsensitive()
|
||||||
|
{
|
||||||
|
var machine = CreateTestMachine();
|
||||||
|
var result = machine.GetMaterial("stainless steel");
|
||||||
|
Assert.NotNull(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetMaterial_NotFound_ReturnsNull()
|
||||||
|
{
|
||||||
|
var machine = CreateTestMachine();
|
||||||
|
var result = machine.GetMaterial("Titanium");
|
||||||
|
Assert.Null(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\OpenNest.Api\OpenNest.Api.csproj" />
|
<ProjectReference Include="..\OpenNest.Api\OpenNest.Api.csproj" />
|
||||||
|
<ProjectReference Include="..\OpenNest.Data\OpenNest.Data.csproj" />
|
||||||
<ProjectReference Include="..\OpenNest.Core\OpenNest.Core.csproj" />
|
<ProjectReference Include="..\OpenNest.Core\OpenNest.Core.csproj" />
|
||||||
<ProjectReference Include="..\OpenNest.Engine\OpenNest.Engine.csproj" />
|
<ProjectReference Include="..\OpenNest.Engine\OpenNest.Engine.csproj" />
|
||||||
<ProjectReference Include="..\OpenNest.IO\OpenNest.IO.csproj" />
|
<ProjectReference Include="..\OpenNest.IO\OpenNest.IO.csproj" />
|
||||||
|
|||||||
Reference in New Issue
Block a user