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