GeometrySimplifier/ArcFit now fit arcs that pass exactly through run endpoints while balancing tangency error between trusted and estimated directions, fixing arcs that previously bulged or broke tangent continuity at fillet/compound-curve junctions. GravographIS post processor gains per-layer (engrave/cut) tool passes via a new GravographISPostConfig, so ENGRAVE/ETCH-tagged geometry runs as a separate scribe pass with its own feed/depth and an operator pause before the cut pass (spring-floated spindle needs a tool swap). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
82 lines
3.1 KiB
C#
82 lines
3.1 KiB
C#
using System.ComponentModel;
|
|
using OpenNest.CNC;
|
|
|
|
namespace OpenNest.Posts.GravographIS
|
|
{
|
|
/// <summary>
|
|
/// Cut parameters for one kind of pass (engrave or cut). Edited in the post
|
|
/// configuration PropertyGrid and persisted to JSON.
|
|
/// </summary>
|
|
[TypeConverter(typeof(ExpandableObjectConverter))]
|
|
public sealed class LayerCutConfig
|
|
{
|
|
[DisplayName("Feed (mm/sec)")]
|
|
[Description("XY and Z feed for this pass. Patches the VS and VZ wire commands.")]
|
|
public int FeedMmPerSec { get; set; } = 10;
|
|
|
|
[DisplayName("Depth (inches)")]
|
|
[Description("Programmed Z plunge (DZ). Note: the spring-floated spindle means this does not set actual cut depth — tool protrusion does.")]
|
|
public double Depth { get; set; } = 0.25;
|
|
|
|
[DisplayName("Pause Before")]
|
|
[Description("Stop the spindle and prompt the operator before this pass begins, so the tool can be swapped/adjusted.")]
|
|
public bool PauseBefore { get; set; }
|
|
|
|
[DisplayName("Pause Message")]
|
|
[Description("Message shown on the controller during the pause.")]
|
|
public string PauseMessage { get; set; } = "";
|
|
|
|
public override string ToString() => $"{FeedMmPerSec} mm/s, {Depth:0.###}\"" + (PauseBefore ? ", pause" : "");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Configuration for the Gravograph IS post processor: one <see cref="LayerCutConfig"/>
|
|
/// per cut kind. The engrave block applies to <see cref="LayerType.Scribe"/> paths,
|
|
/// the cut block to <see cref="LayerType.Cut"/>/<see cref="LayerType.Leadin"/>/<see cref="LayerType.Leadout"/>.
|
|
/// The cut block carries the tool-change pause by default.
|
|
/// </summary>
|
|
public sealed class GravographISPostConfig
|
|
{
|
|
[Category("Engrave (Scribe)")]
|
|
[DisplayName("Engrave")]
|
|
[Description("Parameters for engrave/scribe geometry (text).")]
|
|
public LayerCutConfig Engrave { get; set; } = new LayerCutConfig
|
|
{
|
|
FeedMmPerSec = 10,
|
|
Depth = 0.25,
|
|
PauseBefore = false,
|
|
PauseMessage = "",
|
|
};
|
|
|
|
[Category("Cut")]
|
|
[DisplayName("Cut")]
|
|
[Description("Parameters for cut geometry (outlines). Pauses for a tool change by default.")]
|
|
public LayerCutConfig Cut { get; set; } = new LayerCutConfig
|
|
{
|
|
FeedMmPerSec = 3,
|
|
Depth = 0.25,
|
|
PauseBefore = true,
|
|
PauseMessage = "Change tool",
|
|
};
|
|
|
|
/// <summary>
|
|
/// Returns the cut config a polyline of the given layer should use, or null
|
|
/// if the layer is non-cutting (<see cref="LayerType.Display"/>) and should be skipped.
|
|
/// </summary>
|
|
public LayerCutConfig ConfigFor(LayerType layer)
|
|
{
|
|
switch (layer)
|
|
{
|
|
case LayerType.Scribe:
|
|
return Engrave;
|
|
case LayerType.Cut:
|
|
case LayerType.Leadin:
|
|
case LayerType.Leadout:
|
|
return Cut;
|
|
default:
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
}
|