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);
+ }
+}