feat: wire GpuPairEvaluator into NestEngine with auto-detection

NestEngine.CreateEvaluator factory delegate allows injection of GPU
evaluator from UI layer. GpuEvaluatorFactory.Create attempts GPU,
returns null (CPU fallback) if unavailable. All NestEngine call sites
wired up.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-07 18:27:15 -05:00
parent 1c1508bc9e
commit 5bebfcb612
6 changed files with 237 additions and 17 deletions

View File

@@ -172,6 +172,7 @@ 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();

View File

@@ -25,10 +25,8 @@ namespace OpenNest.Actions
private void FillArea()
{
var engine = new NestEngine(plateView.Plate);
engine.FillArea(SelectedArea, new NestItem
{
Drawing = drawing
});
engine.CreateEvaluator = GpuEvaluatorFactory.Create;
engine.Fill(new NestItem { Drawing = drawing }, SelectedArea);
plateView.Invalidate();
Update();

View File

@@ -501,6 +501,33 @@ namespace OpenNest.Forms
activeForm.PlateView.SetAction(typeof(ActionSelectArea));
}
private void BestFitViewer_Click(object sender, EventArgs e)
{
if (activeForm == null)
return;
var plate = activeForm.PlateView.Plate;
var drawing = activeForm.Nest.Drawings.Count > 0
? activeForm.Nest.Drawings.First()
: null;
if (drawing == null)
{
MessageBox.Show("No drawings available.", "Best-Fit Viewer",
MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
using (var form = new BestFitViewerForm(drawing, plate))
{
if (form.ShowDialog(this) == DialogResult.OK && form.SelectedResult != null)
{
var parts = NestEngine.BuildPairParts(form.SelectedResult, drawing);
activeForm.PlateView.SetAction(typeof(ActionClone), parts);
}
}
}
private void SetOffsetIncrement_Click(object sender, EventArgs e)
{
if (activeForm == null) return;
@@ -645,6 +672,7 @@ namespace OpenNest.Forms
: activeForm.PlateView.Plate;
var engine = new NestEngine(plate);
engine.CreateEvaluator = GpuEvaluatorFactory.Create;
if (!engine.Pack(items))
break;
@@ -718,6 +746,7 @@ namespace OpenNest.Forms
return;
var engine = new NestEngine(activeForm.PlateView.Plate);
engine.CreateEvaluator = GpuEvaluatorFactory.Create;
engine.Fill(new NestItem
{
Drawing = drawing

View File

@@ -0,0 +1,22 @@
using System.Diagnostics;
using OpenNest.Engine.BestFit;
using OpenNest.Gpu;
namespace OpenNest
{
internal static class GpuEvaluatorFactory
{
public static IPairEvaluator Create(Drawing drawing, double spacing)
{
try
{
return new GpuPairEvaluator(drawing, spacing);
}
catch
{
Debug.WriteLine("[GpuEvaluatorFactory] GPU not available, falling back to CPU");
return null;
}
}
}
}

View File

@@ -13,6 +13,7 @@
<ItemGroup>
<ProjectReference Include="..\OpenNest.Core\OpenNest.Core.csproj" />
<ProjectReference Include="..\OpenNest.Engine\OpenNest.Engine.csproj" />
<ProjectReference Include="..\OpenNest.Gpu\OpenNest.Gpu.csproj" />
<PackageReference Include="ACadSharp" Version="3.1.32" />
<PackageReference Include="System.Drawing.Common" Version="8.0.10" />
</ItemGroup>