From d4269c1f06d86d20fa6cdf4a1a7e95a30b016022 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Sat, 24 Oct 2026 20:05:35 -0400 Subject: [PATCH] refactor(cutting): merge circle lead settings into internal leads Full circles now take InternalLeadIn/InternalLeadOut like every other cutout; the ArcCircle lead settings and the cutting panel's Arc / Circle tab are removed. Circle-specific geometry handling (radius clamp, angle rounding, pierce zone) is unchanged. Older nest files and desktop settings still load: their arcCircleLeadIn/ arcCircleLeadOut keys are ignored and no longer written, so re-planned circles take the internal leads. Saved part programs are untouched. Co-Authored-By: Claude Opus 5.5 --- .../CuttingPlanning/OwnedCuttingParameters.cs | 2 -- .../CNC/CuttingPlanning/PreparedContours.cs | 4 +-- .../CNC/CuttingPlanning/StateFingerprint.cs | 2 -- .../CuttingStrategy/ContourCuttingStrategy.cs | 6 ++-- .../CNC/CuttingStrategy/CuttingParameters.cs | 7 ++-- OpenNest.Data/MachineCuttingDefaults.cs | 4 +-- .../CuttingPlanFrontEndTests.cs | 1 - .../CuttingParametersSerializerTests.cs | 33 +++++++++++-------- OpenNest.IO/CuttingParametersDto.cs | 5 +-- OpenNest.IO/CuttingParametersSerializer.cs | 4 --- .../CincinnatiPostRegressionTests.cs | 2 -- .../HolePlacementRegressionTests.cs | 2 -- .../CIFiberPostProcessorTests.cs | 1 - .../CIFiberSampleRegressionTests.cs | 5 ++- .../ContinuedContourCheckTests.cs | 1 - .../ContourCandidateEmissionTests.cs | 2 +- .../ContourEntryFeasibilityTests.cs | 1 - .../ContourRecoveryFileTests.cs | 1 - .../CuttingPlanning/CuttingGridOrderTests.cs | 1 - .../CuttingReplayContractTests.cs | 6 +++- .../CuttingPlanning/ExplicitContourTests.cs | 3 +- .../CuttingPlanning/HoleDepartureTests.cs | 2 -- .../CuttingPlanning/HoleLookAheadTests.cs | 1 - .../CuttingPlanning/ImportedArcHoleTests.cs | 2 -- .../InterlockingHoleRouteTests.cs | 1 - .../CuttingPlanning/JointCuttingPlanTests.cs | 1 - .../OwnedCuttingParameterTests.cs | 6 ++-- .../PerimeterLookAheadTests.cs | 2 +- .../CuttingPlanning/PierceZoneTests.cs | 2 -- .../CuttingPlanning/PinnedContourTests.cs | 1 - .../CuttingPlanning/PreparedContourTests.cs | 2 +- .../ProblemNestRegressionTests.cs | 1 - .../CuttingPlanning/SettingsFreshnessTests.cs | 4 +-- .../SideCoverageRegressionTests.cs | 1 - .../CuttingStrategy/HoleSubProgramTests.cs | 8 ----- .../PartLeadInTransformTests.cs | 2 +- .../Data/MachineCuttingDefaultsTests.cs | 5 ++- .../PostVerificationAnalyzerTests.cs | 1 - OpenNest.Tests/DrawingProgramSnapshotTests.cs | 2 +- .../IO/PartLeadInSerializationTests.cs | 2 +- .../Reporting/NestReportTestData.cs | 2 +- .../TabbedCutouts/TabbedCutoutBuilderTests.cs | 1 - .../Forms/CuttingInspectionPanelTests.cs | 2 -- OpenNest/Actions/ActionLeadIn.cs | 3 +- OpenNest/Controls/CuttingPanel.cs | 32 +++--------------- OpenNest/Forms/CuttingInspectionPanel.cs | 2 +- docs/machine-cutting-defaults.md | 4 +-- docs/nest-file-format.md | 6 ++++ docs/problem-nests.md | 2 +- 49 files changed, 66 insertions(+), 127 deletions(-) diff --git a/OpenNest.Core/CNC/CuttingPlanning/OwnedCuttingParameters.cs b/OpenNest.Core/CNC/CuttingPlanning/OwnedCuttingParameters.cs index d36f1754..52727d9f 100644 --- a/OpenNest.Core/CNC/CuttingPlanning/OwnedCuttingParameters.cs +++ b/OpenNest.Core/CNC/CuttingPlanning/OwnedCuttingParameters.cs @@ -33,10 +33,8 @@ internal static class OwnedCuttingParameters PierceDiameter = Dimension(source.PierceDiameter), ExternalLeadIn = CopyLeadIn(source.ExternalLeadIn), InternalLeadIn = CopyLeadIn(source.InternalLeadIn), - ArcCircleLeadIn = CopyLeadIn(source.ArcCircleLeadIn), ExternalLeadOut = CopyLeadOut(source.ExternalLeadOut), InternalLeadOut = CopyLeadOut(source.InternalLeadOut), - ArcCircleLeadOut = CopyLeadOut(source.ArcCircleLeadOut), RoundLeadInAngles = source.RoundLeadInAngles, LeadInAngleIncrement = source.LeadInAngleIncrement, TabConfig = source.TabConfig == null diff --git a/OpenNest.Core/CNC/CuttingPlanning/PreparedContours.cs b/OpenNest.Core/CNC/CuttingPlanning/PreparedContours.cs index 8689f24c..663ea97c 100644 --- a/OpenNest.Core/CNC/CuttingPlanning/PreparedContours.cs +++ b/OpenNest.Core/CNC/CuttingPlanning/PreparedContours.cs @@ -208,17 +208,15 @@ public sealed class PreparedContours return pins.Any(p => p?.IsResolved != false) ? new PreparedContours(unpinned, pins, token) : unpinned; } - // The pin's leads replace every contour type's leads, since the type the emitter detects is + // The pin's leads replace both lead sets, since the type the emitter detects is // not the caller's concern; angle rounding is off because a pinned entry never moves. private static CuttingParameters PinParameters(CuttingParameters shared, ContourCutPin pin) { var owned = OwnedCuttingParameters.Copy(shared); owned.ExternalLeadIn = pin.LeadIn; owned.InternalLeadIn = pin.LeadIn; - owned.ArcCircleLeadIn = pin.LeadIn; owned.ExternalLeadOut = pin.LeadOut; owned.InternalLeadOut = pin.LeadOut; - owned.ArcCircleLeadOut = pin.LeadOut; owned.RoundLeadInAngles = false; owned.TabsEnabled = pin.HasTab; if (pin.HasTab) diff --git a/OpenNest.Core/CNC/CuttingPlanning/StateFingerprint.cs b/OpenNest.Core/CNC/CuttingPlanning/StateFingerprint.cs index 4fa9d58a..989b64af 100644 --- a/OpenNest.Core/CNC/CuttingPlanning/StateFingerprint.cs +++ b/OpenNest.Core/CNC/CuttingPlanning/StateFingerprint.cs @@ -83,8 +83,6 @@ internal static class StateFingerprint Out(p.ExternalLeadOut); Lead(p.InternalLeadIn); Out(p.InternalLeadOut); - Lead(p.ArcCircleLeadIn); - Out(p.ArcCircleLeadOut); Number(p.PierceClearance); Number(p.PierceDiameter); Flag(p.RoundLeadInAngles); diff --git a/OpenNest.Core/CNC/CuttingStrategy/ContourCuttingStrategy.cs b/OpenNest.Core/CNC/CuttingStrategy/ContourCuttingStrategy.cs index e59b4e58..35757329 100644 --- a/OpenNest.Core/CNC/CuttingStrategy/ContourCuttingStrategy.cs +++ b/OpenNest.Core/CNC/CuttingStrategy/ContourCuttingStrategy.cs @@ -1103,8 +1103,7 @@ namespace OpenNest.CNC.CuttingStrategy { return contourType switch { - ContourType.ArcCircle => Parameters.ArcCircleLeadIn ?? Parameters.InternalLeadIn, - ContourType.Internal => Parameters.InternalLeadIn, + ContourType.Internal or ContourType.ArcCircle => Parameters.InternalLeadIn, _ => Parameters.ExternalLeadIn, }; } @@ -1113,8 +1112,7 @@ namespace OpenNest.CNC.CuttingStrategy { return contourType switch { - ContourType.ArcCircle => Parameters.ArcCircleLeadOut ?? Parameters.InternalLeadOut, - ContourType.Internal => Parameters.InternalLeadOut, + ContourType.Internal or ContourType.ArcCircle => Parameters.InternalLeadOut, _ => Parameters.ExternalLeadOut, }; } diff --git a/OpenNest.Core/CNC/CuttingStrategy/CuttingParameters.cs b/OpenNest.Core/CNC/CuttingStrategy/CuttingParameters.cs index ba80dd17..089dbb16 100644 --- a/OpenNest.Core/CNC/CuttingStrategy/CuttingParameters.cs +++ b/OpenNest.Core/CNC/CuttingStrategy/CuttingParameters.cs @@ -15,13 +15,14 @@ namespace OpenNest.CNC.CuttingStrategy public LeadIn ExternalLeadIn { get; set; } = new NoLeadIn(); public LeadOut ExternalLeadOut { get; set; } = new NoLeadOut(); + /// + /// The lead-in of every cutout, full circles included; circles still get their own + /// geometry handling (radius clamp, angle rounding) when the lead is emitted. + /// public LeadIn InternalLeadIn { get; set; } = new LineLeadIn { Length = 0.125, ApproachAngle = 90 }; public LeadOut InternalLeadOut { get; set; } = new NoLeadOut(); - public LeadIn ArcCircleLeadIn { get; set; } = new NoLeadIn(); - public LeadOut ArcCircleLeadOut { get; set; } = new NoLeadOut(); - public double PierceClearance { get; set; } = 0.0625; /// diff --git a/OpenNest.Data/MachineCuttingDefaults.cs b/OpenNest.Data/MachineCuttingDefaults.cs index edb5f187..a016c7cb 100644 --- a/OpenNest.Data/MachineCuttingDefaults.cs +++ b/OpenNest.Data/MachineCuttingDefaults.cs @@ -55,17 +55,15 @@ public static class MachineCuttingDefaults var scale = Scale(machine!.Units, nest.Units); var kerf = settings.Kerf * scale; - // Each contour type gets its own instance, as the cutting panel builds them. + // Each lead set gets its own instance, as the cutting panel builds them. if (ToLeadIn(settings.LeadIn, scale, kerf) is { } leadIn) { if (leadIn is not CleanHoleLeadIn) parameters.ExternalLeadIn = leadIn; parameters.InternalLeadIn = ToLeadIn(settings.LeadIn, scale, kerf); - parameters.ArcCircleLeadIn = ToLeadIn(settings.LeadIn, scale, kerf); } parameters.ExternalLeadOut = ToLeadOut(settings.LeadOut, scale); parameters.InternalLeadOut = ToLeadOut(settings.LeadOut, scale); - parameters.ArcCircleLeadOut = ToLeadOut(settings.LeadOut, scale); parameters.Kerf = kerf; parameters.MachineName = machine.Name; parameters.MaterialName = nest.Material.Name; diff --git a/OpenNest.FrontEnd.Tests/CuttingPlanFrontEndTests.cs b/OpenNest.FrontEnd.Tests/CuttingPlanFrontEndTests.cs index 0fd02fc8..3560c48c 100644 --- a/OpenNest.FrontEnd.Tests/CuttingPlanFrontEndTests.cs +++ b/OpenNest.FrontEnd.Tests/CuttingPlanFrontEndTests.cs @@ -216,7 +216,6 @@ public class CuttingPlanFrontEndTests : IDisposable { ExternalLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 45 }, InternalLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 45 }, - ArcCircleLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 45 }, ExternalLeadOut = new NoLeadOut(), InternalLeadOut = new NoLeadOut(), PierceClearance = 0.05, diff --git a/OpenNest.IO.Tests/CuttingParametersSerializerTests.cs b/OpenNest.IO.Tests/CuttingParametersSerializerTests.cs index dced3c4e..ac752c67 100644 --- a/OpenNest.IO.Tests/CuttingParametersSerializerTests.cs +++ b/OpenNest.IO.Tests/CuttingParametersSerializerTests.cs @@ -20,7 +20,6 @@ public class CuttingParametersSerializerTests { ExternalLeadIn = leadIn, InternalLeadIn = leadIn, - ArcCircleLeadIn = leadIn, TabConfig = new NormalTab { Size = 0.42, TabLeadIn = leadIn }, }; @@ -28,7 +27,6 @@ public class CuttingParametersSerializerTests AssertEquivalent(leadIn, restored.ExternalLeadIn); AssertEquivalent(leadIn, restored.InternalLeadIn); - AssertEquivalent(leadIn, restored.ArcCircleLeadIn); AssertEquivalent(leadIn, restored.TabConfig.TabLeadIn); } @@ -43,7 +41,6 @@ public class CuttingParametersSerializerTests { ExternalLeadOut = leadOut, InternalLeadOut = leadOut, - ArcCircleLeadOut = leadOut, TabConfig = new NormalTab { Size = 0.42, TabLeadOut = leadOut }, }; @@ -51,7 +48,6 @@ public class CuttingParametersSerializerTests AssertEquivalent(leadOut, restored.ExternalLeadOut); AssertEquivalent(leadOut, restored.InternalLeadOut); - AssertEquivalent(leadOut, restored.ArcCircleLeadOut); AssertEquivalent(leadOut, restored.TabConfig.TabLeadOut); } @@ -118,11 +114,6 @@ public class CuttingParametersSerializerTests Assert.Equal(43, lineOut.ApproachAngle); Assert.Equal(0.12, Assert.IsType(restored.InternalLeadIn).Radius); Assert.Equal(0.09, Assert.IsType(restored.InternalLeadOut).Radius); - var cleanHole = Assert.IsType(restored.ArcCircleLeadIn); - Assert.Equal(0.8, cleanHole.LineLength); - Assert.Equal(0.3, cleanHole.ArcRadius); - Assert.Equal(0.04, cleanHole.Kerf); - Assert.IsType(restored.ArcCircleLeadOut); Assert.True(restored.TabsEnabled); Assert.Equal(0.375, Assert.IsType(restored.TabConfig).Size); Assert.Equal(0.0625, restored.PierceClearance); @@ -133,6 +124,26 @@ public class CuttingParametersSerializerTests AssertEquivalent(new SequenceParameters(), restored.Sequencing); } + [Fact] + public void Deserialize_LegacyArcCircleLeads_AreDroppedInFavorOfTheInternalLeads() + { + const string json = """ + { + "internalLeadIn": { "type": "Line", "length": 0.125, "approachAngle": 90 }, + "internalLeadOut": { "type": "None" }, + "arcCircleLeadIn": { "type": "CleanHole", "lineLength": 0.8, + "arcRadius": 0.3, "kerf": 0.04 }, + "arcCircleLeadOut": { "type": "Arc", "radius": 0.09 } + } + """; + + var restored = CuttingParametersSerializer.Deserialize(json); + + Assert.Equal(0.125, Assert.IsType(restored.InternalLeadIn).Length); + Assert.IsType(restored.InternalLeadOut); + Assert.DoesNotContain("arcCircle", CuttingParametersSerializer.Serialize(restored)); + } + [Theory] [InlineData(0)] [InlineData(-1)] @@ -150,10 +161,8 @@ public class CuttingParametersSerializerTests Assert.IsType(restored.ExternalLeadIn); Assert.IsType(restored.InternalLeadIn); - Assert.IsType(restored.ArcCircleLeadIn); Assert.IsType(restored.ExternalLeadOut); Assert.IsType(restored.InternalLeadOut); - Assert.IsType(restored.ArcCircleLeadOut); Assert.Equal(0, Assert.IsType(restored.TabConfig).Size); Assert.Equal(0, restored.PierceClearance); Assert.Equal(0, restored.PierceDiameter); @@ -297,8 +306,6 @@ public class CuttingParametersSerializerTests ExternalLeadOut = CreateLeadOut("Line"), InternalLeadIn = CreateLeadIn("CleanHole"), InternalLeadOut = CreateLeadOut("Arc"), - ArcCircleLeadIn = CreateLeadIn("LineArc"), - ArcCircleLeadOut = CreateLeadOut("None"), PierceClearance = 0.17, PierceDiameter = 0.41, RoundLeadInAngles = true, diff --git a/OpenNest.IO/CuttingParametersDto.cs b/OpenNest.IO/CuttingParametersDto.cs index d25a1185..ff7d5704 100644 --- a/OpenNest.IO/CuttingParametersDto.cs +++ b/OpenNest.IO/CuttingParametersDto.cs @@ -19,8 +19,9 @@ public class CuttingParametersDto public LeadOutDto ExternalLeadOut { get; set; } public LeadInDto InternalLeadIn { get; set; } public LeadOutDto InternalLeadOut { get; set; } - public LeadInDto ArcCircleLeadIn { get; set; } - public LeadOutDto ArcCircleLeadOut { get; set; } + + // Older files also stored arcCircleLeadIn/arcCircleLeadOut. Circles now use the internal + // leads, so those keys are ignored on read and no longer written. public bool TabsEnabled { get; set; } // Legacy settings only stored tabWidth. A missing TabConfig uses that width; diff --git a/OpenNest.IO/CuttingParametersSerializer.cs b/OpenNest.IO/CuttingParametersSerializer.cs index 67b67397..36f6e1ac 100644 --- a/OpenNest.IO/CuttingParametersSerializer.cs +++ b/OpenNest.IO/CuttingParametersSerializer.cs @@ -63,8 +63,6 @@ public static class CuttingParametersSerializer ExternalLeadOut = ToLeadOutDto(parameters.ExternalLeadOut), InternalLeadIn = ToLeadInDto(parameters.InternalLeadIn), InternalLeadOut = ToLeadOutDto(parameters.InternalLeadOut), - ArcCircleLeadIn = ToLeadInDto(parameters.ArcCircleLeadIn), - ArcCircleLeadOut = ToLeadOutDto(parameters.ArcCircleLeadOut), TabsEnabled = parameters.TabsEnabled, TabWidth = parameters.TabConfig?.Size ?? 0.25, TabConfig = ToTabDto(parameters.TabConfig), @@ -97,8 +95,6 @@ public static class CuttingParametersSerializer ExternalLeadOut = FromLeadOutDto(dto.ExternalLeadOut), InternalLeadIn = FromLeadInDto(dto.InternalLeadIn), InternalLeadOut = FromLeadOutDto(dto.InternalLeadOut), - ArcCircleLeadIn = FromLeadInDto(dto.ArcCircleLeadIn), - ArcCircleLeadOut = FromLeadOutDto(dto.ArcCircleLeadOut), TabsEnabled = dto.TabsEnabled, TabConfig = dto.TabConfig == null ? new NormalTab { Size = dto.TabWidth } diff --git a/OpenNest.Tests/Cincinnati/CincinnatiPostRegressionTests.cs b/OpenNest.Tests/Cincinnati/CincinnatiPostRegressionTests.cs index 1153a4fd..27402b9b 100644 --- a/OpenNest.Tests/Cincinnati/CincinnatiPostRegressionTests.cs +++ b/OpenNest.Tests/Cincinnati/CincinnatiPostRegressionTests.cs @@ -301,8 +301,6 @@ public class CincinnatiPostRegressionTests part.ApplyLeadIns( new CuttingParameters { - ArcCircleLeadIn = new LineLeadIn { Length = 0.125, ApproachAngle = 90 }, - ArcCircleLeadOut = new NoLeadOut(), ExternalLeadIn = new LineLeadIn { Length = leadIn, ApproachAngle = 90 }, ExternalLeadOut = new NoLeadOut(), }, diff --git a/OpenNest.Tests/Cincinnati/HolePlacementRegressionTests.cs b/OpenNest.Tests/Cincinnati/HolePlacementRegressionTests.cs index ef7ac8bc..b935a472 100644 --- a/OpenNest.Tests/Cincinnati/HolePlacementRegressionTests.cs +++ b/OpenNest.Tests/Cincinnati/HolePlacementRegressionTests.cs @@ -169,8 +169,6 @@ public class HolePlacementRegressionTests part.ApplyLeadIns( new CuttingParameters { - ArcCircleLeadIn = new LineLeadIn { Length = 0.125, ApproachAngle = 90 }, - ArcCircleLeadOut = new NoLeadOut(), ExternalLeadIn = new LineLeadIn { Length = 0.25, ApproachAngle = 90 }, ExternalLeadOut = new NoLeadOut(), }, diff --git a/OpenNest.Tests/CincinnatiCIFiber/CIFiberPostProcessorTests.cs b/OpenNest.Tests/CincinnatiCIFiber/CIFiberPostProcessorTests.cs index 31b54762..8c1b8134 100644 --- a/OpenNest.Tests/CincinnatiCIFiber/CIFiberPostProcessorTests.cs +++ b/OpenNest.Tests/CincinnatiCIFiber/CIFiberPostProcessorTests.cs @@ -184,7 +184,6 @@ public class CIFiberPostProcessorTests { InternalLeadIn = new LineLeadIn { Length = 0.125, ApproachAngle = 90 }, ExternalLeadIn = new LineLeadIn { Length = 0.125, ApproachAngle = 90 }, - ArcCircleLeadIn = new LineLeadIn { Length = 0.125, ApproachAngle = 90 }, }; TestLeadIns.Apply(plate); diff --git a/OpenNest.Tests/CincinnatiCIFiber/CIFiberSampleRegressionTests.cs b/OpenNest.Tests/CincinnatiCIFiber/CIFiberSampleRegressionTests.cs index 9663e85d..1bb4b6c0 100644 --- a/OpenNest.Tests/CincinnatiCIFiber/CIFiberSampleRegressionTests.cs +++ b/OpenNest.Tests/CincinnatiCIFiber/CIFiberSampleRegressionTests.cs @@ -54,14 +54,13 @@ public class CIFiberSampleRegressionTests var plate = nest.Plates[0]; plate.CuttingParameters = new CuttingParameters { - // OpenNest's own short perpendicular linear leads, including the - // circles (ArcCircleLeadIn). TF5200 13.2.4.1 requires a LINEAR + // OpenNest's own short perpendicular linear leads; circles take the + // internal lead. TF5200 13.2.4.1 requires a LINEAR // first motion block after G41/G42, so holes must have linear // leads. (The sample itself pierces holes at their centre and // uses 0.125 in perimeter leads; see the saved-lead-in test.) InternalLeadIn = new LineLeadIn { Length = 0.075, ApproachAngle = 90 }, ExternalLeadIn = new LineLeadIn { Length = 0.075, ApproachAngle = 90 }, - ArcCircleLeadIn = new LineLeadIn { Length = 0.075, ApproachAngle = 90 }, PierceClearance = 0.02, }; diff --git a/OpenNest.Tests/CuttingPlanning/ContinuedContourCheckTests.cs b/OpenNest.Tests/CuttingPlanning/ContinuedContourCheckTests.cs index d86f944f..de509e4a 100644 --- a/OpenNest.Tests/CuttingPlanning/ContinuedContourCheckTests.cs +++ b/OpenNest.Tests/CuttingPlanning/ContinuedContourCheckTests.cs @@ -116,7 +116,6 @@ public class ContinuedContourCheckTests { ExternalLeadIn = new LineLeadIn { Length = 0.2, ApproachAngle = 90 }, InternalLeadIn = new LineLeadIn { Length = 0.1, ApproachAngle = 90 }, - ArcCircleLeadIn = new LineLeadIn { Length = 0.1, ApproachAngle = 90 }, ExternalLeadOut = new NoLeadOut(), InternalLeadOut = new NoLeadOut(), }; diff --git a/OpenNest.Tests/CuttingPlanning/ContourCandidateEmissionTests.cs b/OpenNest.Tests/CuttingPlanning/ContourCandidateEmissionTests.cs index 52d23f10..9003bad2 100644 --- a/OpenNest.Tests/CuttingPlanning/ContourCandidateEmissionTests.cs +++ b/OpenNest.Tests/CuttingPlanning/ContourCandidateEmissionTests.cs @@ -175,7 +175,7 @@ public class ContourCandidateEmissionTests var parameters = ExplicitContourTests.Parameters(); parameters.RoundLeadInAngles = true; parameters.LeadInAngleIncrement = 90; - parameters.ArcCircleLeadIn = new LineLeadIn { Length = 2 }; + parameters.InternalLeadIn = new LineLeadIn { Length = 2 }; var p = ExplicitContourTests.Square(false); foreach (var center in new[] { new Vector(3, 3), new Vector(7, 7) }) { diff --git a/OpenNest.Tests/CuttingPlanning/ContourEntryFeasibilityTests.cs b/OpenNest.Tests/CuttingPlanning/ContourEntryFeasibilityTests.cs index d5a97e01..7590d50a 100644 --- a/OpenNest.Tests/CuttingPlanning/ContourEntryFeasibilityTests.cs +++ b/OpenNest.Tests/CuttingPlanning/ContourEntryFeasibilityTests.cs @@ -116,7 +116,6 @@ public class ContourEntryFeasibilityTests var parameters = ExplicitContourTests.Parameters(); parameters.ExternalLeadIn = new NoLeadIn(); parameters.InternalLeadIn = new NoLeadIn(); - parameters.ArcCircleLeadIn = new NoLeadIn(); var clean = ExplicitContourTests.Square(false); var prepared = PreparedContours.Capture(clean, parameters); var choice = prepared.Entry(0, 0, new Vector(0, 5)); diff --git a/OpenNest.Tests/CuttingPlanning/ContourRecoveryFileTests.cs b/OpenNest.Tests/CuttingPlanning/ContourRecoveryFileTests.cs index e02fe8e3..37f0b8c8 100644 --- a/OpenNest.Tests/CuttingPlanning/ContourRecoveryFileTests.cs +++ b/OpenNest.Tests/CuttingPlanning/ContourRecoveryFileTests.cs @@ -106,7 +106,6 @@ public class ContourRecoveryFileTests { parameters.ExternalLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }; parameters.InternalLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }; - parameters.ArcCircleLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }; } return parameters; } diff --git a/OpenNest.Tests/CuttingPlanning/CuttingGridOrderTests.cs b/OpenNest.Tests/CuttingPlanning/CuttingGridOrderTests.cs index eb24d4cb..3fb7e505 100644 --- a/OpenNest.Tests/CuttingPlanning/CuttingGridOrderTests.cs +++ b/OpenNest.Tests/CuttingPlanning/CuttingGridOrderTests.cs @@ -90,7 +90,6 @@ public class CuttingGridOrderTests { ExternalLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }, InternalLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }, - ArcCircleLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }, }; var result = CuttingPlanService.Plan(CuttingPlanRequest.ForPlate(plate, diff --git a/OpenNest.Tests/CuttingPlanning/CuttingReplayContractTests.cs b/OpenNest.Tests/CuttingPlanning/CuttingReplayContractTests.cs index 2a9883ef..d7a53b7e 100644 --- a/OpenNest.Tests/CuttingPlanning/CuttingReplayContractTests.cs +++ b/OpenNest.Tests/CuttingPlanning/CuttingReplayContractTests.cs @@ -171,7 +171,6 @@ public class CuttingReplayContractTests var settings = ExplicitContourTests.Parameters(); settings.RoundLeadInAngles = true; settings.LeadInAngleIncrement = 90; - settings.ArcCircleLeadIn = new LineLeadIn { Length = 10 }; var clean = PreparedContourTests.Holes(); if (shape == "mixed-circles") clean.Codes.OfType().Last().Rotation = RotationType.CW; if (shape == "arcs") @@ -181,6 +180,11 @@ public class CuttingReplayContractTests clean.ArcTo(4, 3, 5, 3, RotationType.CCW); clean.LineTo(6, 3); } + else + { + // Circles clamp an over-long lead to their radius; the arc slot has no clamp. + settings.InternalLeadIn = new LineLeadIn { Length = 10 }; + } var part = new Part(new Drawing("native", clean)); var snapshot = CuttingPlanService.Capture(new CuttingPlanRequest([part], Start, confirmedParameters: settings)); var ready = CuttingPlanService.Plan(snapshot); diff --git a/OpenNest.Tests/CuttingPlanning/ExplicitContourTests.cs b/OpenNest.Tests/CuttingPlanning/ExplicitContourTests.cs index 44981a51..b8fbe2bf 100644 --- a/OpenNest.Tests/CuttingPlanning/ExplicitContourTests.cs +++ b/OpenNest.Tests/CuttingPlanning/ExplicitContourTests.cs @@ -71,7 +71,7 @@ public class ExplicitContourTests var parameters = Parameters("line"); parameters.RoundLeadInAngles = true; parameters.LeadInAngleIncrement = 90; - parameters.ArcCircleLeadIn = new LineLeadIn { Length = 2 }; + parameters.InternalLeadIn = new LineLeadIn { Length = 2 }; var result = new ContourCuttingStrategy { Parameters = parameters }.Apply(program, new Vector(20, 20)); var calls = result.Program.Codes.OfType().ToArray(); Assert.Equal(2, calls.Length); @@ -124,7 +124,6 @@ public class ExplicitContourTests { ExternalLeadIn = lead, InternalLeadIn = lead, - ArcCircleLeadIn = lead, ExternalLeadOut = new NoLeadOut(), InternalLeadOut = new NoLeadOut(), PierceClearance = 0.05 diff --git a/OpenNest.Tests/CuttingPlanning/HoleDepartureTests.cs b/OpenNest.Tests/CuttingPlanning/HoleDepartureTests.cs index 3a78eec3..8b88c80b 100644 --- a/OpenNest.Tests/CuttingPlanning/HoleDepartureTests.cs +++ b/OpenNest.Tests/CuttingPlanning/HoleDepartureTests.cs @@ -44,10 +44,8 @@ public class HoleDepartureTests { ExternalLeadIn = lead, InternalLeadIn = lead, - ArcCircleLeadIn = lead, ExternalLeadOut = new NoLeadOut(), InternalLeadOut = new NoLeadOut(), - ArcCircleLeadOut = new NoLeadOut(), PierceClearance = 0 }; } diff --git a/OpenNest.Tests/CuttingPlanning/HoleLookAheadTests.cs b/OpenNest.Tests/CuttingPlanning/HoleLookAheadTests.cs index 4b01bd8f..92049f80 100644 --- a/OpenNest.Tests/CuttingPlanning/HoleLookAheadTests.cs +++ b/OpenNest.Tests/CuttingPlanning/HoleLookAheadTests.cs @@ -25,7 +25,6 @@ public class HoleLookAheadTests { var p = ExplicitContourTests.Parameters(); p.InternalLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }; - p.ArcCircleLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }; p.PierceClearance = 0; return p; } diff --git a/OpenNest.Tests/CuttingPlanning/ImportedArcHoleTests.cs b/OpenNest.Tests/CuttingPlanning/ImportedArcHoleTests.cs index 6c52e351..ee6605d9 100644 --- a/OpenNest.Tests/CuttingPlanning/ImportedArcHoleTests.cs +++ b/OpenNest.Tests/CuttingPlanning/ImportedArcHoleTests.cs @@ -25,10 +25,8 @@ public class ImportedArcHoleTests { ExternalLeadIn = lead, InternalLeadIn = lead, - ArcCircleLeadIn = lead, ExternalLeadOut = new NoLeadOut(), InternalLeadOut = new NoLeadOut(), - ArcCircleLeadOut = new NoLeadOut(), PierceClearance = 0.0625 }; } diff --git a/OpenNest.Tests/CuttingPlanning/InterlockingHoleRouteTests.cs b/OpenNest.Tests/CuttingPlanning/InterlockingHoleRouteTests.cs index 2124c5ea..d9b6741f 100644 --- a/OpenNest.Tests/CuttingPlanning/InterlockingHoleRouteTests.cs +++ b/OpenNest.Tests/CuttingPlanning/InterlockingHoleRouteTests.cs @@ -28,7 +28,6 @@ public class InterlockingHoleRouteTests { parameters.ExternalLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }; parameters.InternalLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }; - parameters.ArcCircleLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }; } var before = parts.Select(p => ExplicitContourTests.Fingerprint(p.Program)).ToArray(); var snapshot = CuttingPlanService.Capture(new CuttingPlanRequest(parts, diff --git a/OpenNest.Tests/CuttingPlanning/JointCuttingPlanTests.cs b/OpenNest.Tests/CuttingPlanning/JointCuttingPlanTests.cs index 93c9eddc..a85d92cd 100644 --- a/OpenNest.Tests/CuttingPlanning/JointCuttingPlanTests.cs +++ b/OpenNest.Tests/CuttingPlanning/JointCuttingPlanTests.cs @@ -16,7 +16,6 @@ public class JointCuttingPlanTests var (part, parameters) = Crossing(); parameters.ExternalLeadIn = new NoLeadIn(); parameters.InternalLeadIn = new NoLeadIn(); - parameters.ArcCircleLeadIn = new NoLeadIn(); var unchanged = Unchanged(part, parameters); var source = Read(part.Program, part.Location); Assert.Contains(new ReleasedContourState(reportMissingLeadIns: false).Check(source, Vector.Zero, 1), diff --git a/OpenNest.Tests/CuttingPlanning/OwnedCuttingParameterTests.cs b/OpenNest.Tests/CuttingPlanning/OwnedCuttingParameterTests.cs index 0260e5af..3f4d6e7e 100644 --- a/OpenNest.Tests/CuttingPlanning/OwnedCuttingParameterTests.cs +++ b/OpenNest.Tests/CuttingPlanning/OwnedCuttingParameterTests.cs @@ -36,10 +36,8 @@ public class OwnedCuttingParameterTests PierceDiameter = 0.3, ExternalLeadIn = leadIn, InternalLeadIn = leadIn, - ArcCircleLeadIn = leadIn, ExternalLeadOut = leadOut, InternalLeadOut = leadOut, - ArcCircleLeadOut = leadOut, TabConfig = tab, TabsEnabled = true, SupportTabs = true, @@ -122,7 +120,7 @@ public class OwnedCuttingParameterTests case "null-settings": source = null; break; case "null-sequence": source.Sequencing = null; break; case "null-assignment": source.Assignment = null; break; - case "null-lead": source.ArcCircleLeadIn = null; break; + case "null-lead": source.InternalLeadIn = null; break; case "null-leadout": source.InternalLeadOut = null; break; case "null-tab": source.TabsEnabled = true; break; case "dimension": source.PartSpacing = -1; break; @@ -131,7 +129,7 @@ public class OwnedCuttingParameterTests case "enum": source.Assignment.Method = (SequenceMethod)6; break; case "tab-lead": source.TabConfig = new NormalTab { TabLeadIn = new ArcLeadIn { Radius = double.PositiveInfinity } }; break; case "custom-in": source.InternalLeadIn = new CustomLeadIn(); break; - case "custom-out": source.ArcCircleLeadOut = new CustomLeadOut(); break; + case "custom-out": source.InternalLeadOut = new CustomLeadOut(); break; case "custom-tab": source.TabConfig = new CustomTab(); break; case "custom-settings": source = new CustomParameters(); break; case "custom-sequence": source.Sequencing = new CustomSequence(); break; diff --git a/OpenNest.Tests/CuttingPlanning/PerimeterLookAheadTests.cs b/OpenNest.Tests/CuttingPlanning/PerimeterLookAheadTests.cs index 499594c6..df4b768f 100644 --- a/OpenNest.Tests/CuttingPlanning/PerimeterLookAheadTests.cs +++ b/OpenNest.Tests/CuttingPlanning/PerimeterLookAheadTests.cs @@ -165,7 +165,7 @@ public class PerimeterLookAheadTests var parameters = Parameters(); parameters.RoundLeadInAngles = false; parameters.PierceClearance = 0; - parameters.ArcCircleLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }; + parameters.InternalLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }; var arrival = location + new Vector(20, 8); var before = ExplicitContourTests.Fingerprint(part.Program); var snapshot = CuttingPlanService.Capture(new CuttingPlanRequest([part], arrival, diff --git a/OpenNest.Tests/CuttingPlanning/PierceZoneTests.cs b/OpenNest.Tests/CuttingPlanning/PierceZoneTests.cs index a95c4125..693b61b4 100644 --- a/OpenNest.Tests/CuttingPlanning/PierceZoneTests.cs +++ b/OpenNest.Tests/CuttingPlanning/PierceZoneTests.cs @@ -322,10 +322,8 @@ public class PierceZoneTests { ExternalLeadIn = new LineLeadIn { Length = 1, ApproachAngle = 90 }, InternalLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }, - ArcCircleLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }, ExternalLeadOut = new NoLeadOut(), InternalLeadOut = new NoLeadOut(), - ArcCircleLeadOut = new NoLeadOut(), PierceClearance = 0, PierceDiameter = pierceDiameter, }; diff --git a/OpenNest.Tests/CuttingPlanning/PinnedContourTests.cs b/OpenNest.Tests/CuttingPlanning/PinnedContourTests.cs index ce4cafd8..5cee4b1f 100644 --- a/OpenNest.Tests/CuttingPlanning/PinnedContourTests.cs +++ b/OpenNest.Tests/CuttingPlanning/PinnedContourTests.cs @@ -168,7 +168,6 @@ public class PinnedContourTests { ExternalLeadIn = new ArcLeadIn { Radius = 0.15 }, InternalLeadIn = new ArcLeadIn { Radius = 0.15 }, - ArcCircleLeadIn = new ArcLeadIn { Radius = 0.15 }, ExternalLeadOut = new NoLeadOut(), InternalLeadOut = new NoLeadOut(), PierceClearance = 0.05 diff --git a/OpenNest.Tests/CuttingPlanning/PreparedContourTests.cs b/OpenNest.Tests/CuttingPlanning/PreparedContourTests.cs index 58a138e4..bc5e4818 100644 --- a/OpenNest.Tests/CuttingPlanning/PreparedContourTests.cs +++ b/OpenNest.Tests/CuttingPlanning/PreparedContourTests.cs @@ -188,7 +188,7 @@ public class PreparedContourTests { var source = Holes(); var parameters = ExplicitContourTests.Parameters(); - parameters.ArcCircleLeadIn = new LineLeadIn { Length = 10 }; + parameters.InternalLeadIn = new LineLeadIn { Length = 10 }; parameters.RoundLeadInAngles = true; parameters.LeadInAngleIncrement = 90; var prepared = PreparedContours.Capture(source, parameters); diff --git a/OpenNest.Tests/CuttingPlanning/ProblemNestRegressionTests.cs b/OpenNest.Tests/CuttingPlanning/ProblemNestRegressionTests.cs index 4fb7ac39..23f4a46c 100644 --- a/OpenNest.Tests/CuttingPlanning/ProblemNestRegressionTests.cs +++ b/OpenNest.Tests/CuttingPlanning/ProblemNestRegressionTests.cs @@ -129,7 +129,6 @@ public partial class ProblemNestRegressionTests(ITestOutputHelper output) var parameters = new CuttingParameters(); parameters.ExternalLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }; parameters.InternalLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }; - parameters.ArcCircleLeadIn = new LineLeadIn { Length = 0.15, ApproachAngle = 90 }; return parameters; } diff --git a/OpenNest.Tests/CuttingPlanning/SettingsFreshnessTests.cs b/OpenNest.Tests/CuttingPlanning/SettingsFreshnessTests.cs index 335d92f8..c425ada1 100644 --- a/OpenNest.Tests/CuttingPlanning/SettingsFreshnessTests.cs +++ b/OpenNest.Tests/CuttingPlanning/SettingsFreshnessTests.cs @@ -71,7 +71,7 @@ public class SettingsFreshnessTests switch (slot) { case "lead-in": settings.InternalLeadIn = new CustomLeadIn(); break; - case "lead-out": settings.ArcCircleLeadOut = new CustomLeadOut(); break; + case "lead-out": settings.InternalLeadOut = new CustomLeadOut(); break; case "tab": settings.TabConfig = new CustomTab(); break; case "tab-lead-in": settings.TabConfig = new NormalTab { TabLeadIn = new CustomLeadIn() }; break; case "sequence": settings.Sequencing = new CustomSequence(); break; @@ -172,10 +172,8 @@ public class SettingsFreshnessTests { ExternalLeadIn = lead, InternalLeadIn = lead, - ArcCircleLeadIn = lead, ExternalLeadOut = leadOut, InternalLeadOut = leadOut, - ArcCircleLeadOut = leadOut, TabConfig = tab, TabsEnabled = true }; diff --git a/OpenNest.Tests/CuttingPlanning/SideCoverageRegressionTests.cs b/OpenNest.Tests/CuttingPlanning/SideCoverageRegressionTests.cs index 9224cbde..2fdc3e36 100644 --- a/OpenNest.Tests/CuttingPlanning/SideCoverageRegressionTests.cs +++ b/OpenNest.Tests/CuttingPlanning/SideCoverageRegressionTests.cs @@ -238,7 +238,6 @@ public class SideCoverageRegressionTests { ExternalLeadIn = new LineLeadIn { Length = length, ApproachAngle = angle }, InternalLeadIn = new LineLeadIn { Length = length, ApproachAngle = angle }, - ArcCircleLeadIn = new LineLeadIn { Length = length }, ExternalLeadOut = new NoLeadOut(), InternalLeadOut = new NoLeadOut(), TabsEnabled = false, diff --git a/OpenNest.Tests/CuttingStrategy/HoleSubProgramTests.cs b/OpenNest.Tests/CuttingStrategy/HoleSubProgramTests.cs index 2036619d..836270ff 100644 --- a/OpenNest.Tests/CuttingStrategy/HoleSubProgramTests.cs +++ b/OpenNest.Tests/CuttingStrategy/HoleSubProgramTests.cs @@ -123,8 +123,6 @@ public class HoleSubProgramTests { Parameters = new CuttingParameters { - ArcCircleLeadIn = new LineLeadIn { Length = 0.125, ApproachAngle = 90 }, - ArcCircleLeadOut = new NoLeadOut(), }, }; @@ -167,8 +165,6 @@ public class HoleSubProgramTests { RoundLeadInAngles = true, LeadInAngleIncrement = 5.0, - ArcCircleLeadIn = new LineLeadIn { Length = 0.125, ApproachAngle = 90 }, - ArcCircleLeadOut = new NoLeadOut(), }, }; @@ -222,8 +218,6 @@ public class HoleSubProgramTests { Parameters = new CuttingParameters { - ArcCircleLeadIn = new LineLeadIn { Length = 0.125, ApproachAngle = 90 }, - ArcCircleLeadOut = new NoLeadOut(), }, }; @@ -283,8 +277,6 @@ public class HoleSubProgramTests { RoundLeadInAngles = true, LeadInAngleIncrement = 5.0, - ArcCircleLeadIn = new LineLeadIn { Length = 0.125, ApproachAngle = 90 }, - ArcCircleLeadOut = new NoLeadOut(), ExternalLeadIn = new LineLeadIn { Length = 0.25, ApproachAngle = 90 }, ExternalLeadOut = new NoLeadOut(), }; diff --git a/OpenNest.Tests/CuttingStrategy/PartLeadInTransformTests.cs b/OpenNest.Tests/CuttingStrategy/PartLeadInTransformTests.cs index 2a9b5b4d..784a1cdb 100644 --- a/OpenNest.Tests/CuttingStrategy/PartLeadInTransformTests.cs +++ b/OpenNest.Tests/CuttingStrategy/PartLeadInTransformTests.cs @@ -32,7 +32,7 @@ public class PartLeadInTransformTests new() { ExternalLeadIn = new LineLeadIn { Length = 0.5, ApproachAngle = 90 }, - ArcCircleLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 90 }, + InternalLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 90 }, }; private static Part MakeLeadInPart(Drawing drawing, double rotation) diff --git a/OpenNest.Tests/Data/MachineCuttingDefaultsTests.cs b/OpenNest.Tests/Data/MachineCuttingDefaultsTests.cs index f8f960f6..e1393496 100644 --- a/OpenNest.Tests/Data/MachineCuttingDefaultsTests.cs +++ b/OpenNest.Tests/Data/MachineCuttingDefaultsTests.cs @@ -48,14 +48,14 @@ public class MachineCuttingDefaultsTests Assert.True(MachineCuttingDefaults.ApplyTo(parameters, Machine(LineArc), NestOf(0.25))); - foreach (var leadIn in new[] { parameters.ExternalLeadIn, parameters.InternalLeadIn, parameters.ArcCircleLeadIn }) + foreach (var leadIn in new[] { parameters.ExternalLeadIn, parameters.InternalLeadIn }) { var lineArc = Assert.IsType(leadIn); Assert.Equal(0.125, lineArc.LineLength); Assert.Equal(0.0625, lineArc.ArcRadius); Assert.Equal(90, lineArc.ApproachAngle); } - foreach (var leadOut in new[] { parameters.ExternalLeadOut, parameters.InternalLeadOut, parameters.ArcCircleLeadOut }) + foreach (var leadOut in new[] { parameters.ExternalLeadOut, parameters.InternalLeadOut }) { var line = Assert.IsType(leadOut); Assert.Equal(0.0625, line.Length); @@ -118,7 +118,6 @@ public class MachineCuttingDefaultsTests Assert.Equal(0.3, Assert.IsType(parameters.ExternalLeadIn).Length); Assert.Equal(0.012, Assert.IsType(parameters.InternalLeadIn).Kerf); - Assert.IsType(parameters.ArcCircleLeadIn); } [Fact] diff --git a/OpenNest.Tests/Diagnostics/PostVerificationAnalyzerTests.cs b/OpenNest.Tests/Diagnostics/PostVerificationAnalyzerTests.cs index ab9dd3db..4c980dcf 100644 --- a/OpenNest.Tests/Diagnostics/PostVerificationAnalyzerTests.cs +++ b/OpenNest.Tests/Diagnostics/PostVerificationAnalyzerTests.cs @@ -607,6 +607,5 @@ public class PostVerificationAnalyzerTests { ExternalLeadIn = new LineLeadIn { Length = 0.5 }, InternalLeadIn = new LineLeadIn { Length = 0.5 }, - ArcCircleLeadIn = new LineLeadIn { Length = 0.5 } }; } diff --git a/OpenNest.Tests/DrawingProgramSnapshotTests.cs b/OpenNest.Tests/DrawingProgramSnapshotTests.cs index 96d7870e..cbae0e7a 100644 --- a/OpenNest.Tests/DrawingProgramSnapshotTests.cs +++ b/OpenNest.Tests/DrawingProgramSnapshotTests.cs @@ -205,7 +205,7 @@ public class DrawingProgramSnapshotTests part.ApplyLeadIns(new CuttingParameters { ExternalLeadIn = new LineLeadIn { Length = 0.5, ApproachAngle = 90 }, - ArcCircleLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 90 }, + InternalLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 90 }, }, new Vector(-5, -5)); part.LeadInsLocked = true; Assert.Contains(part.Program.Codes.OfType(), move => move.Layer == LayerType.Leadin); diff --git a/OpenNest.Tests/IO/PartLeadInSerializationTests.cs b/OpenNest.Tests/IO/PartLeadInSerializationTests.cs index 51b8af1c..10a1f70c 100644 --- a/OpenNest.Tests/IO/PartLeadInSerializationTests.cs +++ b/OpenNest.Tests/IO/PartLeadInSerializationTests.cs @@ -310,7 +310,7 @@ public class PartLeadInSerializationTests { ExternalLeadIn = new LineLeadIn { Length = 0.5, ApproachAngle = 90 }, ExternalLeadOut = new LineLeadOut { Length = 0.25 }, - ArcCircleLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 90 }, + InternalLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 90 }, TabsEnabled = true, TabConfig = new NormalTab { Size = 0.15 }, }; diff --git a/OpenNest.Tests/Reporting/NestReportTestData.cs b/OpenNest.Tests/Reporting/NestReportTestData.cs index 465c7e52..84d5c3d9 100644 --- a/OpenNest.Tests/Reporting/NestReportTestData.cs +++ b/OpenNest.Tests/Reporting/NestReportTestData.cs @@ -103,7 +103,7 @@ public static class NestReportTestData { ExternalLeadIn = new LineLeadIn { Length = 0.5, ApproachAngle = 90 }, ExternalLeadOut = new LineLeadOut { Length = 0.25 }, - ArcCircleLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 90 }, + InternalLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 90 }, TabsEnabled = true, TabConfig = new NormalTab { Size = 0.15 }, }, new Vector(-5, -5)); diff --git a/OpenNest.Tests/TabbedCutouts/TabbedCutoutBuilderTests.cs b/OpenNest.Tests/TabbedCutouts/TabbedCutoutBuilderTests.cs index ffa3f641..ce7ae5a1 100644 --- a/OpenNest.Tests/TabbedCutouts/TabbedCutoutBuilderTests.cs +++ b/OpenNest.Tests/TabbedCutouts/TabbedCutoutBuilderTests.cs @@ -240,7 +240,6 @@ public class TabbedCutoutBuilderTests { ExternalLeadIn = new LineLeadIn { Length = 0.25, ApproachAngle = 90 }, InternalLeadIn = new ArcLeadIn { Radius = 0.1 }, - ArcCircleLeadIn = new LineLeadIn { Length = 0.1, ApproachAngle = 90 }, }); Assert.True(planned.IsReady, planned.Describe); Assert.True(part.RestoreLeadInProgram(planned.Program, false)); diff --git a/OpenNest.WinForms.Tests/Forms/CuttingInspectionPanelTests.cs b/OpenNest.WinForms.Tests/Forms/CuttingInspectionPanelTests.cs index d83bfe75..c8b5bafe 100644 --- a/OpenNest.WinForms.Tests/Forms/CuttingInspectionPanelTests.cs +++ b/OpenNest.WinForms.Tests/Forms/CuttingInspectionPanelTests.cs @@ -957,10 +957,8 @@ public class CuttingInspectionPanelTests { ExternalLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 45 }, InternalLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 45 }, - ArcCircleLeadIn = new LineLeadIn { Length = 0.3, ApproachAngle = 45 }, ExternalLeadOut = new NoLeadOut(), InternalLeadOut = new NoLeadOut(), - ArcCircleLeadOut = new NoLeadOut(), }; private static void PumpUntil(Func condition) diff --git a/OpenNest/Actions/ActionLeadIn.cs b/OpenNest/Actions/ActionLeadIn.cs index bdec6619..dce2dbb9 100644 --- a/OpenNest/Actions/ActionLeadIn.cs +++ b/OpenNest/Actions/ActionLeadIn.cs @@ -576,8 +576,7 @@ namespace OpenNest.Actions { return contourType switch { - ContourType.ArcCircle => parameters.ArcCircleLeadIn ?? parameters.InternalLeadIn, - ContourType.Internal => parameters.InternalLeadIn, + ContourType.Internal or ContourType.ArcCircle => parameters.InternalLeadIn, _ => parameters.ExternalLeadIn, }; } diff --git a/OpenNest/Controls/CuttingPanel.cs b/OpenNest/Controls/CuttingPanel.cs index c45a763d..440edb0b 100644 --- a/OpenNest/Controls/CuttingPanel.cs +++ b/OpenNest/Controls/CuttingPanel.cs @@ -24,15 +24,11 @@ namespace OpenNest.Controls cboExternalLeadOut; private readonly ComboBox cboInternalLeadIn, cboInternalLeadOut; - private readonly ComboBox cboArcCircleLeadIn, - cboArcCircleLeadOut; private readonly Panel pnlExternalLeadIn, pnlExternalLeadOut; private readonly Panel pnlInternalLeadIn, pnlInternalLeadOut; - private readonly Panel pnlArcCircleLeadIn, - pnlArcCircleLeadOut; private readonly CheckBox chkTabsEnabled; private readonly NumericUpDown nudTabWidth; @@ -56,7 +52,6 @@ namespace OpenNest.Controls { 0 => ContourType.External, 1 => ContourType.Internal, - 2 => ContourType.ArcCircle, _ => null, }; } @@ -68,8 +63,8 @@ namespace OpenNest.Controls var index = value.Value switch { ContourType.External => 0, - ContourType.Internal => 1, - ContourType.ArcCircle => 2, + // Circles share the internal leads. + ContourType.Internal or ContourType.ArcCircle => 1, _ => -1, }; @@ -88,7 +83,6 @@ namespace OpenNest.Controls var tabExternal = new TabPage("External") { Padding = new Padding(4) }; var tabInternal = new TabPage("Internal") { Padding = new Padding(4) }; - var tabArcCircle = new TabPage("Arc / Circle") { Padding = new Padding(4) }; SetupTab( tabExternal, @@ -104,17 +98,9 @@ namespace OpenNest.Controls out cboInternalLeadOut, out pnlInternalLeadOut ); - SetupTab( - tabArcCircle, - out cboArcCircleLeadIn, - out pnlArcCircleLeadIn, - out cboArcCircleLeadOut, - out pnlArcCircleLeadOut - ); tabControl.Controls.Add(tabExternal); tabControl.Controls.Add(tabInternal); - tabControl.Controls.Add(tabArcCircle); var tabWrapper = new Panel { Dock = DockStyle.Top, Height = 340 }; tabWrapper.Controls.Add(tabControl); @@ -264,8 +250,6 @@ namespace OpenNest.Controls ExternalLeadOut = BuildLeadOut(cboExternalLeadOut, pnlExternalLeadOut), InternalLeadIn = BuildLeadIn(cboInternalLeadIn, pnlInternalLeadIn), InternalLeadOut = BuildLeadOut(cboInternalLeadOut, pnlInternalLeadOut), - ArcCircleLeadIn = BuildLeadIn(cboArcCircleLeadIn, pnlArcCircleLeadIn), - ArcCircleLeadOut = BuildLeadOut(cboArcCircleLeadOut, pnlArcCircleLeadOut), TabsEnabled = chkTabsEnabled.Checked && rbTabAll.Checked, TabConfig = new NormalTab { Size = (double)nudTabWidth.Value }, PierceClearance = (double)nudPierceClearance.Value, @@ -284,8 +268,6 @@ namespace OpenNest.Controls LoadLeadOut(cboExternalLeadOut, pnlExternalLeadOut, p.ExternalLeadOut); LoadLeadIn(cboInternalLeadIn, pnlInternalLeadIn, p.InternalLeadIn); LoadLeadOut(cboInternalLeadOut, pnlInternalLeadOut, p.InternalLeadOut); - LoadLeadIn(cboArcCircleLeadIn, pnlArcCircleLeadIn, p.ArcCircleLeadIn); - LoadLeadOut(cboArcCircleLeadOut, pnlArcCircleLeadOut, p.ArcCircleLeadOut); chkTabsEnabled.Checked = p.TabsEnabled || p.SupportTabs; rbSupportTab.Checked = p.SupportTabs; @@ -385,7 +367,7 @@ namespace OpenNest.Controls private void PopulateDropdowns() { foreach ( - var combo in new[] { cboExternalLeadIn, cboInternalLeadIn, cboArcCircleLeadIn } + var combo in new[] { cboExternalLeadIn, cboInternalLeadIn } ) { combo.Items.AddRange(LeadInTypes); @@ -393,7 +375,7 @@ namespace OpenNest.Controls } foreach ( - var combo in new[] { cboExternalLeadOut, cboInternalLeadOut, cboArcCircleLeadOut } + var combo in new[] { cboExternalLeadOut, cboInternalLeadOut } ) { combo.Items.AddRange(LeadOutTypes); @@ -405,11 +387,9 @@ namespace OpenNest.Controls { cboExternalLeadIn.SelectedIndexChanged += OnLeadInTypeChanged; cboInternalLeadIn.SelectedIndexChanged += OnLeadInTypeChanged; - cboArcCircleLeadIn.SelectedIndexChanged += OnLeadInTypeChanged; cboExternalLeadOut.SelectedIndexChanged += OnLeadOutTypeChanged; cboInternalLeadOut.SelectedIndexChanged += OnLeadOutTypeChanged; - cboArcCircleLeadOut.SelectedIndexChanged += OnLeadOutTypeChanged; } private void OnLeadInTypeChanged(object sender, EventArgs e) @@ -436,8 +416,6 @@ namespace OpenNest.Controls return pnlExternalLeadIn; if (combo == cboInternalLeadIn) return pnlInternalLeadIn; - if (combo == cboArcCircleLeadIn) - return pnlArcCircleLeadIn; return null; } @@ -447,8 +425,6 @@ namespace OpenNest.Controls return pnlExternalLeadOut; if (combo == cboInternalLeadOut) return pnlInternalLeadOut; - if (combo == cboArcCircleLeadOut) - return pnlArcCircleLeadOut; return null; } diff --git a/OpenNest/Forms/CuttingInspectionPanel.cs b/OpenNest/Forms/CuttingInspectionPanel.cs index fb4ff9cf..85254269 100644 --- a/OpenNest/Forms/CuttingInspectionPanel.cs +++ b/OpenNest/Forms/CuttingInspectionPanel.cs @@ -1154,7 +1154,7 @@ internal sealed class CuttingInspectionPanel : UserControl private void ShowSettings() { settingsLabel.Text = $"Outside: {Describe(parameters.ExternalLeadIn)} · Holes: {Describe(parameters.InternalLeadIn)} · " - + $"Arcs: {Describe(parameters.ArcCircleLeadIn)} · Tabs: {(parameters.TabsEnabled ? "on" : "off")}"; + + $"Tabs: {(parameters.TabsEnabled ? "on" : "off")}"; } private static string Describe(LeadIn leadIn) diff --git a/docs/machine-cutting-defaults.md b/docs/machine-cutting-defaults.md index 9bd33c0d..7eb98b4e 100644 --- a/docs/machine-cutting-defaults.md +++ b/docs/machine-cutting-defaults.md @@ -21,8 +21,8 @@ machine, material, grade and thickness recorded on the parameters. A plate that parameters keeps them: changing the machine, material or thickness does not rewrite leads the plate was planned with. -The machine holds one lead-in and one lead-out per thickness; both go to external, internal -and arc/circle contours. Types map as follows: +The machine holds one lead-in and one lead-out per thickness; both go to external and internal +contours (internal covers full circles). Types map as follows: | Machine type | Lead-in | |---|---| diff --git a/docs/nest-file-format.md b/docs/nest-file-format.md index 191f25dc..a52edbfe 100644 --- a/docs/nest-file-format.md +++ b/docs/nest-file-format.md @@ -97,6 +97,12 @@ cross-platform DTO mapping; the desktop settings serializer delegates to it so existing saved settings keep their JSON contract. Settings are independent of the saved part programs: restoring settings never regenerates those programs. +Lead settings are external (the perimeter) and internal (every cutout, full +circles included). Older files and desktop settings also stored +`arcCircleLeadIn`/`arcCircleLeadOut`; these are ignored on read and no longer +written, so circles in a re-planned older nest take its internal leads. Saved +part programs keep the leads they were cut with. + ## Clamp zones Each plate may carry an optional `clamps` array of fixed rectangular keep-out diff --git a/docs/problem-nests.md b/docs/problem-nests.md index 40045424..b26da386 100644 --- a/docs/problem-nests.md +++ b/docs/problem-nests.md @@ -30,7 +30,7 @@ nest's. A different outcome at the same or a better rank is only reported. When intended, update the baseline. Plates use their own cutting parameters. A plate without them uses line lead-ins of 0.15 at -90 degrees (external, internal and arc/circle) and no lead-outs. +90 degrees (external and internal) and no lead-outs. ## Adding a nest