From eb6cb94893cfb3b87207200ec06cffebcb0c5842 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Tue, 17 Mar 2026 07:46:44 -0400 Subject: [PATCH] docs: add shape library design spec Defines a parametric shape library with abstract ShapeDefinition base class and concrete subclasses for common CNC shapes (Tier 1+2). Co-Authored-By: Claude Opus 4.6 (1M context) --- .../specs/2026-03-17-shape-library-design.md | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 docs/superpowers/specs/2026-03-17-shape-library-design.md diff --git a/docs/superpowers/specs/2026-03-17-shape-library-design.md b/docs/superpowers/specs/2026-03-17-shape-library-design.md new file mode 100644 index 0000000..5076ce7 --- /dev/null +++ b/docs/superpowers/specs/2026-03-17-shape-library-design.md @@ -0,0 +1,93 @@ +# Shape Library Design Spec + +## Overview + +A parametric shape library for OpenNest that provides reusable, self-describing shape classes for generating `Drawing` objects. Each shape is its own class with typed parameters, inheriting from an abstract `ShapeDefinition` base class. Inspired by PEP's WINSHAPE library. + +## Location + +- Project: `OpenNest.Core` +- Folder: `Shapes/` +- Namespace: `OpenNest.Shapes` + +## Architecture + +### Base Class — `ShapeDefinition` + +Abstract base class that all shapes inherit from. + +```csharp +public abstract class ShapeDefinition +{ + public string Name { get; set; } + public abstract Drawing GetDrawing(); + + protected Drawing CreateDrawing(List entities) + { + var pgm = ConvertGeometry.ToProgram(entities); + return new Drawing(Name, pgm); + } +} +``` + +- `Name`: The name assigned to the resulting `Drawing`. +- `GetDrawing()`: Each shape implements this to build its geometry and return a `Drawing`. +- `CreateDrawing()`: Shared helper that converts a list of geometry entities into a `Drawing` via `ConvertGeometry.ToProgram()`. + +### Shape Classes + +#### Tier 1 — Basics (extracted from MCP InputTools) + +| Class | Parameters | Description | +|-------|-----------|-------------| +| `RectangleShape` | `Width`, `Height` | Axis-aligned rectangle from origin | +| `CircleShape` | `Diameter` | Circle centered at origin | +| `LShape` | `Width`, `Height` | L-shaped profile — full width bottom, half-width top-left | +| `TShape` | `Width`, `Height` | T-shaped profile — full-width top bar, centered stem | + +#### Tier 2 — Common CNC shapes + +| Class | Parameters | Description | +|-------|-----------|-------------| +| `RingShape` | `OuterDiameter`, `InnerDiameter` | Annular ring (two concentric circles) | +| `RightTriangleShape` | `Width`, `Height` | Right triangle with the right angle at origin | +| `IsoscelesTriangleShape` | `Base`, `Height` | Isosceles triangle centered on base | +| `TrapezoidShape` | `TopWidth`, `BottomWidth`, `Height` | Trapezoid with bottom edge centered under top | +| `OctagonShape` | `Width` | Regular octagon fitting within the given width | +| `RoundedRectangleShape` | `Width`, `Height`, `Radius` | Rectangle with arc corners | + +### File Structure + +``` +OpenNest.Core/ + Shapes/ + ShapeDefinition.cs + CircleShape.cs + RectangleShape.cs + RingShape.cs + RightTriangleShape.cs + IsoscelesTriangleShape.cs + TrapezoidShape.cs + OctagonShape.cs + RoundedRectangleShape.cs + LShape.cs + TShape.cs +``` + +### Geometry Construction + +Each shape builds a `List` (using `Line`, `Arc`, `Circle` from `OpenNest.Geometry`) and passes it to the base `CreateDrawing()` helper. Shapes are constructed at the origin (0,0) with positive X/Y extents. + +- **Lines** for straight edges +- **Arcs** for rounded corners (RoundedRectangleShape) and ring segments +- **Circles** for CircleShape and RingShape outer/inner boundaries + +### MCP Integration + +`InputTools.CreateDrawing` in `OpenNest.Mcp` will be refactored to instantiate the appropriate `ShapeDefinition` subclass and call `GetDrawing()`, replacing the existing private `CreateRectangle`, `CreateCircle`, `CreateLShape`, `CreateTShape` methods. + +## Future Expansion + +- Additional shapes (Tier 3): Single-D, Parallelogram, House, Stair, Rectangle with chamfer(s), Ring segment, Slot rectangle +- UI shape picker with per-shape parameter editors +- Shape discovery via reflection or static registry