mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-11-06 15:45:44 -05:00
Slice 3 of common-line cutting. On costly plate (N26-295: 3/16 RA310S at about $2,500 a sheet) pairing parts one kerf apart fits the part the spacing cannot: the last plate's 38 parts fit on one 48x120 with Auto Nest only with pairs. - Drawing Properties gains "Allow common line" (Drawing.AllowCommonLine, off by default because customer edge-quality needs vary). The nest's CommonLineUsage (Off / When it adds parts / Whenever available) is set in Auto Nest and seeded from Tools > Nest Defaults; both persist (nest.json, defaults.json). - NestPipeline runs the ordinary solve, then, with a level on, trials where eligible parts are offered as kerf-gap pair compounds. Placed pairs expand into parts plus explicit NestJobCommonLine groups, are validated again, and CommonLineRanking keeps a trial only by the level: count first, then sheets; "when it adds parts" keeps the plain layout on a tie, "whenever" also takes a shorter cut or less material, never at the cost of a part. Engines, FillScore and their comparers are unchanged; Off asks the engine exactly what it did. - NestLayoutCheck exempts members only through a sheet's explicit group list and only when the job allows common lines; materializing and committing create Plate.CommonLines. - Server nesting writes common-line jobs as version 3 and replays the recorded trial answers, so the desktop binds the same groups. - Fill Area honors the level through a PlateFillService overload. - The benchmark gains --common-lines <level> --kerf <k>. Benchmark (synthetic nests + N26-295, --parallel 1): with no flag and with --common-lines off every engine matches the base commit; with a level on no layout becomes invalid and three runs save a sheet at equal nested area. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 lines
1001 B
C#
29 lines
1001 B
C#
using System.Linq;
|
|
using OpenNest.Engine.Jobs;
|
|
|
|
namespace OpenNest.Benchmark
|
|
{
|
|
/// <summary>
|
|
/// <c>--common-lines</c>: solve every job through <see cref="NestPipeline"/> at this usage
|
|
/// level and kerf, with every part allowed to share a common line.
|
|
/// </summary>
|
|
public sealed record CommonLineSetting(CommonLineUsage Usage, double Kerf)
|
|
{
|
|
public NestJob Apply(NestJob job)
|
|
{
|
|
var o = job.Options;
|
|
var options = new NestJobOptions(o.PlacementStrategy, o.MaxPlates, o.SalvageRate,
|
|
o.MinimumSalvageDimension, o.SearchUntilCancelled, o.OffcutCut)
|
|
{
|
|
CommonLineUsage = Usage,
|
|
CommonLineKerf = Kerf,
|
|
};
|
|
var parts = job.Parts.Select(p => new NestJobPart(p.Id, p.Geometry, p.Quantity, p.Priority, p.Rotation)
|
|
{
|
|
AllowCommonLine = true,
|
|
});
|
|
return new NestJob(parts, job.Plates, options);
|
|
}
|
|
}
|
|
}
|