diff --git a/OpenNest.Engine.Qwen/QwenNestingEngine.cs b/OpenNest.Engine.Qwen/QwenNestingEngine.cs index a3ed1b4..8b7bbe6 100644 --- a/OpenNest.Engine.Qwen/QwenNestingEngine.cs +++ b/OpenNest.Engine.Qwen/QwenNestingEngine.cs @@ -21,10 +21,10 @@ public sealed class QwenNestingEngine : INestingEngine // TODO: implement independent placement logic here. // - // Do NOT call NestingEngineRegistry.Create(...), PlateNesterFactory, or any - // FixedStrategyNestingEngine / StockLadderNestingEngine instance from inside this - // method. Decide placements yourself using OpenNest.Core / OpenNest.Geometry - // primitives (Polygon, NoFitPolygon, Collision, ConvexHull, RotatingCalipers, etc). + // Do NOT call NestingEngineRegistry.Create(...), PlateNesterFactory, PlateFillService, + // or any built-in INestingEngine, and do not run several and keep the best. The + // Fill/ and pattern components (FillLinear, PairFiller, PatternTiler, Compactor, ...) + // and OpenNest.Core geometry ARE fair game as tools; the decisions are yours. // // job.Parts -> requested parts (PartGeometrySnapshot geometry, quantity, priority, rotation policy) // job.Plates -> candidate stock sheets (size, spacing, quadrant, quantity) diff --git a/OpenNest.Engine.Qwen/README.md b/OpenNest.Engine.Qwen/README.md index c394df1..4a76745 100644 --- a/OpenNest.Engine.Qwen/README.md +++ b/OpenNest.Engine.Qwen/README.md @@ -1,24 +1,35 @@ # OpenNest.Engine.Qwen -An independent `INestingEngine` implementation — **not** a wrapper, ensemble, or -selector over OpenNest's built-in engines (`StockLadderNestingEngine`, -`FixedStrategyNestingEngine` "Default"/"Strip"/"Vertical Remnant"/"Horizontal Remnant`, -or anything reachable through `PlateNesterFactory`/`NestingEngineRegistry`). -`Solve()` must never call, instantiate, or otherwise delegate a placement decision -to one of those. +An independent `INestingEngine` implementation. It must not be a wrapper, ensemble, or +selector over OpenNest's built-in engines. `Solve()` must not call, instantiate, or +delegate to any existing `INestingEngine` (`StockLadderNestingEngine`, +`FixedStrategyNestingEngine`), `NestingEngineRegistry`, `NestJobRunner`, or the whole-plate +nesters/fillers behind `PlateNesterFactory` (`DefaultPlateNester`, `StripPlateNester`, +`RemnantPlateNester`, `PlateFillService`, `DefaultPlateFiller`, ...). It must also never run +several of them and keep the best result. + +The decisions that make it an engine must be yours: which sheet(s) to use, which parts go +where and in what order, which pattern/strategy to apply to which region, and when to stop. ## Allowed building blocks -Low-level geometry/data-structure primitives are fair game — they are not nesting -strategies: +Reuse is encouraged. These are tools you drive, composed by your own decision logic: -- `OpenNest.Core` geometry: `Polygon`, `Shape`, `BoundingBox`, `Vector`, `Box`, - `ConvexHull`, `ConvexDecomposition`, `RotatingCalipers`, `Collision` (overlap/spacing - checks), `NoFitPolygon`, `ShapeProfile`, `SpatialQuery`. -- `OpenNest.Engine` support types if useful: `PartBoundary`, `RotationAnalysis`, - `AngleCandidateBuilder` — the *decision logic* using them must be your own (don't just - call `BestFitFinder`/`PairEvaluator`/`RotationSlideStrategy`, which are the existing - best-fit engine's internals). +- `OpenNest.Core` geometry: `Polygon`, `Shape`, `BoundingBox`, `Vector`, `Box`, `ConvexHull`, + `ConvexDecomposition`, `RotatingCalipers`, `Collision`, `NoFitPolygon`, `ShapeProfile`, + `SpatialQuery`. +- Fill and pattern components in `OpenNest.Engine.Fill`: `FillLinear`, `FillExtents`, + `PairFiller`, `ShrinkFiller`, `RemnantFiller`/`RemnantFinder`, `Compactor`, `FillScore`, + `Pattern`/`PatternTiler`, `PartBoundary`, `RotationAnalysis`, `AngleCandidateBuilder`, + `BestCombination`. +- `OpenNest.Engine.BestFit` (`BestFitFinder`, `PairEvaluator`, ...), `RectanglePacking`, + `CirclePacking`. + +If you find a faster or better way to do something a shared component already does (for +example linear patterning), implement it inside this engine's own project and leave the +shared code untouched. Do not edit `OpenNest.Core` or `OpenNest.Engine`. Call it out in your +report (what it replaces, why it is better, measured numbers) so it can be generalized and +upstreamed for every engine later. ## What to fill in diff --git a/OpenNest.Engine.Terra/README.md b/OpenNest.Engine.Terra/README.md index 2911596..74657ed 100644 --- a/OpenNest.Engine.Terra/README.md +++ b/OpenNest.Engine.Terra/README.md @@ -1,24 +1,35 @@ # OpenNest.Engine.Terra -An independent `INestingEngine` implementation — **not** a wrapper, ensemble, or -selector over OpenNest's built-in engines (`StockLadderNestingEngine`, -`FixedStrategyNestingEngine` "Default"/"Strip"/"Vertical Remnant"/"Horizontal Remnant`, -or anything reachable through `PlateNesterFactory`/`NestingEngineRegistry`). -`Solve()` must never call, instantiate, or otherwise delegate a placement decision -to one of those. +An independent `INestingEngine` implementation. It must not be a wrapper, ensemble, or +selector over OpenNest's built-in engines. `Solve()` must not call, instantiate, or +delegate to any existing `INestingEngine` (`StockLadderNestingEngine`, +`FixedStrategyNestingEngine`), `NestingEngineRegistry`, `NestJobRunner`, or the whole-plate +nesters/fillers behind `PlateNesterFactory` (`DefaultPlateNester`, `StripPlateNester`, +`RemnantPlateNester`, `PlateFillService`, `DefaultPlateFiller`, ...). It must also never run +several of them and keep the best result. + +The decisions that make it an engine must be yours: which sheet(s) to use, which parts go +where and in what order, which pattern/strategy to apply to which region, and when to stop. ## Allowed building blocks -Low-level geometry/data-structure primitives are fair game — they are not nesting -strategies: +Reuse is encouraged. These are tools you drive, composed by your own decision logic: -- `OpenNest.Core` geometry: `Polygon`, `Shape`, `BoundingBox`, `Vector`, `Box`, - `ConvexHull`, `ConvexDecomposition`, `RotatingCalipers`, `Collision` (overlap/spacing - checks), `NoFitPolygon`, `ShapeProfile`, `SpatialQuery`. -- `OpenNest.Engine` support types if useful: `PartBoundary`, `RotationAnalysis`, - `AngleCandidateBuilder` — the *decision logic* using them must be your own (don't just - call `BestFitFinder`/`PairEvaluator`/`RotationSlideStrategy`, which are the existing - best-fit engine's internals). +- `OpenNest.Core` geometry: `Polygon`, `Shape`, `BoundingBox`, `Vector`, `Box`, `ConvexHull`, + `ConvexDecomposition`, `RotatingCalipers`, `Collision`, `NoFitPolygon`, `ShapeProfile`, + `SpatialQuery`. +- Fill and pattern components in `OpenNest.Engine.Fill`: `FillLinear`, `FillExtents`, + `PairFiller`, `ShrinkFiller`, `RemnantFiller`/`RemnantFinder`, `Compactor`, `FillScore`, + `Pattern`/`PatternTiler`, `PartBoundary`, `RotationAnalysis`, `AngleCandidateBuilder`, + `BestCombination`. +- `OpenNest.Engine.BestFit` (`BestFitFinder`, `PairEvaluator`, ...), `RectanglePacking`, + `CirclePacking`. + +If you find a faster or better way to do something a shared component already does (for +example linear patterning), implement it inside this engine's own project and leave the +shared code untouched. Do not edit `OpenNest.Core` or `OpenNest.Engine`. Call it out in your +report (what it replaces, why it is better, measured numbers) so it can be generalized and +upstreamed for every engine later. ## What to fill in diff --git a/OpenNest.Engine.Terra/TerraNestingEngine.cs b/OpenNest.Engine.Terra/TerraNestingEngine.cs index 897f3e1..9b1bfa9 100644 --- a/OpenNest.Engine.Terra/TerraNestingEngine.cs +++ b/OpenNest.Engine.Terra/TerraNestingEngine.cs @@ -21,10 +21,10 @@ public sealed class TerraNestingEngine : INestingEngine // TODO: implement independent placement logic here. // - // Do NOT call NestingEngineRegistry.Create(...), PlateNesterFactory, or any - // FixedStrategyNestingEngine / StockLadderNestingEngine instance from inside this - // method. Decide placements yourself using OpenNest.Core / OpenNest.Geometry - // primitives (Polygon, NoFitPolygon, Collision, ConvexHull, RotatingCalipers, etc). + // Do NOT call NestingEngineRegistry.Create(...), PlateNesterFactory, PlateFillService, + // or any built-in INestingEngine, and do not run several and keep the best. The + // Fill/ and pattern components (FillLinear, PairFiller, PatternTiler, Compactor, ...) + // and OpenNest.Core geometry ARE fair game as tools; the decisions are yours. // // job.Parts -> requested parts (PartGeometrySnapshot geometry, quantity, priority, rotation policy) // job.Plates -> candidate stock sheets (size, spacing, quadrant, quantity)