initial checkin
This commit is contained in:
@@ -0,0 +1,174 @@
|
||||
# Architecture
|
||||
|
||||
## System Overview
|
||||
|
||||
The Expolinc Booth Designer connects three layers: the **AI assistant**, the **MCP server bridge**, and **FreeCAD** acting as the geometry engine.
|
||||
|
||||
```
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ AI Assistant │
|
||||
│ (Claude Desktop / Claude Code) │
|
||||
│ "build a 4x3m island booth with 2 backlit walls" │
|
||||
└──────────────────────┬───────────────────────────┘
|
||||
│ MCP protocol (stdio JSON-RPC)
|
||||
▼
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ MCP Server (Node.js/TS) │
|
||||
│ │
|
||||
│ ┌─────────────────┐ ┌──────────────────────┐ │
|
||||
│ │ Built-in tools │ │ Expolinc tools │ │
|
||||
│ │ (165 tools from │ │ 12 custom tools: │ │
|
||||
│ │ freecad-mcp) │ │ build_booth, │ │
|
||||
│ │ │ │ create_wall, │ │
|
||||
│ │ - BIM primitives │ │ export_bom, │ │
|
||||
│ │ - Part operations│ │ arrange_layout, ... │ │
|
||||
│ │ - TechDraw │ └──────────────────────┘ │
|
||||
│ │ - Import/Export │ │
|
||||
│ └─────────────────┘ │
|
||||
│ │
|
||||
│ ┌──────────────────────────────────────────────┐ │
|
||||
│ │ Layout Engine │ │
|
||||
│ │ Interprets booth spec → wall positions → │ │
|
||||
│ │ component list → placement coordinates │ │
|
||||
│ └──────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌──────────────────────────────────────────────┐ │
|
||||
│ │ BOM Generator │ │
|
||||
│ │ Component count, weights, transport cases, │ │
|
||||
│ │ SEG graphic area, part numbers │ │
|
||||
│ └──────────────────────────────────────────────┘ │
|
||||
└──────────────────────┬───────────────────────────┘
|
||||
│ TCP JSON-RPC :12345
|
||||
▼
|
||||
┌──────────────────────────────────────────────────┐
|
||||
│ FreeCAD (GUI or headless) │
|
||||
│ │
|
||||
│ ┌──────────────────────────────────────────────┐ │
|
||||
│ │ ExpolincLib (Python) │ │
|
||||
│ │ │ │
|
||||
│ │ classic_frame.py ── App::FeaturePython │ │
|
||||
│ │ light_frame.py ── Parametric objects │ │
|
||||
│ │ connectors.py ── Placement helpers │ │
|
||||
│ │ accessories.py ── Storage, doors, etc. │ │
|
||||
│ │ layouts.py ── Assembly builder │ │
|
||||
│ │ bom.py ── Spreadsheet output │ │
|
||||
│ └──────────────────────────────────────────────┘ │
|
||||
│ │
|
||||
│ ┌──────────────────────────────────────────────┐ │
|
||||
│ │ FreeCAD Workbenches Used │ │
|
||||
│ │ - Part (primitives, booleans) │ │
|
||||
│ │ - PartDesign (sketches, pads, pockets) │ │
|
||||
│ │ - BIM (walls, slabs for booth structure) │ │
|
||||
│ │ - TechDraw (dimensioned drawings) │ │
|
||||
│ │ - Spreadsheet (BOM data) │ │
|
||||
│ └──────────────────────────────────────────────┘ │
|
||||
└──────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
## Data Flow
|
||||
|
||||
### Booth Creation Flow
|
||||
|
||||
```
|
||||
User: "Build a 6x4m island booth with 2.5m Classic Frame walls,
|
||||
backlit on walls 0 and 2, with a storage room"
|
||||
|
||||
1. MCP Server receives `expolinc_build_booth` tool call
|
||||
2. Layout Engine parses parameters:
|
||||
- Layout: island (4 walls, open all sides)
|
||||
- Wall 0: 6000×2500mm Classic Frame + Light Frame backlit
|
||||
- Wall 1: 4000×2500mm Classic Frame
|
||||
- Wall 2: 6000×2500mm Classic Frame + Light Frame backlit
|
||||
- Wall 3: 4000×2500mm Classic Frame
|
||||
- Storage: 1950×1000×2500mm
|
||||
3. Layout Engine computes wall positions:
|
||||
- Wall 0: position (0,0,0), rotation 0°
|
||||
- Wall 1: position (6000,0,0), rotation 90°
|
||||
- Wall 2: position (6000,4000,0), rotation 180°
|
||||
- Wall 3: position (0,4000,0), rotation -90°
|
||||
- 4× 90° corner connectors at each junction
|
||||
- Storage room attached to Wall 3
|
||||
4. BOM Generator calculates:
|
||||
- 2× Classic Frame 4950mm + 2× extension profiles
|
||||
- 2× Light Frame 4950mm
|
||||
- 4× 90° corner connectors
|
||||
- 8× support feet
|
||||
- 1× Storage room kit
|
||||
- SEG graphic area: ~50 m²
|
||||
- Total weight: ~120 kg
|
||||
- Recommended transport: 2× Standard Case XL
|
||||
5. FreeCAD creates:
|
||||
- 4 FCStd documents with parametric components
|
||||
- Assembly with placements
|
||||
- Spreadsheet with BOM data
|
||||
6. Response returned with:
|
||||
- Document reference
|
||||
- BOM as structured data
|
||||
- Preview screenshot (if GUI mode)
|
||||
```
|
||||
|
||||
### MCP Tool Dispatch
|
||||
|
||||
```
|
||||
Client → MCP Server → freecad-mcp bridge → FreeCAD TCP server → ExpolincLib
|
||||
```
|
||||
|
||||
Each Expolinc tool call:
|
||||
1. Validates parameters at the MCP server level
|
||||
2. Translates to FreeCAD Python script
|
||||
3. Sends to FreeCAD via JSON-RPC
|
||||
4. FreeCAD executes on main thread via task queue
|
||||
5. Returns result (object IDs, geometry metadata, or file paths)
|
||||
|
||||
## Module Responsibilities
|
||||
|
||||
### ExpolincLib (Python, runs inside FreeCAD)
|
||||
|
||||
| Module | Responsibility |
|
||||
|---|---|
|
||||
| `classic_frame.py` | Create Classic Frame walls: aluminum profile frame, SEG graphic panel, support feet. Parameters: width, height, double_sided |
|
||||
| `light_frame.py` | Create Light Frame backlit walls: LED frame, diffuser, LED strip, power supply housing. Parameters: width, height, led_temp, brightness |
|
||||
| `connectors.py` | Create 90° corner connectors, 180° inline connectors, T-connectors. Handles placement alignment between adjacent walls |
|
||||
| `accessories.py` | Create storage rooms (enclosed box frame + door), hinged/pocket doors, shelves, bridge connectors between parallel walls |
|
||||
| `layouts.py` | Orchestrate wall placement for each layout type. Computes positions from booth dimensions. Handles corner alignment |
|
||||
| `bom.py` | Traverse the document tree, enumerate Expolinc components, collect parameters, output CSV/JSON/spreadsheet |
|
||||
| `specs.py` | Official Expolinc dimensional specs, weight tables, available sizes, material properties |
|
||||
|
||||
### MCP Server Extension (TypeScript, runs as MCP stdio server)
|
||||
|
||||
| Module | Responsibility |
|
||||
|---|---|
|
||||
| `server.ts` | Extends freecad-mcp with Expolinc tool registration, parameter validation, error handling |
|
||||
| `expolinc_tools.ts` | Tool definitions: parameter schemas, descriptions, FreeCAD script generation |
|
||||
| `layout_engine.ts` | Booth geometry math: wall positioning, corner fitting, grid alignment (990mm grid) |
|
||||
| `bom_generator.ts` | Parse BOM response from FreeCAD, format as CSV/JSON, calculate totals |
|
||||
|
||||
## Data Sources
|
||||
|
||||
All Expolinc specification data (dimensions, weights, materials, LED specs) is sourced from:
|
||||
|
||||
1. **Expolinc official website** — product pages for Classic Frame and Light Frame list exact weights per size
|
||||
2. **Expolinc Catalog 2020/2021** (PDF) — full product catalog with dimensions
|
||||
3. **Expolinc Panel Guide 2024** (PDF) — SEG graphic panel specifications
|
||||
4. **SketchUp 3D Warehouse** (`3dwarehouse.sketchup.com/by/expolinc`) — official 3D models for dimensional reference
|
||||
5. **Expolinc Google Drive** — per-product folders with CAD files, setup instructions, templates
|
||||
|
||||
All weight data has been verified against the official website. The 3D models are SketchUp format (.skp) and serve as reference for profile cross-sections and connector details — they cannot be directly converted to parametric FreeCAD FeaturePython objects.
|
||||
|
||||
## FreeCAD Configuration
|
||||
|
||||
### GUI Mode (recommended for design)
|
||||
|
||||
FreeCAD runs with UI visible. The MCP server connects via the TCP addon. Users see changes live in the 3D viewport.
|
||||
|
||||
### Headless Mode (for automation / CI)
|
||||
|
||||
FreeCAD is imported as a Python module (`freecadcmd`). No GUI. Suitable for batch BOM generation or scripted production of standard booth layouts.
|
||||
|
||||
## Port Layout
|
||||
|
||||
| Port | Service | Protocol |
|
||||
|---|---|---|
|
||||
| `12345` | freecad-mcp addon (TCP) | JSON-RPC |
|
||||
| `12346` | ExpolincLib internal | JSON-RPC (optional) |
|
||||
| `stdin/stdout` | MCP server ↔ AI assistant | JSON-RPC (MCP) |
|
||||
Reference in New Issue
Block a user