feat: add reverse push directions for concave interlocking and cache best-fit results
Add PushDirection.Right and PushDirection.Up to RotationSlideStrategy so parts can approach from all four directions. This discovers concave interlocking arrangements (e.g. L-shaped parts nesting into each other's cavities) that the original Left/Down-only slides could never reach. Introduce BestFitCache so best-fit results are computed once at step size 0.25 and shared between the viewer and nesting engine. The GPU evaluator factory is configured once at startup instead of being wired per call site, and NestEngine.CreateEvaluator is removed. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -4,7 +4,6 @@ using System.Linq;
|
||||
using System.Windows.Forms;
|
||||
using OpenNest.Controls;
|
||||
using OpenNest.Geometry;
|
||||
using OpenNest.Gpu;
|
||||
|
||||
namespace OpenNest.Actions
|
||||
{
|
||||
@@ -173,7 +172,6 @@ namespace OpenNest.Actions
|
||||
{
|
||||
var plate = plateView.Plate;
|
||||
var engine = new NestEngine(plate);
|
||||
engine.CreateEvaluator = GpuEvaluatorFactory.Create;
|
||||
var groupParts = parts.Select(p => p.BasePart).ToList();
|
||||
|
||||
var bounds = plate.WorkArea();
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
using System.ComponentModel;
|
||||
using System.Windows.Forms;
|
||||
using OpenNest.Controls;
|
||||
using OpenNest.Gpu;
|
||||
|
||||
namespace OpenNest.Actions
|
||||
{
|
||||
@@ -26,7 +25,6 @@ namespace OpenNest.Actions
|
||||
private void FillArea()
|
||||
{
|
||||
var engine = new NestEngine(plateView.Plate);
|
||||
engine.CreateEvaluator = GpuEvaluatorFactory.Create;
|
||||
engine.Fill(new NestItem { Drawing = drawing }, SelectedArea);
|
||||
|
||||
plateView.Invalidate();
|
||||
|
||||
@@ -11,7 +11,6 @@ namespace OpenNest.Forms
|
||||
private const int Columns = 5;
|
||||
private const int RowHeight = 300;
|
||||
private const int MaxResults = 50;
|
||||
private const double ViewerStepSize = 1.0;
|
||||
|
||||
private static readonly Color KeptColor = Color.FromArgb(0, 0, 100);
|
||||
private static readonly Color DroppedColor = Color.FromArgb(100, 0, 0);
|
||||
@@ -56,8 +55,8 @@ namespace OpenNest.Forms
|
||||
{
|
||||
var sw = Stopwatch.StartNew();
|
||||
|
||||
var finder = new BestFitFinder(plate.Size.Width, plate.Size.Height);
|
||||
var results = finder.FindBestFits(drawing, plate.PartSpacing, ViewerStepSize);
|
||||
var results = BestFitCache.GetOrCompute(
|
||||
drawing, plate.Size.Width, plate.Size.Height, plate.PartSpacing);
|
||||
|
||||
var findMs = sw.ElapsedMilliseconds;
|
||||
var total = results.Count;
|
||||
|
||||
@@ -688,7 +688,6 @@ namespace OpenNest.Forms
|
||||
: activeForm.PlateView.Plate;
|
||||
|
||||
var engine = new NestEngine(plate);
|
||||
engine.CreateEvaluator = GpuEvaluatorFactory.Create;
|
||||
|
||||
if (!engine.Pack(items))
|
||||
break;
|
||||
@@ -762,7 +761,6 @@ namespace OpenNest.Forms
|
||||
return;
|
||||
|
||||
var engine = new NestEngine(activeForm.PlateView.Plate);
|
||||
engine.CreateEvaluator = GpuEvaluatorFactory.Create;
|
||||
engine.Fill(new NestItem
|
||||
{
|
||||
Drawing = drawing
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using OpenNest.Engine.BestFit;
|
||||
using OpenNest.Forms;
|
||||
using OpenNest.Gpu;
|
||||
|
||||
namespace OpenNest
|
||||
{
|
||||
@@ -11,6 +13,7 @@ namespace OpenNest
|
||||
{
|
||||
Application.EnableVisualStyles();
|
||||
Application.SetCompatibleTextRenderingDefault(false);
|
||||
BestFitCache.CreateEvaluator = GpuEvaluatorFactory.Create;
|
||||
Application.Run(new MainForm());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user