diff --git a/OpenNest.Engine/BestFit/BestFitFinder.cs b/OpenNest.Engine/BestFit/BestFitFinder.cs index 9aede62..074c31d 100644 --- a/OpenNest.Engine/BestFit/BestFitFinder.cs +++ b/OpenNest.Engine/BestFit/BestFitFinder.cs @@ -1,5 +1,7 @@ +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using OpenNest.Converters; using OpenNest.Engine.BestFit.Tiling; using OpenNest.Geometry; @@ -9,12 +11,12 @@ namespace OpenNest.Engine.BestFit { public class BestFitFinder { - private readonly PairEvaluator _evaluator; + private readonly IPairEvaluator _evaluator; private readonly BestFitFilter _filter; - public BestFitFinder(double maxPlateWidth, double maxPlateHeight) + public BestFitFinder(double maxPlateWidth, double maxPlateHeight, IPairEvaluator evaluator = null) { - _evaluator = new PairEvaluator(); + _evaluator = evaluator ?? new PairEvaluator(); _filter = new BestFitFilter { MaxPlateWidth = maxPlateWidth, @@ -30,12 +32,16 @@ namespace OpenNest.Engine.BestFit { var strategies = BuildStrategies(drawing); - var allCandidates = new List(); + var candidateBags = new ConcurrentBag>(); - foreach (var strategy in strategies) - allCandidates.AddRange(strategy.GenerateCandidates(drawing, spacing, stepSize)); + Parallel.ForEach(strategies, strategy => + { + candidateBags.Add(strategy.GenerateCandidates(drawing, spacing, stepSize)); + }); - var results = allCandidates.Select(c => _evaluator.Evaluate(c)).ToList(); + var allCandidates = candidateBags.SelectMany(c => c).ToList(); + + var results = _evaluator.EvaluateAll(allCandidates); _filter.Apply(results); diff --git a/OpenNest.Engine/BestFit/IPairEvaluator.cs b/OpenNest.Engine/BestFit/IPairEvaluator.cs new file mode 100644 index 0000000..159d3c2 --- /dev/null +++ b/OpenNest.Engine/BestFit/IPairEvaluator.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace OpenNest.Engine.BestFit +{ + public interface IPairEvaluator + { + List EvaluateAll(List candidates); + } +} diff --git a/OpenNest.Engine/BestFit/PairEvaluator.cs b/OpenNest.Engine/BestFit/PairEvaluator.cs index 814a88d..c82df0c 100644 --- a/OpenNest.Engine/BestFit/PairEvaluator.cs +++ b/OpenNest.Engine/BestFit/PairEvaluator.cs @@ -1,15 +1,29 @@ +using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using OpenNest.Converters; using OpenNest.Geometry; using OpenNest.Math; namespace OpenNest.Engine.BestFit { - public class PairEvaluator + public class PairEvaluator : IPairEvaluator { private const double ChordTolerance = 0.01; + public List EvaluateAll(List candidates) + { + var resultBag = new ConcurrentBag(); + + Parallel.ForEach(candidates, c => + { + resultBag.Add(Evaluate(c)); + }); + + return resultBag.ToList(); + } + public BestFitResult Evaluate(PairCandidate candidate) { var drawing = candidate.Drawing;