mirror of
https://github.com/ajisaacs/OpenNest.git
synced 2026-11-07 16:35:45 -05:00
N26-295's PT42 pairs saved spacing in slice 1 but every shared edge was still cut twice, costing a pass per edge and risking a freed part tipping under the head on the second pass. Plan Cutting now cuts a plate's common lines once unless the plate is set to cut them twice. Each group is cut member by member, owner before partner (a captured dependency that search and replay enforce, so a kept order cutting the partner first is a constraint conflict): the member's holes, then the shared cuts it owns as open CommonLine centerline cuts entered through the notch on the span's axis, then its remainder pieces, each ramped in from the kerf the shared cut opened. Capture marks the shared spans as tabs on the owned clean copy, so replay's contour accounting proves each perimeter is cut exactly once; a lead that fits at neither end refuses as UnsupportedGeometry naming the span, never shortened. Material still comes from the drawing, so utilization, quantity and overlap results do not change. Members are never support-tabbed; locked or excluded members and broken groups refuse. The CI Fiber post writes shared cuts in the cut-off form with a lead-in and no G41/G42, and remainders in the contour form on their perimeter's compensation side, named by a remainder comment. Cincinnati CL (whose PreApplied mode offsets nothing) and Gravograph refuse such nests, as do the desktop and console for any post without ICommonLinePostProcessor; nothing falls back to a silent double cut. Plate > Arrange > Cut Common Lines Twice keeps slice 1's behavior, persists with the plate and makes an open plan stale. Pre-post review now checks each span is cut once, on its centerline, by the member cut first, and the rapid check treats a finished member's remainders as an obstacle. Compensation start in void and cancel in kerf are unconfirmed on the CI FIBER 4020; release waits on a 3/16 stainless coupon trial. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
46 lines
2.3 KiB
C#
46 lines
2.3 KiB
C#
using System.Drawing;
|
|
using OpenNest.Geometry;
|
|
|
|
namespace OpenNest
|
|
{
|
|
public static class SpecialLayers
|
|
{
|
|
public static readonly Layer Default = new Layer("0") { Color = Color.White };
|
|
|
|
public static readonly Layer Cut = new Layer("CUT") { Color = Color.White };
|
|
|
|
public static readonly Layer Rapid = new Layer("RAPID") { Color = Color.Gray };
|
|
|
|
public static readonly Layer Display = new Layer("DISPLAY") { Color = Color.Cyan };
|
|
|
|
public static readonly Layer Leadin = new Layer("LEADIN") { Color = Color.Brown };
|
|
|
|
public static readonly Layer Leadout = new Layer("LEADOUT") { Color = Color.Brown };
|
|
|
|
public static readonly Layer Scribe = new Layer("SCRIBE") { Color = Color.Magenta };
|
|
|
|
public static readonly Layer Break = new Layer("BREAK") { Color = Color.Orange };
|
|
|
|
/// <summary>A tabbed cutout's uncut tabs: material boundary that is never cut.</summary>
|
|
public static readonly Layer Tab = new Layer("TAB") { Color = Color.Orange };
|
|
|
|
/// <summary>A supplied blank's shown-only outside edge: material boundary that is never cut.</summary>
|
|
public static readonly Layer DisplayPerimeter = new Layer("DISPLAY PERIMETER") { Color = Color.DarkCyan };
|
|
|
|
/// <summary>A common-line group's shared cut: an open centerline cut between two parts, not material.</summary>
|
|
public static readonly Layer CommonLine = new Layer("COMMON LINE") { Color = Color.Teal };
|
|
|
|
/// <summary>
|
|
/// True when an entity converted from a part program describes part material. Rapids
|
|
/// and scribe/etch marks are excluded: marks are only on the surface, so they never
|
|
/// bound material and must not affect nesting, collision, area, or validation. Break
|
|
/// cuts are excluded too: they run through material that stays attached at tabs. Tabs are
|
|
/// material: they close a tabbed cutout's boundary. A display perimeter is material: it is the
|
|
/// supplied blank's edge. A common line's shared cut is excluded: it runs in the kerf between two
|
|
/// parts, and their material comes from their perimeters.
|
|
/// </summary>
|
|
public static bool IsMaterial(Layer layer) =>
|
|
layer != Rapid && layer != Scribe && layer != Break && layer != CommonLine;
|
|
}
|
|
}
|