diff --git a/OpenNest.Core/Splitting/SplitLine.cs b/OpenNest.Core/Splitting/SplitLine.cs new file mode 100644 index 0000000..0ef4ec3 --- /dev/null +++ b/OpenNest.Core/Splitting/SplitLine.cs @@ -0,0 +1,17 @@ +namespace OpenNest; + +/// +/// Defines a split line at a position along an axis. +/// For Vertical, Position is the X coordinate. For Horizontal, Position is the Y coordinate. +/// +public class SplitLine +{ + public double Position { get; } + public CutOffAxis Axis { get; } + + public SplitLine(double position, CutOffAxis axis) + { + Position = position; + Axis = axis; + } +} diff --git a/OpenNest.Core/Splitting/SplitParameters.cs b/OpenNest.Core/Splitting/SplitParameters.cs new file mode 100644 index 0000000..d2f25b6 --- /dev/null +++ b/OpenNest.Core/Splitting/SplitParameters.cs @@ -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; + + /// + /// Max protrusion from the split edge (for auto-fit plate size calculation). + /// + public double FeatureOverhang => Type switch + { + SplitType.WeldGapTabs => TabHeight, + SplitType.SpikeGroove => SpikeDepth, + _ => 0 + }; +} diff --git a/OpenNest.Tests/Splitting/SplitLineTests.cs b/OpenNest.Tests/Splitting/SplitLineTests.cs new file mode 100644 index 0000000..1abb55e --- /dev/null +++ b/OpenNest.Tests/Splitting/SplitLineTests.cs @@ -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); + } +}