Implement geometry-aware nesting using No-Fit Polygons and simulated annealing optimization. Parts interlock based on true shape rather than bounding boxes, producing tighter layouts for mixed-part scenarios. New types in Core/Geometry: - ConvexDecomposition: ear-clipping triangulation for concave polygons - NoFitPolygon: Minkowski sum via convex decomposition + Clipper2 union - InnerFitPolygon: feasible region computation for plate placement New types in Engine: - NfpCache: caches NFPs keyed by (drawingId, rotation) pairs - BottomLeftFill: places parts using feasible regions from IFP - NFP union - INestOptimizer: abstraction for future GA/parallel upgrades - SimulatedAnnealing: optimizes part ordering and rotation Integration: - NestEngine.AutoNest(): new public entry point for mixed-part nesting - MainForm.RunAutoNest_Click: uses AutoNest instead of Pack - NestingTools.autonest_plate: new MCP tool for Claude Code integration - Drawing.Id: auto-incrementing identifier for NFP cache keys - Clipper2 NuGet added to OpenNest.Core for polygon boolean operations Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
39 lines
1.1 KiB
C#
39 lines
1.1 KiB
C#
using System.Collections.Generic;
|
|
using System.Threading;
|
|
using OpenNest.Geometry;
|
|
|
|
namespace OpenNest
|
|
{
|
|
/// <summary>
|
|
/// Result of a nest optimization run.
|
|
/// </summary>
|
|
public class NestResult
|
|
{
|
|
/// <summary>
|
|
/// The best sequence found: (drawingId, rotation, drawing) tuples in placement order.
|
|
/// </summary>
|
|
public List<(int drawingId, double rotation, Drawing drawing)> Sequence { get; set; }
|
|
|
|
/// <summary>
|
|
/// The score achieved by the best sequence.
|
|
/// </summary>
|
|
public FillScore Score { get; set; }
|
|
|
|
/// <summary>
|
|
/// Number of iterations performed.
|
|
/// </summary>
|
|
public int Iterations { get; set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Interface for nest optimization algorithms that search for the best
|
|
/// part ordering and rotation to maximize plate utilization.
|
|
/// </summary>
|
|
public interface INestOptimizer
|
|
{
|
|
NestResult Optimize(List<NestItem> items, Box workArea, NfpCache cache,
|
|
Dictionary<int, List<double>> candidateRotations,
|
|
CancellationToken cancellation = default);
|
|
}
|
|
}
|