using System; 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, int quantity, int priority = 0, RotationPolicy rotation = null ) { ArgumentException.ThrowIfNullOrWhiteSpace(id); ArgumentNullException.ThrowIfNull(geometry); if (quantity <= 0) throw new ArgumentOutOfRangeException(nameof(quantity)); Id = id; Geometry = geometry; Quantity = quantity; Priority = priority; Rotation = rotation ?? RotationPolicy.Automatic; } public string Id { get; } public PartGeometrySnapshot Geometry { get; } /// 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; } }