diff --git a/OpenNest.Engine.Tests/Jobs/StockLadderTests.cs b/OpenNest.Engine.Tests/Jobs/StockLadderTests.cs index 0da3bff..459d3e4 100644 --- a/OpenNest.Engine.Tests/Jobs/StockLadderTests.cs +++ b/OpenNest.Engine.Tests/Jobs/StockLadderTests.cs @@ -5,6 +5,23 @@ namespace OpenNest.Engine.Tests.Jobs; public class StockLadderTests { + [Fact] + public void LowerPriorityNumberWinsScarceStock() + { + var geometry = PartGeometrySnapshot.FromProgram(TestDrawingFactory.Rectangle(4, 4)); + var high = new NestJobPart("high", geometry, 1); + var job = new NestJob( + new[] { new NestJobPart("low", geometry, 1, priority: 9), high }, + new[] { new NestPlateStock("only", new Size(4, 4), 1) } + ); + + var result = new StockLadderNestingEngine().Solve(job); + + Assert.Equal(0, high.Priority); + Assert.Equal("high", Assert.Single(Assert.Single(result.Plates).Placements).PartId); + Assert.Equal(0, result.Fulfillment.Single(f => f.PartId == "low").Placed); + } + private static NestJobPart Rectangle( string id, int quantity, diff --git a/OpenNest.Engine/Jobs/NestJobPart.cs b/OpenNest.Engine/Jobs/NestJobPart.cs index 15e8d75..7ec3d40 100644 --- a/OpenNest.Engine/Jobs/NestJobPart.cs +++ b/OpenNest.Engine/Jobs/NestJobPart.cs @@ -5,6 +5,13 @@ namespace OpenNest.Engine.Jobs; /// An immutable requirement, independent of drawing names, UI state, and drawing quantity counters. public sealed class NestJobPart { + /// Creates an immutable part requirement. + /// Unique requirement ID. + /// Snapshot of the part geometry. + /// Positive number requested. + /// Placement precedence: lower numbers are placed first and win scarce + /// stock. Zero is the default and highest ordinary priority; equal priorities are peers. + /// Allowed rotations, or null for automatic rotation. public NestJobPart( string id, PartGeometrySnapshot geometry, @@ -29,6 +36,10 @@ public sealed class NestJobPart /// Positive number requested; never decremented by placement code. public int Quantity { get; } + /// + /// Placement precedence: a lower number is placed first and wins scarce stock. + /// Zero is the default and highest ordinary priority. Parts with equal priority are peers. + /// public int Priority { get; } public RotationPolicy Rotation { get; } }