From 86fee0867097c06b714ffa207a830384693e2dc2 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Sat, 7 Mar 2026 11:42:43 -0500 Subject: [PATCH] feat: add PairCandidate, BestFitResult, and IBestFitStrategy for best-fit pair finding Co-Authored-By: Claude Opus 4.6 --- OpenNest.Engine/BestFit/BestFitResult.cs | 40 +++++++++++++++++++++ OpenNest.Engine/BestFit/IBestFitStrategy.cs | 11 ++++++ OpenNest.Engine/BestFit/PairCandidate.cs | 15 ++++++++ OpenNest.Engine/OpenNest.Engine.csproj | 3 ++ 4 files changed, 69 insertions(+) create mode 100644 OpenNest.Engine/BestFit/BestFitResult.cs create mode 100644 OpenNest.Engine/BestFit/IBestFitStrategy.cs create mode 100644 OpenNest.Engine/BestFit/PairCandidate.cs diff --git a/OpenNest.Engine/BestFit/BestFitResult.cs b/OpenNest.Engine/BestFit/BestFitResult.cs new file mode 100644 index 0000000..a154b21 --- /dev/null +++ b/OpenNest.Engine/BestFit/BestFitResult.cs @@ -0,0 +1,40 @@ +namespace OpenNest.Engine.BestFit +{ + public class BestFitResult + { + public PairCandidate Candidate { get; set; } + public double RotatedArea { get; set; } + public double BoundingWidth { get; set; } + public double BoundingHeight { get; set; } + public double OptimalRotation { get; set; } + public bool Keep { get; set; } + public string Reason { get; set; } + public double TrueArea { get; set; } + + public double Utilization + { + get { return RotatedArea > 0 ? TrueArea / RotatedArea : 0; } + } + + public double LongestSide + { + get { return System.Math.Max(BoundingWidth, BoundingHeight); } + } + + public double ShortestSide + { + get { return System.Math.Min(BoundingWidth, BoundingHeight); } + } + } + + public enum BestFitSortField + { + Area, + LongestSide, + ShortestSide, + Type, + OriginalSequence, + Keep, + WhyKeepDrop + } +} diff --git a/OpenNest.Engine/BestFit/IBestFitStrategy.cs b/OpenNest.Engine/BestFit/IBestFitStrategy.cs new file mode 100644 index 0000000..f386c28 --- /dev/null +++ b/OpenNest.Engine/BestFit/IBestFitStrategy.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace OpenNest.Engine.BestFit +{ + public interface IBestFitStrategy + { + int Type { get; } + string Description { get; } + List GenerateCandidates(Drawing drawing, double spacing, double stepSize); + } +} diff --git a/OpenNest.Engine/BestFit/PairCandidate.cs b/OpenNest.Engine/BestFit/PairCandidate.cs new file mode 100644 index 0000000..523d922 --- /dev/null +++ b/OpenNest.Engine/BestFit/PairCandidate.cs @@ -0,0 +1,15 @@ +using OpenNest.Geometry; + +namespace OpenNest.Engine.BestFit +{ + public class PairCandidate + { + public Drawing Drawing { get; set; } + public double Part1Rotation { get; set; } + public double Part2Rotation { get; set; } + public Vector Part2Offset { get; set; } + public int StrategyType { get; set; } + public int TestNumber { get; set; } + public double Spacing { get; set; } + } +} diff --git a/OpenNest.Engine/OpenNest.Engine.csproj b/OpenNest.Engine/OpenNest.Engine.csproj index 5b2df11..4345409 100644 --- a/OpenNest.Engine/OpenNest.Engine.csproj +++ b/OpenNest.Engine/OpenNest.Engine.csproj @@ -37,6 +37,9 @@ + + +