From 82de512f449c28e25c0f031ac7a77289ed00dbc5 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Mon, 30 Mar 2026 13:16:06 -0400 Subject: [PATCH] feat: set Layer = Leadin on all LeadIn subclass generated codes Adds LayerType.Leadin to all LinearMove and ArcMove instances produced by LineLeadIn, ArcLeadIn, LineArcLeadIn, CleanHoleLeadIn, and LineLineLeadIn Generate() methods, plus tests covering all subclasses. Co-Authored-By: Claude Sonnet 4.6 --- .../CNC/CuttingStrategy/LeadIns/ArcLeadIn.cs | 2 +- .../LeadIns/CleanHoleLeadIn.cs | 4 +- .../CuttingStrategy/LeadIns/LineArcLeadIn.cs | 4 +- .../CNC/CuttingStrategy/LeadIns/LineLeadIn.cs | 2 +- .../CuttingStrategy/LeadIns/LineLineLeadIn.cs | 4 +- OpenNest.Tests/LeadInLayerTagTests.cs | 90 +++++++++++++++++++ 6 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 OpenNest.Tests/LeadInLayerTagTests.cs diff --git a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/ArcLeadIn.cs b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/ArcLeadIn.cs index 67af1b9..0779ae4 100644 --- a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/ArcLeadIn.cs +++ b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/ArcLeadIn.cs @@ -19,7 +19,7 @@ namespace OpenNest.CNC.CuttingStrategy return new List { new RapidMove(piercePoint), - new ArcMove(contourStartPoint, arcCenter, winding) + new ArcMove(contourStartPoint, arcCenter, winding) { Layer = LayerType.Leadin } }; } diff --git a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/CleanHoleLeadIn.cs b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/CleanHoleLeadIn.cs index b0750ff..884341a 100644 --- a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/CleanHoleLeadIn.cs +++ b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/CleanHoleLeadIn.cs @@ -27,8 +27,8 @@ namespace OpenNest.CNC.CuttingStrategy return new List { new RapidMove(piercePoint), - new LinearMove(arcStart), - new ArcMove(contourStartPoint, arcCenter, winding) + new LinearMove(arcStart) { Layer = LayerType.Leadin }, + new ArcMove(contourStartPoint, arcCenter, winding) { Layer = LayerType.Leadin } }; } diff --git a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineArcLeadIn.cs b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineArcLeadIn.cs index 2fac024..136dada 100644 --- a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineArcLeadIn.cs +++ b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineArcLeadIn.cs @@ -27,8 +27,8 @@ namespace OpenNest.CNC.CuttingStrategy return new List { new RapidMove(piercePoint), - new LinearMove(arcStart), - new ArcMove(contourStartPoint, arcCenter, winding) + new LinearMove(arcStart) { Layer = LayerType.Leadin }, + new ArcMove(contourStartPoint, arcCenter, winding) { Layer = LayerType.Leadin } }; } diff --git a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLeadIn.cs b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLeadIn.cs index c20e8d9..4516070 100644 --- a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLeadIn.cs +++ b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLeadIn.cs @@ -17,7 +17,7 @@ namespace OpenNest.CNC.CuttingStrategy return new List { new RapidMove(piercePoint), - new LinearMove(contourStartPoint) + new LinearMove(contourStartPoint) { Layer = LayerType.Leadin } }; } diff --git a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLineLeadIn.cs b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLineLeadIn.cs index d646694..e3ce6d1 100644 --- a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLineLeadIn.cs +++ b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLineLeadIn.cs @@ -24,8 +24,8 @@ namespace OpenNest.CNC.CuttingStrategy return new List { new RapidMove(piercePoint), - new LinearMove(midPoint), - new LinearMove(contourStartPoint) + new LinearMove(midPoint) { Layer = LayerType.Leadin }, + new LinearMove(contourStartPoint) { Layer = LayerType.Leadin } }; } diff --git a/OpenNest.Tests/LeadInLayerTagTests.cs b/OpenNest.Tests/LeadInLayerTagTests.cs new file mode 100644 index 0000000..51f76bc --- /dev/null +++ b/OpenNest.Tests/LeadInLayerTagTests.cs @@ -0,0 +1,90 @@ +using OpenNest.CNC; +using OpenNest.CNC.CuttingStrategy; +using OpenNest.Geometry; + +namespace OpenNest.Tests; + +public class LeadInLayerTagTests +{ + private static readonly Vector Point = new(5, 5); + private const double Normal = 0.0; + + [Fact] + public void LineLeadIn_SetsLeadinLayer() + { + var leadIn = new LineLeadIn { Length = 0.5, ApproachAngle = 90 }; + var codes = leadIn.Generate(Point, Normal); + var linear = codes.OfType().Single(); + Assert.Equal(LayerType.Leadin, linear.Layer); + } + + [Fact] + public void ArcLeadIn_SetsLeadinLayer() + { + var leadIn = new ArcLeadIn { Radius = 0.25 }; + var codes = leadIn.Generate(Point, Normal); + var arc = codes.OfType().Single(); + Assert.Equal(LayerType.Leadin, arc.Layer); + } + + [Fact] + public void LineArcLeadIn_SetsLeadinLayerOnAllMoves() + { + var leadIn = new LineArcLeadIn { LineLength = 0.5, ArcRadius = 0.25, ApproachAngle = 135 }; + var codes = leadIn.Generate(Point, Normal); + Assert.All(codes.OfType(), m => Assert.Equal(LayerType.Leadin, m.Layer)); + Assert.All(codes.OfType(), m => Assert.Equal(LayerType.Leadin, m.Layer)); + } + + [Fact] + public void CleanHoleLeadIn_SetsLeadinLayerOnAllMoves() + { + var leadIn = new CleanHoleLeadIn { LineLength = 0.5, ArcRadius = 0.25, Kerf = 0.05 }; + var codes = leadIn.Generate(Point, Normal); + Assert.All(codes.OfType(), m => Assert.Equal(LayerType.Leadin, m.Layer)); + Assert.All(codes.OfType(), m => Assert.Equal(LayerType.Leadin, m.Layer)); + } + + [Fact] + public void LineLineLeadIn_SetsLeadinLayerOnAllMoves() + { + var leadIn = new LineLineLeadIn { Length1 = 0.5, Length2 = 0.3, ApproachAngle1 = 90, ApproachAngle2 = 90 }; + var codes = leadIn.Generate(Point, Normal); + Assert.All(codes.OfType(), m => Assert.Equal(LayerType.Leadin, m.Layer)); + } + + [Fact] + public void NoLeadIn_NoLinearOrArcMoves() + { + var leadIn = new NoLeadIn(); + var codes = leadIn.Generate(Point, Normal); + Assert.Empty(codes.OfType()); + Assert.Empty(codes.OfType()); + } + + [Fact] + public void LineLeadOut_SetsLeadoutLayer() + { + var leadOut = new LineLeadOut { Length = 0.5, ApproachAngle = 90 }; + var codes = leadOut.Generate(Point, Normal); + var linear = codes.OfType().Single(); + Assert.Equal(LayerType.Leadout, linear.Layer); + } + + [Fact] + public void ArcLeadOut_SetsLeadoutLayer() + { + var leadOut = new ArcLeadOut { Radius = 0.25 }; + var codes = leadOut.Generate(Point, Normal); + var arc = codes.OfType().Single(); + Assert.Equal(LayerType.Leadout, arc.Layer); + } + + [Fact] + public void NoLeadOut_ReturnsEmptyList() + { + var leadOut = new NoLeadOut(); + var codes = leadOut.Generate(Point, Normal); + Assert.Empty(codes); + } +}