From ffd060bf61d25e539534a32c65bee51bf8cb50be Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Sun, 5 Apr 2026 00:38:02 -0400 Subject: [PATCH] feat: serialize plate optimizer settings in nest files Add PlateOptions and SalvageRate properties to the Nest class and round-trip them through NestWriter/NestReader via a new PlateOptionDto. Co-Authored-By: Claude Opus 4.6 (1M context) --- OpenNest.Core/Nest.cs | 5 +++++ OpenNest.IO/NestFormat.cs | 9 +++++++++ OpenNest.IO/NestReader.cs | 12 ++++++++++++ OpenNest.IO/NestWriter.cs | 9 ++++++++- 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/OpenNest.Core/Nest.cs b/OpenNest.Core/Nest.cs index ce7e7a8..a933f53 100644 --- a/OpenNest.Core/Nest.cs +++ b/OpenNest.Core/Nest.cs @@ -1,6 +1,7 @@ using OpenNest.Collections; using OpenNest.Geometry; using System; +using System.Collections.Generic; namespace OpenNest { @@ -51,6 +52,10 @@ namespace OpenNest public PlateSettings PlateDefaults { get; set; } + public List PlateOptions { get; set; } = new(); + + public double SalvageRate { get; set; } = 0.5; + public Plate CreatePlate() { var plate = PlateDefaults.CreateNew(); diff --git a/OpenNest.IO/NestFormat.cs b/OpenNest.IO/NestFormat.cs index 90b6889..b4e4bfb 100644 --- a/OpenNest.IO/NestFormat.cs +++ b/OpenNest.IO/NestFormat.cs @@ -29,6 +29,8 @@ namespace OpenNest.IO public PlateDefaultsDto PlateDefaults { get; init; } = new(); public List Drawings { get; init; } = new(); public List Plates { get; init; } = new(); + public List PlateOptions { get; init; } = new(); + public double SalvageRate { get; init; } = 0.5; } public record PlateDefaultsDto @@ -153,6 +155,13 @@ namespace OpenNest.IO public string NoteText { get; init; } = ""; } + public record PlateOptionDto + { + public double Width { get; init; } + public double Length { get; init; } + public double Cost { get; init; } + } + public record BestFitSetDto { public double PlateWidth { get; init; } diff --git a/OpenNest.IO/NestReader.cs b/OpenNest.IO/NestReader.cs index 6c4ffb7..ceee341 100644 --- a/OpenNest.IO/NestReader.cs +++ b/OpenNest.IO/NestReader.cs @@ -192,6 +192,18 @@ namespace OpenNest.IO nest.PlateDefaults.PartSpacing = pd.PartSpacing; nest.PlateDefaults.EdgeSpacing = new Spacing(pd.EdgeSpacing.Left, pd.EdgeSpacing.Bottom, pd.EdgeSpacing.Right, pd.EdgeSpacing.Top); + // Plate optimizer settings + nest.SalvageRate = dto.SalvageRate; + if (dto.PlateOptions != null) + { + nest.PlateOptions = dto.PlateOptions.Select(o => new PlateOption + { + Width = o.Width, + Length = o.Length, + Cost = o.Cost, + }).ToList(); + } + // Drawings foreach (var d in drawingMap.OrderBy(k => k.Key)) nest.Drawings.Add(d.Value); diff --git a/OpenNest.IO/NestWriter.cs b/OpenNest.IO/NestWriter.cs index 2715bec..ed8606e 100644 --- a/OpenNest.IO/NestWriter.cs +++ b/OpenNest.IO/NestWriter.cs @@ -88,7 +88,14 @@ namespace OpenNest.IO }, PlateDefaults = BuildPlateDefaultsDto(), Drawings = BuildDrawingDtos(), - Plates = BuildPlateDtos() + Plates = BuildPlateDtos(), + PlateOptions = nest.PlateOptions?.Select(o => new PlateOptionDto + { + Width = o.Width, + Length = o.Length, + Cost = o.Cost, + }).ToList() ?? new(), + SalvageRate = nest.SalvageRate, }; }