Repo-wide sweep with the pinned CSharpier 1.3.0 tool. Whitespace and line-wrapping only; OpenNest.Engine.Tests (109) and OpenNest.IO.Tests pass after reformat, full solution builds 0 errors. Added .csharpierignore so csproj/config XML keeps its existing layout (CSharpier's XML wrapping churns attributes with zero benefit). Formatting is now enforceable: dotnet csharpier check . passes.
39 lines
1.3 KiB
C#
39 lines
1.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace OpenNest;
|
|
|
|
/// <summary>One material/unit system's requirements. Collections are copied; all nested values are immutable.</summary>
|
|
public sealed class NestJob
|
|
{
|
|
public NestJob(
|
|
IEnumerable<NestJobPart> parts,
|
|
IEnumerable<NestPlateStock> plates,
|
|
NestJobOptions options = null
|
|
)
|
|
{
|
|
Parts = Own(parts);
|
|
Plates = Own(plates);
|
|
Options = options ?? new NestJobOptions();
|
|
if (
|
|
Parts.Select(p => p.Id).Distinct(StringComparer.Ordinal).Count() != Parts.Count
|
|
|| Plates.Select(p => p.Id).Distinct(StringComparer.Ordinal).Count() != Plates.Count
|
|
)
|
|
throw new ArgumentException("Part and stock IDs must each be unique.");
|
|
}
|
|
|
|
public IReadOnlyList<NestJobPart> Parts { get; }
|
|
public IReadOnlyList<NestPlateStock> Plates { get; }
|
|
public NestJobOptions Options { get; }
|
|
|
|
internal static IReadOnlyList<T> Own<T>(IEnumerable<T> source)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(source);
|
|
var values = source.ToArray();
|
|
if (values.Any(value => value is null))
|
|
throw new ArgumentException("Null entries are not allowed.", nameof(source));
|
|
return Array.AsReadOnly(values);
|
|
}
|
|
}
|