diff --git a/OpenNest.Engine/DefaultNestEngine.cs b/OpenNest.Engine/DefaultNestEngine.cs index cf61be0..54c346e 100644 --- a/OpenNest.Engine/DefaultNestEngine.cs +++ b/OpenNest.Engine/DefaultNestEngine.cs @@ -89,8 +89,7 @@ namespace OpenNest PhaseResults.Clear(); var engine = new FillLinear(workArea, Plate.PartSpacing); var angles = RotationAnalysis.FindHullEdgeAngles(groupParts); - // TODO: pass Comparer to FillPattern (Task 6) - var best = FillHelpers.FillPattern(engine, groupParts, angles, workArea); + var best = FillHelpers.FillPattern(engine, groupParts, angles, workArea, Comparer); PhaseResults.Add(new PhaseResult(NestPhase.Linear, best?.Count ?? 0, 0)); Debug.WriteLine($"[Fill(groupParts,Box)] Linear pattern: {best?.Count ?? 0} parts | WorkArea: {workArea.Width:F1}x{workArea.Length:F1}"); diff --git a/OpenNest.Engine/Strategies/ExtentsFillStrategy.cs b/OpenNest.Engine/Strategies/ExtentsFillStrategy.cs index cc202bb..0efbc6b 100644 --- a/OpenNest.Engine/Strategies/ExtentsFillStrategy.cs +++ b/OpenNest.Engine/Strategies/ExtentsFillStrategy.cs @@ -21,7 +21,7 @@ namespace OpenNest.Engine.Strategies var angles = new[] { bestRotation, bestRotation + Angle.HalfPI }; List best = null; - var bestScore = default(FillScore); + var comparer = context.Policy?.Comparer ?? new DefaultFillComparer(); foreach (var angle in angles) { @@ -30,12 +30,8 @@ namespace OpenNest.Engine.Strategies context.PlateNumber, context.Token, context.Progress); if (result != null && result.Count > 0) { - var score = FillScore.Compute(result, context.WorkArea); - if (best == null || score > bestScore) - { + if (best == null || comparer.IsBetter(result, best, context.WorkArea)) best = result; - bestScore = score; - } } } diff --git a/OpenNest.Engine/Strategies/FillHelpers.cs b/OpenNest.Engine/Strategies/FillHelpers.cs index 44eb252..a2873e0 100644 --- a/OpenNest.Engine/Strategies/FillHelpers.cs +++ b/OpenNest.Engine/Strategies/FillHelpers.cs @@ -30,7 +30,7 @@ namespace OpenNest.Engine.Strategies return pattern; } - public static List FillPattern(FillLinear engine, List groupParts, List angles, Box workArea) + public static List FillPattern(FillLinear engine, List groupParts, List angles, Box workArea, IFillComparer comparer = null) { var results = new ConcurrentBag<(List Parts, FillScore Score)>(); @@ -55,10 +55,18 @@ namespace OpenNest.Engine.Strategies foreach (var res in results) { - if (best == null || res.Score > bestScore) + if (comparer != null) { - best = res.Parts; - bestScore = res.Score; + if (best == null || comparer.IsBetter(res.Parts, best, workArea)) + best = res.Parts; + } + else + { + if (best == null || res.Score > bestScore) + { + best = res.Parts; + bestScore = res.Score; + } } } diff --git a/OpenNest.Engine/Strategies/LinearFillStrategy.cs b/OpenNest.Engine/Strategies/LinearFillStrategy.cs index 1d733c8..b37f783 100644 --- a/OpenNest.Engine/Strategies/LinearFillStrategy.cs +++ b/OpenNest.Engine/Strategies/LinearFillStrategy.cs @@ -17,8 +17,9 @@ namespace OpenNest.Engine.Strategies : new List { 0, Angle.HalfPI }; var workArea = context.WorkArea; + var comparer = context.Policy?.Comparer ?? new DefaultFillComparer(); + var preferred = context.Policy?.PreferredDirection; List best = null; - var bestScore = default(FillScore); for (var ai = 0; ai < angles.Count; ai++) { @@ -26,48 +27,29 @@ namespace OpenNest.Engine.Strategies var angle = angles[ai]; var engine = new FillLinear(workArea, context.Plate.PartSpacing); - var h = engine.Fill(context.Item.Drawing, angle, NestDirection.Horizontal); - var v = engine.Fill(context.Item.Drawing, angle, NestDirection.Vertical); + + var result = FillHelpers.FillWithDirectionPreference( + dir => engine.Fill(context.Item.Drawing, angle, dir), + preferred, comparer, workArea); var angleDeg = Angle.ToDegrees(angle); - if (h != null && h.Count > 0) + if (result != null && result.Count > 0) { - var scoreH = FillScore.Compute(h, workArea); context.AngleResults.Add(new AngleResult { AngleDeg = angleDeg, - Direction = NestDirection.Horizontal, - PartCount = h.Count + Direction = preferred ?? NestDirection.Horizontal, + PartCount = result.Count }); - if (best == null || scoreH > bestScore) - { - best = h; - bestScore = scoreH; - } - } - - if (v != null && v.Count > 0) - { - var scoreV = FillScore.Compute(v, workArea); - context.AngleResults.Add(new AngleResult - { - AngleDeg = angleDeg, - Direction = NestDirection.Vertical, - PartCount = v.Count - }); - - if (best == null || scoreV > bestScore) - { - best = v; - bestScore = scoreV; - } + if (best == null || comparer.IsBetter(result, best, workArea)) + best = result; } NestEngineBase.ReportProgress(context.Progress, NestPhase.Linear, context.PlateNumber, best, workArea, - $"Linear: {ai + 1}/{angles.Count} angles, {angleDeg:F0}° best = {bestScore.Count} parts"); + $"Linear: {ai + 1}/{angles.Count} angles, {angleDeg:F0}° best = {best?.Count ?? 0} parts"); } return best ?? new List();