Skip to content

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

  1. Complete Phase II (RF chain selection)
  2. Go to Phase IV → Generate stackup
  3. Click "Board Layout" button
  4. Drag components, click to rotate
  5. Use file menu to save/load layouts
  6. Click "Apply Changes" to save

KiCAD Export with Custom Positions

  1. After arranging components in board layout
  2. Go to Phase II → Click "Export to KiCAD" button
  3. Generated .kicad_pcb file will use your custom positions!
  4. 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