using OpenNest.CNC.CuttingStrategy; namespace OpenNest.IO; /// /// JSON-safe cutting parameters shared by nest files and desktop settings. /// Lead and tab discriminators avoid serializing abstract domain types. /// public class CuttingParametersDto { public int Id { get; set; } public string MachineName { get; set; } public string MaterialName { get; set; } public string Grade { get; set; } public double Thickness { get; set; } public double Kerf { get; set; } public double PartSpacing { get; set; } public LeadInDto ExternalLeadIn { get; set; } public LeadOutDto ExternalLeadOut { get; set; } public LeadInDto InternalLeadIn { get; set; } public LeadOutDto InternalLeadOut { get; set; } // Older files also stored arcCircleLeadIn/arcCircleLeadOut. Circles now use the internal // leads, so those keys are ignored on read and no longer written. public bool TabsEnabled { get; set; } // Legacy settings only stored tabWidth. A missing TabConfig uses that width; // Type = "None" explicitly records a null tab in a nest parameter snapshot. public double TabWidth { get; set; } public TabDto TabConfig { get; set; } public double PierceClearance { get; set; } public double PierceDiameter { get; set; } public bool RoundLeadInAngles { get; set; } public double LeadInAngleIncrement { get; set; } public bool SupportTabs { get; set; } public bool TabBySize { get; set; } // The size range's JSON keys keep their names from when only plates with no support bed used it. public double NoBedTabMinWidth { get; set; } public double NoBedTabMaxWidth { get; set; } public double TabHeldMaxLength { get; set; } // Written only when on, so files and settings saved without it are unchanged. [System.Text.Json.Serialization.JsonIgnore(Condition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingDefault)] public bool SliceTippingSlugs { get; set; } public SequenceDto Sequencing { get; set; } = new(); public AssignmentDto Assignment { get; set; } = new(); public class LeadInDto { public string Type { get; set; } = "None"; public double Length { get; set; } public double ApproachAngle { get; set; } public double Radius { get; set; } // Absent from files written before arc lead-ins had a sweep: they were half circles. public double SweepAngle { get; set; } = ArcLeadIn.DefaultSweepAngle; public double LineLength { get; set; } public double ArcRadius { get; set; } public double Kerf { get; set; } public double Length1 { get; set; } public double Angle1 { get; set; } public double Length2 { get; set; } public double Angle2 { get; set; } } public class LeadOutDto { public string Type { get; set; } = "None"; public double Length { get; set; } public double ApproachAngle { get; set; } public double Radius { get; set; } public double GapSize { get; set; } } public class TabDto { public string Type { get; set; } = "None"; public double Size { get; set; } public LeadInDto TabLeadIn { get; set; } public LeadOutDto TabLeadOut { get; set; } public double CutoutMinWidth { get; set; } public double CutoutMinHeight { get; set; } public double CutoutMaxWidth { get; set; } public double CutoutMaxHeight { get; set; } public int MachineTabId { get; set; } public double BreakerDepth { get; set; } public double BreakerLeadInLength { get; set; } public double BreakerAngle { get; set; } } public class SequenceDto { public SequenceMethod Method { get; set; } = SequenceMethod.Advanced; public double SmallCutoutWidth { get; set; } = 1.5; public double SmallCutoutHeight { get; set; } = 1.5; public double MediumCutoutWidth { get; set; } = 8.0; public double MediumCutoutHeight { get; set; } = 8.0; public double DistanceMediumSmall { get; set; } public bool AlternateRowsColumns { get; set; } = true; public bool AlternateCutoutsWithinRowColumn { get; set; } = true; public double MinDistanceBetweenRowsColumns { get; set; } = 0.25; } public class AssignmentDto { public SequenceMethod Method { get; set; } = SequenceMethod.Advanced; public string Preference { get; set; } = "ILAT"; public double MinGeometryLength { get; set; } = 0.01; } }