feat: add SplitLine and SplitParameters models

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-24 11:56:00 -04:00
parent b970629a59
commit 765a862440
3 changed files with 81 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
namespace OpenNest;
/// <summary>
/// Defines a split line at a position along an axis.
/// For Vertical, Position is the X coordinate. For Horizontal, Position is the Y coordinate.
/// </summary>
public class SplitLine
{
public double Position { get; }
public CutOffAxis Axis { get; }
public SplitLine(double position, CutOffAxis axis)
{
Position = position;
Axis = axis;
}
}

View File

@@ -0,0 +1,33 @@
namespace OpenNest;
public enum SplitType
{
Straight,
WeldGapTabs,
SpikeGroove
}
public class SplitParameters
{
public SplitType Type { get; set; } = SplitType.Straight;
// Tab parameters
public double TabWidth { get; set; } = 1.0;
public double TabHeight { get; set; } = 0.125;
public int TabCount { get; set; } = 3;
// Spike/Groove parameters
public double SpikeDepth { get; set; } = 0.5;
public double SpikeAngle { get; set; } = 60.0; // degrees
public int SpikePairCount { get; set; } = 2;
/// <summary>
/// Max protrusion from the split edge (for auto-fit plate size calculation).
/// </summary>
public double FeatureOverhang => Type switch
{
SplitType.WeldGapTabs => TabHeight,
SplitType.SpikeGroove => SpikeDepth,
_ => 0
};
}

View File

@@ -0,0 +1,31 @@
namespace OpenNest.Tests.Splitting;
public class SplitLineTests
{
[Fact]
public void SplitLine_Vertical_StoresPositionAsX()
{
var line = new SplitLine(50.0, CutOffAxis.Vertical);
Assert.Equal(50.0, line.Position);
Assert.Equal(CutOffAxis.Vertical, line.Axis);
}
[Fact]
public void SplitLine_Horizontal_StoresPositionAsY()
{
var line = new SplitLine(30.0, CutOffAxis.Horizontal);
Assert.Equal(30.0, line.Position);
Assert.Equal(CutOffAxis.Horizontal, line.Axis);
}
[Fact]
public void SplitParameters_Defaults()
{
var p = new SplitParameters();
Assert.Equal(SplitType.Straight, p.Type);
Assert.Equal(3, p.TabCount);
Assert.Equal(1.0, p.TabWidth);
Assert.Equal(0.125, p.TabHeight);
Assert.Equal(2, p.SpikePairCount);
}
}