docs(engines): allow fill/pattern components in Terra and Qwen scaffolds
Reusable Fill/, BestFit, RectanglePacking and CirclePacking components are fair game; whole-engine delegation and run-all-pick-best stay banned. Improvements to shared components go in the engine's own project and are reported, not applied to OpenNest.Core/OpenNest.Engine. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -21,10 +21,10 @@ public sealed class QwenNestingEngine : INestingEngine
|
|||||||
|
|
||||||
// TODO: implement independent placement logic here.
|
// TODO: implement independent placement logic here.
|
||||||
//
|
//
|
||||||
// Do NOT call NestingEngineRegistry.Create(...), PlateNesterFactory, or any
|
// Do NOT call NestingEngineRegistry.Create(...), PlateNesterFactory, PlateFillService,
|
||||||
// FixedStrategyNestingEngine / StockLadderNestingEngine instance from inside this
|
// or any built-in INestingEngine, and do not run several and keep the best. The
|
||||||
// method. Decide placements yourself using OpenNest.Core / OpenNest.Geometry
|
// Fill/ and pattern components (FillLinear, PairFiller, PatternTiler, Compactor, ...)
|
||||||
// primitives (Polygon, NoFitPolygon, Collision, ConvexHull, RotatingCalipers, etc).
|
// and OpenNest.Core geometry ARE fair game as tools; the decisions are yours.
|
||||||
//
|
//
|
||||||
// job.Parts -> requested parts (PartGeometrySnapshot geometry, quantity, priority, rotation policy)
|
// job.Parts -> requested parts (PartGeometrySnapshot geometry, quantity, priority, rotation policy)
|
||||||
// job.Plates -> candidate stock sheets (size, spacing, quadrant, quantity)
|
// job.Plates -> candidate stock sheets (size, spacing, quadrant, quantity)
|
||||||
|
|||||||
@@ -1,24 +1,35 @@
|
|||||||
# OpenNest.Engine.Qwen
|
# OpenNest.Engine.Qwen
|
||||||
|
|
||||||
An independent `INestingEngine` implementation — **not** a wrapper, ensemble, or
|
An independent `INestingEngine` implementation. It must not be a wrapper, ensemble, or
|
||||||
selector over OpenNest's built-in engines (`StockLadderNestingEngine`,
|
selector over OpenNest's built-in engines. `Solve()` must not call, instantiate, or
|
||||||
`FixedStrategyNestingEngine` "Default"/"Strip"/"Vertical Remnant"/"Horizontal Remnant`,
|
delegate to any existing `INestingEngine` (`StockLadderNestingEngine`,
|
||||||
or anything reachable through `PlateNesterFactory`/`NestingEngineRegistry`).
|
`FixedStrategyNestingEngine`), `NestingEngineRegistry`, `NestJobRunner`, or the whole-plate
|
||||||
`Solve()` must never call, instantiate, or otherwise delegate a placement decision
|
nesters/fillers behind `PlateNesterFactory` (`DefaultPlateNester`, `StripPlateNester`,
|
||||||
to one of those.
|
`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
|
## Allowed building blocks
|
||||||
|
|
||||||
Low-level geometry/data-structure primitives are fair game — they are not nesting
|
Reuse is encouraged. These are tools you drive, composed by your own decision logic:
|
||||||
strategies:
|
|
||||||
|
|
||||||
- `OpenNest.Core` geometry: `Polygon`, `Shape`, `BoundingBox`, `Vector`, `Box`,
|
- `OpenNest.Core` geometry: `Polygon`, `Shape`, `BoundingBox`, `Vector`, `Box`, `ConvexHull`,
|
||||||
`ConvexHull`, `ConvexDecomposition`, `RotatingCalipers`, `Collision` (overlap/spacing
|
`ConvexDecomposition`, `RotatingCalipers`, `Collision`, `NoFitPolygon`, `ShapeProfile`,
|
||||||
checks), `NoFitPolygon`, `ShapeProfile`, `SpatialQuery`.
|
`SpatialQuery`.
|
||||||
- `OpenNest.Engine` support types if useful: `PartBoundary`, `RotationAnalysis`,
|
- Fill and pattern components in `OpenNest.Engine.Fill`: `FillLinear`, `FillExtents`,
|
||||||
`AngleCandidateBuilder` — the *decision logic* using them must be your own (don't just
|
`PairFiller`, `ShrinkFiller`, `RemnantFiller`/`RemnantFinder`, `Compactor`, `FillScore`,
|
||||||
call `BestFitFinder`/`PairEvaluator`/`RotationSlideStrategy`, which are the existing
|
`Pattern`/`PatternTiler`, `PartBoundary`, `RotationAnalysis`, `AngleCandidateBuilder`,
|
||||||
best-fit engine's internals).
|
`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
|
## What to fill in
|
||||||
|
|
||||||
|
|||||||
@@ -1,24 +1,35 @@
|
|||||||
# OpenNest.Engine.Terra
|
# OpenNest.Engine.Terra
|
||||||
|
|
||||||
An independent `INestingEngine` implementation — **not** a wrapper, ensemble, or
|
An independent `INestingEngine` implementation. It must not be a wrapper, ensemble, or
|
||||||
selector over OpenNest's built-in engines (`StockLadderNestingEngine`,
|
selector over OpenNest's built-in engines. `Solve()` must not call, instantiate, or
|
||||||
`FixedStrategyNestingEngine` "Default"/"Strip"/"Vertical Remnant"/"Horizontal Remnant`,
|
delegate to any existing `INestingEngine` (`StockLadderNestingEngine`,
|
||||||
or anything reachable through `PlateNesterFactory`/`NestingEngineRegistry`).
|
`FixedStrategyNestingEngine`), `NestingEngineRegistry`, `NestJobRunner`, or the whole-plate
|
||||||
`Solve()` must never call, instantiate, or otherwise delegate a placement decision
|
nesters/fillers behind `PlateNesterFactory` (`DefaultPlateNester`, `StripPlateNester`,
|
||||||
to one of those.
|
`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
|
## Allowed building blocks
|
||||||
|
|
||||||
Low-level geometry/data-structure primitives are fair game — they are not nesting
|
Reuse is encouraged. These are tools you drive, composed by your own decision logic:
|
||||||
strategies:
|
|
||||||
|
|
||||||
- `OpenNest.Core` geometry: `Polygon`, `Shape`, `BoundingBox`, `Vector`, `Box`,
|
- `OpenNest.Core` geometry: `Polygon`, `Shape`, `BoundingBox`, `Vector`, `Box`, `ConvexHull`,
|
||||||
`ConvexHull`, `ConvexDecomposition`, `RotatingCalipers`, `Collision` (overlap/spacing
|
`ConvexDecomposition`, `RotatingCalipers`, `Collision`, `NoFitPolygon`, `ShapeProfile`,
|
||||||
checks), `NoFitPolygon`, `ShapeProfile`, `SpatialQuery`.
|
`SpatialQuery`.
|
||||||
- `OpenNest.Engine` support types if useful: `PartBoundary`, `RotationAnalysis`,
|
- Fill and pattern components in `OpenNest.Engine.Fill`: `FillLinear`, `FillExtents`,
|
||||||
`AngleCandidateBuilder` — the *decision logic* using them must be your own (don't just
|
`PairFiller`, `ShrinkFiller`, `RemnantFiller`/`RemnantFinder`, `Compactor`, `FillScore`,
|
||||||
call `BestFitFinder`/`PairEvaluator`/`RotationSlideStrategy`, which are the existing
|
`Pattern`/`PatternTiler`, `PartBoundary`, `RotationAnalysis`, `AngleCandidateBuilder`,
|
||||||
best-fit engine's internals).
|
`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
|
## What to fill in
|
||||||
|
|
||||||
|
|||||||
@@ -21,10 +21,10 @@ public sealed class TerraNestingEngine : INestingEngine
|
|||||||
|
|
||||||
// TODO: implement independent placement logic here.
|
// TODO: implement independent placement logic here.
|
||||||
//
|
//
|
||||||
// Do NOT call NestingEngineRegistry.Create(...), PlateNesterFactory, or any
|
// Do NOT call NestingEngineRegistry.Create(...), PlateNesterFactory, PlateFillService,
|
||||||
// FixedStrategyNestingEngine / StockLadderNestingEngine instance from inside this
|
// or any built-in INestingEngine, and do not run several and keep the best. The
|
||||||
// method. Decide placements yourself using OpenNest.Core / OpenNest.Geometry
|
// Fill/ and pattern components (FillLinear, PairFiller, PatternTiler, Compactor, ...)
|
||||||
// primitives (Polygon, NoFitPolygon, Collision, ConvexHull, RotatingCalipers, etc).
|
// and OpenNest.Core geometry ARE fair game as tools; the decisions are yours.
|
||||||
//
|
//
|
||||||
// job.Parts -> requested parts (PartGeometrySnapshot geometry, quantity, priority, rotation policy)
|
// job.Parts -> requested parts (PartGeometrySnapshot geometry, quantity, priority, rotation policy)
|
||||||
// job.Plates -> candidate stock sheets (size, spacing, quadrant, quantity)
|
// job.Plates -> candidate stock sheets (size, spacing, quadrant, quantity)
|
||||||
|
|||||||
Reference in New Issue
Block a user