mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-10-14 23:01:56 -04:00
Block each clamp's keep-out into the max-rects free list before any
packing: same split logic as placements, not a used item (no contact
score, no material). The blocked rectangle accounts for the inflated
item model exactly - material keeps the bottom-edge clearance from the
clamp without paying an extra part-spacing tax; degenerate spans
collapse to the zone centerline (conservative, never permissive).
Zero-clamp sheets skip blocking entirely: three fixture layout hashes
(rectangle grid, mixed shapes, multi-sheet overflow), captured from the
unchanged packer at a3f1124, stay bit-identical (C2). With clamps:
placements never intrude, demand lands between two clamps when it fits,
a full-width front rail makes an otherwise feasible job Incomplete, and
a far-away zone leaves the layout hash equal to no-clamps.
Rectangles lane only; Irregular parity is Slice 2.
28 lines
1.2 KiB
C#
28 lines
1.2 KiB
C#
using OpenNest.CNC;
|
|
using OpenNest.Engine.Jobs;
|
|
using OpenNest.Geometry;
|
|
|
|
namespace OpenNest.Engine.Tests.NestingEngines;
|
|
|
|
public static class JobBuilder
|
|
{
|
|
public static NestJob Job(NestJobPart[] parts, NestPlateStock[] stock, NestJobOptions? options = null) =>
|
|
new(parts, stock, options);
|
|
|
|
public static NestJobPart Part(string id, Program program, int quantity,
|
|
RotationPolicy? rotation = null, int priority = 0) =>
|
|
new(id, PartGeometrySnapshot.FromProgram(program), quantity, priority, rotation);
|
|
|
|
/// <param name="width">Y extent.</param>
|
|
/// <param name="length">X extent.</param>
|
|
public static NestPlateStock Stock(string id, double width, double length, double spacing = 0,
|
|
Spacing edge = default, int quadrant = 1, int? quantity = null,
|
|
ClampZone[]? clampZones = null) =>
|
|
new(id, new Size(width, length), quantity, spacing, edge, quadrant, null, clampZones);
|
|
|
|
public static NestJobPart Rectangle(string id, double w, double h, int count,
|
|
RotationPolicy? rotation = null, double x = 0, double y = 0) =>
|
|
Part(id, Shapes.Polyline((x, y), (x + w, y), (x + w, y + h), (x, y + h)),
|
|
count, rotation ?? RotationPolicy.Fixed(0));
|
|
}
|