feat: add pierce clearance clamping for circle contour lead-ins

Scales down lead-ins that would place the pierce point too close to the
opposite wall of small holes. Uses quadratic solve to find the maximum
safe distance inside a clearance-reduced radius. Adds Scale() method to
all LeadIn types and applies clamping in both the strategy and the
interactive preview.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-30 19:35:41 -04:00
parent a399c89f58
commit e860ca3f4a
9 changed files with 96 additions and 0 deletions

View File

@@ -32,5 +32,8 @@ namespace OpenNest.CNC.CuttingStrategy
arcCenterX + Radius * System.Math.Cos(contourNormalAngle),
arcCenterY + Radius * System.Math.Sin(contourNormalAngle));
}
public override LeadIn Scale(double factor) =>
new ArcLeadIn { Radius = Radius * factor };
}
}

View File

@@ -45,5 +45,8 @@ namespace OpenNest.CNC.CuttingStrategy
arcStartX + LineLength * System.Math.Cos(lineAngle),
arcStartY + LineLength * System.Math.Sin(lineAngle));
}
public override LeadIn Scale(double factor) =>
new CleanHoleLeadIn { LineLength = LineLength * factor, ArcRadius = ArcRadius * factor, Kerf = Kerf };
}
}

View File

@@ -9,5 +9,7 @@ namespace OpenNest.CNC.CuttingStrategy
RotationType winding = RotationType.CW);
public abstract Vector GetPiercePoint(Vector contourStartPoint, double contourNormalAngle);
public virtual LeadIn Scale(double factor) => this;
}
}

View File

@@ -45,5 +45,8 @@ namespace OpenNest.CNC.CuttingStrategy
arcStartX + LineLength * System.Math.Cos(lineAngle),
arcStartY + LineLength * System.Math.Sin(lineAngle));
}
public override LeadIn Scale(double factor) =>
new LineArcLeadIn { LineLength = LineLength * factor, ArcRadius = ArcRadius * factor, ApproachAngle = ApproachAngle };
}
}

View File

@@ -28,5 +28,8 @@ namespace OpenNest.CNC.CuttingStrategy
contourStartPoint.X + Length * System.Math.Cos(approachAngle),
contourStartPoint.Y + Length * System.Math.Sin(approachAngle));
}
public override LeadIn Scale(double factor) =>
new LineLeadIn { Length = Length * factor, ApproachAngle = ApproachAngle };
}
}

View File

@@ -40,5 +40,8 @@ namespace OpenNest.CNC.CuttingStrategy
midX + Length1 * System.Math.Cos(firstAngle),
midY + Length1 * System.Math.Sin(firstAngle));
}
public override LeadIn Scale(double factor) =>
new LineLineLeadIn { Length1 = Length1 * factor, ApproachAngle1 = ApproachAngle1, Length2 = Length2 * factor, ApproachAngle2 = ApproachAngle2 };
}
}