diff --git a/OpenNest.Posts.Cincinnati/CincinnatiPostConfig.cs b/OpenNest.Posts.Cincinnati/CincinnatiPostConfig.cs
index fc59426..1b595da 100644
--- a/OpenNest.Posts.Cincinnati/CincinnatiPostConfig.cs
+++ b/OpenNest.Posts.Cincinnati/CincinnatiPostConfig.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.ComponentModel;
namespace OpenNest.Posts.Cincinnati
{
@@ -92,205 +93,159 @@ namespace OpenNest.Posts.Cincinnati
///
public sealed class CincinnatiPostConfig
{
- ///
- /// Gets or sets the configuration name/identifier.
- /// Default: "CL940"
- ///
+ [Category("1. Output")]
+ [DisplayName("Configuration Name")]
+ [Description("Configuration name/identifier (e.g. CL940).")]
public string ConfigurationName { get; set; } = "CL940";
- ///
- /// Gets or sets the units for posted output.
- /// Default: Units.Inches
- ///
+ [Category("1. Output")]
+ [DisplayName("Posted Units")]
+ [Description("Units for posted output (Inches or Millimeters).")]
public Units PostedUnits { get; set; } = Units.Inches;
- ///
- /// Gets or sets the decimal accuracy for numeric output.
- /// Default: 4
- ///
+ [Category("1. Output")]
+ [DisplayName("Decimal Accuracy")]
+ [Description("Number of decimal places for numeric output.")]
public int PostedAccuracy { get; set; } = 4;
- ///
- /// Gets or sets how coordinate positioning is handled between parts.
- /// Default: CoordinateMode.G92
- ///
- public CoordinateMode CoordModeBetweenParts { get; set; } = CoordinateMode.G92;
-
- ///
- /// Gets or sets whether to use subprograms for sheet operations.
- /// Default: true
- ///
- public bool UseSheetSubprograms { get; set; } = true;
-
- ///
- /// Gets or sets the starting subprogram number for sheet operations.
- /// Default: 101
- ///
- public int SheetSubprogramStart { get; set; } = 101;
-
- ///
- /// Gets or sets whether to use M98 sub-programs for part geometry.
- /// When enabled, each unique part geometry is written as a reusable sub-program
- /// called via M98, reducing output size for nests with repeated parts.
- /// Default: false
- ///
- public bool UsePartSubprograms { get; set; } = false;
-
- ///
- /// Gets or sets the starting sub-program number for part geometry sub-programs.
- /// Default: 200
- ///
- public int PartSubprogramStart { get; set; } = 200;
-
- ///
- /// Gets or sets the subprogram number for variable declarations.
- /// Default: 100
- ///
- public int VariableDeclarationSubprogram { get; set; } = 100;
-
- ///
- /// Gets or sets how G89 parameters are provided.
- /// Default: G89Mode.LibraryFile
- ///
- public G89Mode ProcessParameterMode { get; set; } = G89Mode.LibraryFile;
-
- ///
- /// Gets or sets the default assist gas when Nest.AssistGas is empty.
- /// Default: "O2"
- ///
- public string DefaultAssistGas { get; set; } = "O2";
-
- ///
- /// Gets or sets the gas used for etch operations.
- /// Independent of the cutting assist gas — etch typically requires a specific gas.
- /// Default: "N2"
- ///
- public string DefaultEtchGas { get; set; } = "N2";
-
- ///
- /// Gets or sets the material-to-library mapping for cut operations.
- /// Each entry maps (material, thickness, gas) to a G89 library file.
- ///
- public List MaterialLibraries { get; set; } = new();
-
- ///
- /// Gets or sets the gas-to-library mapping for etch operations.
- /// Each entry maps a gas type to a G89 etch library file.
- ///
- public List EtchLibraries { get; set; } = new();
-
- ///
- /// Gets or sets whether to use exact stop mode (G61).
- /// Default: false
- ///
- public bool UseExactStopMode { get; set; } = false;
-
- ///
- /// Gets or sets where kerf compensation is applied.
- /// Default: KerfMode.ControllerSide
- ///
- public KerfMode KerfCompensation { get; set; } = KerfMode.ControllerSide;
-
- ///
- /// Gets or sets the default side for kerf compensation.
- /// Default: KerfSide.Left
- ///
- public KerfSide DefaultKerfSide { get; set; } = KerfSide.Left;
-
- ///
- /// Gets or sets how M47 is used in interior cuts.
- /// Default: M47Mode.Always
- ///
- public M47Mode InteriorM47 { get; set; } = M47Mode.Always;
-
- ///
- /// Gets or sets how M47 is used in exterior cuts.
- /// Default: M47Mode.Always
- ///
- public M47Mode ExteriorM47 { get; set; } = M47Mode.Always;
-
- ///
- /// Gets or sets the safety head raise distance (in machine units).
- /// Default: 2000
- ///
- public int? SafetyHeadraiseDistance { get; set; } = 2000;
-
- ///
- /// Gets or sets the distance threshold for M47 override.
- /// Default: null
- ///
- public double? M47OverrideDistanceThreshold { get; set; } = null;
-
- ///
- /// Gets or sets whether to use anti-dive functionality.
- /// Default: true
- ///
- public bool UseAntiDive { get; set; } = true;
-
- ///
- /// Gets or sets whether to use smart rapids optimization.
- /// Default: false
- ///
- public bool UseSmartRapids { get; set; } = false;
-
- ///
- /// Gets or sets when pallet exchange occurs.
- /// Default: PalletMode.EndOfSheet
- ///
- public PalletMode PalletExchange { get; set; } = PalletMode.EndOfSheet;
-
- ///
- /// Gets or sets whether to use line numbers in output.
- /// Default: true
- ///
+ [Category("1. Output")]
+ [DisplayName("Use Line Numbers")]
+ [Description("Include line numbers in output.")]
public bool UseLineNumbers { get; set; } = true;
- ///
- /// Gets or sets the starting line number for features.
- /// Default: 1
- ///
+ [Category("1. Output")]
+ [DisplayName("Feature Line Number Start")]
+ [Description("Starting line number for features.")]
public int FeatureLineNumberStart { get; set; } = 1;
- ///
- /// Gets or sets whether to use speed/gas commands.
- /// Default: false
- ///
+ [Category("2. Subprograms")]
+ [DisplayName("Use Sheet Subprograms")]
+ [Description("Use subprograms for sheet operations.")]
+ public bool UseSheetSubprograms { get; set; } = true;
+
+ [Category("2. Subprograms")]
+ [DisplayName("Sheet Subprogram Start")]
+ [Description("Starting subprogram number for sheet operations.")]
+ public int SheetSubprogramStart { get; set; } = 101;
+
+ [Category("2. Subprograms")]
+ [DisplayName("Use Part Subprograms")]
+ [Description("Use M98 sub-programs for part geometry. Reduces output size for repeated parts.")]
+ public bool UsePartSubprograms { get; set; } = false;
+
+ [Category("2. Subprograms")]
+ [DisplayName("Part Subprogram Start")]
+ [Description("Starting sub-program number for part geometry sub-programs.")]
+ public int PartSubprogramStart { get; set; } = 200;
+
+ [Category("2. Subprograms")]
+ [DisplayName("Variable Declaration Subprogram")]
+ [Description("Subprogram number for variable declarations.")]
+ public int VariableDeclarationSubprogram { get; set; } = 100;
+
+ [Category("3. Positioning")]
+ [DisplayName("Coordinate Mode Between Parts")]
+ [Description("How coordinate positioning is handled between parts (G92, G91, or G53).")]
+ public CoordinateMode CoordModeBetweenParts { get; set; } = CoordinateMode.G92;
+
+ [Category("4. Process")]
+ [DisplayName("Process Parameter Mode")]
+ [Description("How G89 parameters are provided (LibraryFile or Explicit).")]
+ public G89Mode ProcessParameterMode { get; set; } = G89Mode.LibraryFile;
+
+ [Category("4. Process")]
+ [DisplayName("Default Assist Gas")]
+ [Description("Default assist gas when Nest.AssistGas is empty.")]
+ public string DefaultAssistGas { get; set; } = "O2";
+
+ [Category("4. Process")]
+ [DisplayName("Default Etch Gas")]
+ [Description("Gas used for etch operations.")]
+ public string DefaultEtchGas { get; set; } = "N2";
+
+ [Category("4. Process")]
+ [DisplayName("Use Exact Stop Mode")]
+ [Description("Enable exact stop mode (G61).")]
+ public bool UseExactStopMode { get; set; } = false;
+
+ [Category("4. Process")]
+ [DisplayName("Use Speed/Gas Commands")]
+ [Description("Enable speed/gas commands in output.")]
public bool UseSpeedGas { get; set; } = false;
- ///
- /// Gets or sets the feedrate percentage for lead-in moves.
- /// Default: 0.5 (50%)
- ///
+ [Category("4. Process")]
+ [DisplayName("Use Anti-Dive")]
+ [Description("Enable anti-dive functionality.")]
+ public bool UseAntiDive { get; set; } = true;
+
+ [Category("4. Process")]
+ [DisplayName("Use Smart Rapids")]
+ [Description("Enable smart rapids optimization.")]
+ public bool UseSmartRapids { get; set; } = false;
+
+ [Category("5. Kerf")]
+ [DisplayName("Kerf Compensation")]
+ [Description("Where kerf compensation is applied (ControllerSide or PreApplied).")]
+ public KerfMode KerfCompensation { get; set; } = KerfMode.ControllerSide;
+
+ [Category("5. Kerf")]
+ [DisplayName("Default Kerf Side")]
+ [Description("Default side for kerf compensation (Left or Right).")]
+ public KerfSide DefaultKerfSide { get; set; } = KerfSide.Left;
+
+ [Category("6. M47 (Optional Stop)")]
+ [DisplayName("Interior M47")]
+ [Description("How M47 is used in interior cuts.")]
+ public M47Mode InteriorM47 { get; set; } = M47Mode.Always;
+
+ [Category("6. M47 (Optional Stop)")]
+ [DisplayName("Exterior M47")]
+ [Description("How M47 is used in exterior cuts.")]
+ public M47Mode ExteriorM47 { get; set; } = M47Mode.Always;
+
+ [Category("6. M47 (Optional Stop)")]
+ [DisplayName("M47 Override Distance Threshold")]
+ [Description("Distance threshold for M47 override. Null = no override.")]
+ public double? M47OverrideDistanceThreshold { get; set; } = null;
+
+ [Category("7. Safety")]
+ [DisplayName("Safety Headraise Distance")]
+ [Description("Safety head raise distance in machine units. Null = disabled.")]
+ public int? SafetyHeadraiseDistance { get; set; } = 2000;
+
+ [Category("8. Pallet")]
+ [DisplayName("Pallet Exchange")]
+ [Description("When pallet exchange occurs (None, EndOfSheet, or StartAndEnd).")]
+ public PalletMode PalletExchange { get; set; } = PalletMode.EndOfSheet;
+
+ [Category("9. Feedrates")]
+ [DisplayName("Lead-In Feedrate %")]
+ [Description("Feedrate percentage for lead-in moves (e.g. 0.5 = 50%).")]
public double LeadInFeedratePercent { get; set; } = 0.5;
- ///
- /// Gets or sets the feedrate percentage for lead-in arc-to-line moves.
- /// Default: 0.5 (50%)
- ///
+ [Category("9. Feedrates")]
+ [DisplayName("Lead-In Arc Line 2 Feedrate %")]
+ [Description("Feedrate percentage for lead-in arc-to-line moves.")]
public double LeadInArcLine2FeedratePercent { get; set; } = 0.5;
- ///
- /// Gets or sets the feedrate percentage for lead-out moves.
- /// Default: 0.5 (50%)
- ///
+ [Category("9. Feedrates")]
+ [DisplayName("Lead-Out Feedrate %")]
+ [Description("Feedrate percentage for lead-out moves.")]
public double LeadOutFeedratePercent { get; set; } = 0.5;
- ///
- /// Gets or sets the feedrate multiplier for circular cuts.
- /// Default: 0.8 (80%)
- ///
+ [Category("9. Feedrates")]
+ [DisplayName("Circle Feedrate Multiplier")]
+ [Description("Feedrate multiplier for circular cuts (e.g. 0.8 = 80%).")]
public double CircleFeedrateMultiplier { get; set; } = 0.8;
- ///
- /// Gets or sets the arc feedrate calculation mode.
- /// Default: ArcFeedrateMode.None
- ///
+ [Category("9. Feedrates")]
+ [DisplayName("Arc Feedrate Mode")]
+ [Description("Arc feedrate calculation mode (None, Percentages, or Variables).")]
public ArcFeedrateMode ArcFeedrate { get; set; } = ArcFeedrateMode.None;
- ///
- /// Gets or sets the radius-based arc feedrate ranges.
- /// Ranges are matched from smallest MaxRadius to largest.
- ///
+ [Category("9. Feedrates")]
+ [DisplayName("Arc Feedrate Ranges")]
+ [Description("Radius-based arc feedrate ranges. Matched from smallest to largest MaxRadius.")]
public List ArcFeedrateRanges { get; set; } = new()
{
new() { MaxRadius = 0.125, FeedratePercent = 0.25, VariableNumber = 123 },
@@ -298,17 +253,25 @@ namespace OpenNest.Posts.Cincinnati
new() { MaxRadius = 4.500, FeedratePercent = 0.80, VariableNumber = 125 }
};
- ///
- /// Gets or sets the variable number for sheet width.
- /// Default: 110
- ///
+ [Category("A. Variables")]
+ [DisplayName("Sheet Width Variable")]
+ [Description("Variable number for sheet width.")]
public int SheetWidthVariable { get; set; } = 110;
- ///
- /// Gets or sets the variable number for sheet length.
- /// Default: 111
- ///
+ [Category("A. Variables")]
+ [DisplayName("Sheet Length Variable")]
+ [Description("Variable number for sheet length.")]
public int SheetLengthVariable { get; set; } = 111;
+
+ [Category("B. Libraries")]
+ [DisplayName("Material Libraries")]
+ [Description("Material-to-library mapping for cut operations. Maps (material, thickness, gas) to a G89 library file.")]
+ public List MaterialLibraries { get; set; } = new();
+
+ [Category("B. Libraries")]
+ [DisplayName("Etch Libraries")]
+ [Description("Gas-to-library mapping for etch operations.")]
+ public List EtchLibraries { get; set; } = new();
}
public class MaterialLibraryEntry