From f17db1d2f9596655a7a550613849ff4b8266e28a Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Thu, 12 Mar 2026 23:07:31 -0400 Subject: [PATCH] feat: add LeadIn hierarchy (7 classes) Co-Authored-By: Claude Sonnet 4.6 --- .../CNC/CuttingStrategy/LeadIns/ArcLeadIn.cs | 36 ++++++++++++++ .../LeadIns/CleanHoleLeadIn.cs | 49 +++++++++++++++++++ .../CNC/CuttingStrategy/LeadIns/LeadIn.cs | 13 +++++ .../CuttingStrategy/LeadIns/LineArcLeadIn.cs | 49 +++++++++++++++++++ .../CNC/CuttingStrategy/LeadIns/LineLeadIn.cs | 32 ++++++++++++ .../CuttingStrategy/LeadIns/LineLineLeadIn.cs | 44 +++++++++++++++++ .../CNC/CuttingStrategy/LeadIns/NoLeadIn.cs | 22 +++++++++ 7 files changed, 245 insertions(+) create mode 100644 OpenNest.Core/CNC/CuttingStrategy/LeadIns/ArcLeadIn.cs create mode 100644 OpenNest.Core/CNC/CuttingStrategy/LeadIns/CleanHoleLeadIn.cs create mode 100644 OpenNest.Core/CNC/CuttingStrategy/LeadIns/LeadIn.cs create mode 100644 OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineArcLeadIn.cs create mode 100644 OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLeadIn.cs create mode 100644 OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLineLeadIn.cs create mode 100644 OpenNest.Core/CNC/CuttingStrategy/LeadIns/NoLeadIn.cs diff --git a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/ArcLeadIn.cs b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/ArcLeadIn.cs new file mode 100644 index 0000000..e76c9ce --- /dev/null +++ b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/ArcLeadIn.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using OpenNest.Geometry; + +namespace OpenNest.CNC.CuttingStrategy +{ + public class ArcLeadIn : LeadIn + { + public double Radius { get; set; } + + public override List Generate(Vector contourStartPoint, double contourNormalAngle, + RotationType winding = RotationType.CW) + { + var piercePoint = GetPiercePoint(contourStartPoint, contourNormalAngle); + + var arcCenter = new Vector( + contourStartPoint.X + Radius * System.Math.Cos(contourNormalAngle), + contourStartPoint.Y + Radius * System.Math.Sin(contourNormalAngle)); + + return new List + { + new RapidMove(piercePoint), + new ArcMove(contourStartPoint, arcCenter, winding) + }; + } + + public override Vector GetPiercePoint(Vector contourStartPoint, double contourNormalAngle) + { + var arcCenterX = contourStartPoint.X + Radius * System.Math.Cos(contourNormalAngle); + var arcCenterY = contourStartPoint.Y + Radius * System.Math.Sin(contourNormalAngle); + + return new Vector( + arcCenterX + Radius * System.Math.Cos(contourNormalAngle), + arcCenterY + Radius * System.Math.Sin(contourNormalAngle)); + } + } +} diff --git a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/CleanHoleLeadIn.cs b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/CleanHoleLeadIn.cs new file mode 100644 index 0000000..d30f0e6 --- /dev/null +++ b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/CleanHoleLeadIn.cs @@ -0,0 +1,49 @@ +using System.Collections.Generic; +using OpenNest.Geometry; +using OpenNest.Math; + +namespace OpenNest.CNC.CuttingStrategy +{ + public class CleanHoleLeadIn : LeadIn + { + public double LineLength { get; set; } + public double ArcRadius { get; set; } + public double Kerf { get; set; } + + public override List Generate(Vector contourStartPoint, double contourNormalAngle, + RotationType winding = RotationType.CW) + { + var piercePoint = GetPiercePoint(contourStartPoint, contourNormalAngle); + + var arcCenterX = contourStartPoint.X + ArcRadius * System.Math.Cos(contourNormalAngle); + var arcCenterY = contourStartPoint.Y + ArcRadius * System.Math.Sin(contourNormalAngle); + var arcCenter = new Vector(arcCenterX, arcCenterY); + + var lineAngle = contourNormalAngle + Angle.ToRadians(135.0); + var arcStart = new Vector( + arcCenterX + ArcRadius * System.Math.Cos(lineAngle), + arcCenterY + ArcRadius * System.Math.Sin(lineAngle)); + + return new List + { + new RapidMove(piercePoint), + new LinearMove(arcStart), + new ArcMove(contourStartPoint, arcCenter, winding) + }; + } + + public override Vector GetPiercePoint(Vector contourStartPoint, double contourNormalAngle) + { + var arcCenterX = contourStartPoint.X + ArcRadius * System.Math.Cos(contourNormalAngle); + var arcCenterY = contourStartPoint.Y + ArcRadius * System.Math.Sin(contourNormalAngle); + + var lineAngle = contourNormalAngle + Angle.ToRadians(135.0); + var arcStartX = arcCenterX + ArcRadius * System.Math.Cos(lineAngle); + var arcStartY = arcCenterY + ArcRadius * System.Math.Sin(lineAngle); + + return new Vector( + arcStartX + LineLength * System.Math.Cos(lineAngle), + arcStartY + LineLength * System.Math.Sin(lineAngle)); + } + } +} diff --git a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LeadIn.cs b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LeadIn.cs new file mode 100644 index 0000000..83be504 --- /dev/null +++ b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LeadIn.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +using OpenNest.Geometry; + +namespace OpenNest.CNC.CuttingStrategy +{ + public abstract class LeadIn + { + public abstract List Generate(Vector contourStartPoint, double contourNormalAngle, + RotationType winding = RotationType.CW); + + public abstract Vector GetPiercePoint(Vector contourStartPoint, double contourNormalAngle); + } +} diff --git a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineArcLeadIn.cs b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineArcLeadIn.cs new file mode 100644 index 0000000..a816593 --- /dev/null +++ b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineArcLeadIn.cs @@ -0,0 +1,49 @@ +using System.Collections.Generic; +using OpenNest.Geometry; +using OpenNest.Math; + +namespace OpenNest.CNC.CuttingStrategy +{ + public class LineArcLeadIn : LeadIn + { + public double LineLength { get; set; } + public double ApproachAngle { get; set; } = 135.0; + public double ArcRadius { get; set; } + + public override List Generate(Vector contourStartPoint, double contourNormalAngle, + RotationType winding = RotationType.CW) + { + var piercePoint = GetPiercePoint(contourStartPoint, contourNormalAngle); + + var arcCenterX = contourStartPoint.X + ArcRadius * System.Math.Cos(contourNormalAngle); + var arcCenterY = contourStartPoint.Y + ArcRadius * System.Math.Sin(contourNormalAngle); + var arcCenter = new Vector(arcCenterX, arcCenterY); + + var lineAngle = contourNormalAngle + Angle.ToRadians(ApproachAngle); + var arcStart = new Vector( + arcCenterX + ArcRadius * System.Math.Cos(lineAngle), + arcCenterY + ArcRadius * System.Math.Sin(lineAngle)); + + return new List + { + new RapidMove(piercePoint), + new LinearMove(arcStart), + new ArcMove(contourStartPoint, arcCenter, winding) + }; + } + + public override Vector GetPiercePoint(Vector contourStartPoint, double contourNormalAngle) + { + var arcCenterX = contourStartPoint.X + ArcRadius * System.Math.Cos(contourNormalAngle); + var arcCenterY = contourStartPoint.Y + ArcRadius * System.Math.Sin(contourNormalAngle); + + var lineAngle = contourNormalAngle + Angle.ToRadians(ApproachAngle); + var arcStartX = arcCenterX + ArcRadius * System.Math.Cos(lineAngle); + var arcStartY = arcCenterY + ArcRadius * System.Math.Sin(lineAngle); + + return new Vector( + arcStartX + LineLength * System.Math.Cos(lineAngle), + arcStartY + LineLength * System.Math.Sin(lineAngle)); + } + } +} diff --git a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLeadIn.cs b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLeadIn.cs new file mode 100644 index 0000000..e7922cf --- /dev/null +++ b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLeadIn.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using OpenNest.Geometry; +using OpenNest.Math; + +namespace OpenNest.CNC.CuttingStrategy +{ + public class LineLeadIn : LeadIn + { + public double Length { get; set; } + public double ApproachAngle { get; set; } = 90.0; + + public override List Generate(Vector contourStartPoint, double contourNormalAngle, + RotationType winding = RotationType.CW) + { + var piercePoint = GetPiercePoint(contourStartPoint, contourNormalAngle); + + return new List + { + new RapidMove(piercePoint), + new LinearMove(contourStartPoint) + }; + } + + public override Vector GetPiercePoint(Vector contourStartPoint, double contourNormalAngle) + { + var approachAngle = contourNormalAngle + Angle.ToRadians(ApproachAngle); + return new Vector( + contourStartPoint.X + Length * System.Math.Cos(approachAngle), + contourStartPoint.Y + Length * System.Math.Sin(approachAngle)); + } + } +} diff --git a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLineLeadIn.cs b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLineLeadIn.cs new file mode 100644 index 0000000..f5700cb --- /dev/null +++ b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/LineLineLeadIn.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using OpenNest.Geometry; +using OpenNest.Math; + +namespace OpenNest.CNC.CuttingStrategy +{ + public class LineLineLeadIn : LeadIn + { + public double Length1 { get; set; } + public double ApproachAngle1 { get; set; } = 90.0; + public double Length2 { get; set; } + public double ApproachAngle2 { get; set; } = 90.0; + + public override List Generate(Vector contourStartPoint, double contourNormalAngle, + RotationType winding = RotationType.CW) + { + var piercePoint = GetPiercePoint(contourStartPoint, contourNormalAngle); + + var secondAngle = contourNormalAngle + Angle.ToRadians(ApproachAngle1); + var midPoint = new Vector( + contourStartPoint.X + Length2 * System.Math.Cos(secondAngle), + contourStartPoint.Y + Length2 * System.Math.Sin(secondAngle)); + + return new List + { + new RapidMove(piercePoint), + new LinearMove(midPoint), + new LinearMove(contourStartPoint) + }; + } + + public override Vector GetPiercePoint(Vector contourStartPoint, double contourNormalAngle) + { + var secondAngle = contourNormalAngle + Angle.ToRadians(ApproachAngle1); + var midX = contourStartPoint.X + Length2 * System.Math.Cos(secondAngle); + var midY = contourStartPoint.Y + Length2 * System.Math.Sin(secondAngle); + + var firstAngle = secondAngle + Angle.ToRadians(ApproachAngle2); + return new Vector( + midX + Length1 * System.Math.Cos(firstAngle), + midY + Length1 * System.Math.Sin(firstAngle)); + } + } +} diff --git a/OpenNest.Core/CNC/CuttingStrategy/LeadIns/NoLeadIn.cs b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/NoLeadIn.cs new file mode 100644 index 0000000..7100487 --- /dev/null +++ b/OpenNest.Core/CNC/CuttingStrategy/LeadIns/NoLeadIn.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using OpenNest.Geometry; + +namespace OpenNest.CNC.CuttingStrategy +{ + public class NoLeadIn : LeadIn + { + public override List Generate(Vector contourStartPoint, double contourNormalAngle, + RotationType winding = RotationType.CW) + { + return new List + { + new RapidMove(contourStartPoint) + }; + } + + public override Vector GetPiercePoint(Vector contourStartPoint, double contourNormalAngle) + { + return contourStartPoint; + } + } +}