using OpenNest.Engine.Fill; using OpenNest.Geometry; using OpenNest.Math; using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading.Tasks; namespace OpenNest.Engine.Strategies { public static class FillHelpers { public static Pattern BuildRotatedPattern(List groupParts, double angle) { var pattern = new Pattern(); var center = ((IEnumerable)groupParts).GetBoundingBox().Center; foreach (var part in groupParts) { var clone = (Part)part.Clone(); clone.UpdateBounds(); if (!angle.IsEqualTo(0)) clone.Rotate(angle, center); pattern.Parts.Add(clone); } pattern.UpdateBounds(); return pattern; } public static List FillPattern(FillLinear engine, List groupParts, List angles, Box workArea) { var results = new ConcurrentBag<(List Parts, FillScore Score)>(); Parallel.ForEach(angles, angle => { var pattern = BuildRotatedPattern(groupParts, angle); if (pattern.Parts.Count == 0) return; var h = engine.Fill(pattern, NestDirection.Horizontal); if (h != null && h.Count > 0) results.Add((h, FillScore.Compute(h, workArea))); var v = engine.Fill(pattern, NestDirection.Vertical); if (v != null && v.Count > 0) results.Add((v, FillScore.Compute(v, workArea))); }); List best = null; var bestScore = default(FillScore); foreach (var res in results) { if (best == null || res.Score > bestScore) { best = res.Parts; bestScore = res.Score; } } return best; } } }