diff --git a/OpenNest.Engine/CuttingPlanning/ContourEntryFeasibility.cs b/OpenNest.Engine/CuttingPlanning/ContourEntryFeasibility.cs index ee88fd48..024782ee 100644 --- a/OpenNest.Engine/CuttingPlanning/ContourEntryFeasibility.cs +++ b/OpenNest.Engine/CuttingPlanning/ContourEntryFeasibility.cs @@ -90,7 +90,9 @@ public sealed class ContourEntryFeasibility return new(ContourFeasibilityStatus.Incomplete, "Foreign contour choice."); // A drawing pin's entry is a fixed emission, accepted as given: it is never filtered // out here. The emitted program's checks report its violations as warnings. - if (prepared.PinnedEntry(choice.ContourOrdinal) == choice) + // A forged ordinal falls through to the probe, which refuses it as Incomplete. + if (choice.ContourOrdinal >= 0 && choice.ContourOrdinal < prepared.Count + && prepared.PinnedEntry(choice.ContourOrdinal) == choice) return new(ContourFeasibilityStatus.Clear, null); var key = new Key(choice.ContourOrdinal, choice.EntityOrdinal, choice.Point.X, choice.Point.Y, nodeContext ?? string.Empty); diff --git a/OpenNest.Tests/CuttingPlanning/ContourEntryFeasibilityTests.cs b/OpenNest.Tests/CuttingPlanning/ContourEntryFeasibilityTests.cs index 9f432a4f..d5a97e01 100644 --- a/OpenNest.Tests/CuttingPlanning/ContourEntryFeasibilityTests.cs +++ b/OpenNest.Tests/CuttingPlanning/ContourEntryFeasibilityTests.cs @@ -176,12 +176,14 @@ public class ContourEntryFeasibilityTests var (other, _, _) = PreparedSquare(); var forgedContour = choice with { Owner = other, ContourOrdinal = 99 }; var forgedEntity = choice with { Owner = prepared, EntityOrdinal = 99 }; + var forgedOwnedContour = choice with { Owner = prepared, ContourOrdinal = 99 }; var feasibility = new ContourEntryFeasibility(prepared, At, own, []); var verdict = feasibility.Check(forgedContour); Assert.Equal(ContourFeasibilityStatus.Incomplete, verdict.Status); Assert.False(string.IsNullOrEmpty(verdict.Reason)); Assert.Equal(ContourFeasibilityStatus.Incomplete, feasibility.Check(forgedEntity).Status); + Assert.Equal(ContourFeasibilityStatus.Incomplete, feasibility.Check(forgedOwnedContour).Status); } [Fact]