Component Placement Canvas - Complete Implementation¶
✅ Feature Complete¶
Interactive ReactFlow-based component placement canvas fully integrated with KiCAD export.
What Was Built¶
Core Components¶
| File | Purpose |
|---|---|
| componentPlacement.ts | Types + 60+ package sizes |
| ComponentNode.tsx | Draggable footprint nodes |
| BoardCanvas.tsx | ReactFlow canvas + board outline |
| BoardLayoutDrawer.tsx | Drawer UI with save/load |
| autoLayoutService.ts | RF chain → auto positions |
KiCAD Export Integration (New! ✨)¶
| File | Changes |
|---|---|
| kicadProjectGenerator.ts | Added componentPlacements parameter |
| useKiCadGeneration.ts | Pass placements to generator |
| RfModuleActionsContext.tsx | Updated context type |
| rf_project.py | Extract placements from request |
| kicad_export.py | Use placements in PCB generation |
Features Working¶
- ✅ Board outline as ReactFlow node (synced coordinates)
- ✅ Drag to reposition components
- ✅ Click to rotate 90°
- ✅ Auto-layout from RF chain (Phase II data)
- ✅ Color-coded by function (PA=red, VCO=purple)
- ✅ Grid snap (1mm)
- ✅ Zoom/pan controls
- ✅ Save/load layouts (localStorage)
- ✅ Persist to PhaseIVData context
- ✅ KiCAD export uses custom positions 🎉
How to Use¶
Phase IV - Board Layout¶
- Complete Phase II (RF chain selection)
- Go to Phase IV → Generate stackup
- Click "Board Layout" button
- Drag components, click to rotate
- Use file menu to save/load layouts
- Click "Apply Changes" to save
KiCAD Export with Custom Positions¶
- After arranging components in board layout
- Go to Phase II → Click "Export to KiCAD" button
- Generated
.kicad_pcbfile will use your custom positions! - Backend logs will show:
📍 Using user placement for U1: (50.0, 75.0) @ 90°
Testing Instructions¶
Manual Test Flow¶
# 1. Start dev servers
.\start-all-servers-windowed.ps1
# 2. Complete Phase I & II (select components)
# 3. Go to Phase IV, generate stackup
# 4. Click "Board Layout" button
# 5. Drag components to new positions
# 6. Click component to rotate
# 7. Click "Apply Changes"
# 8. Go back to Phase II
# 9. Click "Export to KiCAD"
# 10. Check backend logs - should see:
# 📍 Using 5 user-defined component placements
# 📍 Using user placement for U1: (50.0, 75.0) @ 90°
# 11. Open exported .kicad_pcb file
# 12. Verify component positions match your canvas layout
Technical Implementation¶
Data Flow¶
User drags component in BoardCanvas
↓
onPlacementsChange callback
↓
phaseIVData.componentPlacements updated
↓
User clicks "Export to KiCAD"
↓
generateKiCadProject(chain, params, componentPlacements)
↓
POST /api/generate-rf-project with placements
↓
kicad_exporter.generate_complete_rf_project(..., component_placements)
↓
_generate_simple_pcb_file matches placements by part_number/designator
↓
position = (placement.x_mm, placement.y_mm)
rotation = placement.rotation_deg
↓
KiCAD PCB file generated with custom positions
Matching Logic¶
Backend matches placements using: 1. Part Number (e.g., "ADF4351") 2. Designator fallback (e.g., "U1")
Optional Future Enhancements¶
| Feature | Priority | Effort |
|---|---|---|
| Bottom-side components | Low | ~30 min |
| Overlap detection (DRC) | Medium | ~2 hours |
| Keep-out zones | Low | ~2 hours |
| Auto-routing preview | Future | ~8 hours |
Files Modified Summary¶
Frontend (5 files):
- kicadProjectGenerator.ts - Added componentPlacements parameter
- useKiCadGeneration.ts - Pass placements to export
- RfModuleActionsContext.tsx - Updated type signature
- PhaseIV.tsx - Integrated BoardLayoutDrawer (from earlier work)
- phase.ts - Added componentPlacements field to PhaseIVData
Backend (2 files):
- rf_project.py - Extract placements from API request
- kicad_export.py - Override positions in PCB generation loop
Generated on 2026-01-16 | Magic PCB AI