Sysmaker Schematic EditorA visual, canvas-based schematic editor for tscircuit built as a VS Code web extension. Design circuits on a drag-and-drop canvas; the editor keeps your TSX source in sync automatically. Features
Requirements
Getting StartedInstall dependencies
Development build (watch mode)
Launch in browser for manual testing
This opens a Chromium window with the extension loaded. Use the Sysmaker icon in the activity bar to open the editor. Production build & package
This runs webpack in production mode and produces To build the bundles only (without packaging):
Install in code-serverThis extension is a web extension and works in code-server without modification. CLI:
UI: Extensions panel → Commands
DevelopmentOther useful commands
Project structure
Architecture notesThe extension uses two separate webpack bundles built together:
The two sides communicate via All editor state lives in a virtual in-memory filesystem (
每個檔案的功能說明Extension Host(VS Code 擴充主機端)
|
| 檔案 | 功能 |
|---|---|
Canvas.tsx |
主畫布。處理拖放、框選、連線(wiring)、縮放平移、SVG 渲染所有已放置零件與導線。 |
Header.tsx |
頂部工具列。包含 ZIP 匯入/匯出、Layout 自動排版按鈕、開啟檔案等動作。 |
EditorTabs.tsx |
顯示目前開啟的檔案分頁,點擊切換 activeFilePath。 |
CodeView.tsx |
顯示目前檔案的原始 TSX 碼或匯出預覽,支援「source」與「export」兩個 tab。 |
EnhancedPropertiesPanel.tsx |
選取零件時顯示的完整屬性編輯面板,支援一般零件屬性與 Subcircuit 建立流程。 |
PropertiesPanel.tsx |
舊版簡易屬性面板(現已被 EnhancedPropertiesPanel 取代)。 |
CatalogPanel.tsx |
主 Webview 內嵌的 Catalog 面板(Sidebar 版本使用 catalogView.tsx)。 |
SchematicSymbol.tsx |
渲染單一零件的 SVG 符號圖形(接腳、形狀、標籤)。 |
SymbolCanvas.tsx |
符號編輯器畫布,用來繪製自訂 IC 符號(接腳位置、形狀路徑)。 |
SymbolPropertiesPanel.tsx |
符號編輯器的屬性面板(選取接腳或形狀時顯示)。 |
FileTree.tsx |
Webview 內的檔案樹(已被 Sidebar tree view 取代,保留作備用)。 |
StatusBar.tsx |
底部狀態列,顯示目前檔案類型、零件數、Net 數。 |
WiringPanel.tsx |
連線操作輔助面板(顯示可連接的 pin 列表)。 |
Zustand Store(src/webview/store/)
store/editorStore.ts
整個應用程式的唯一狀態樹,由 Zustand 管理。儲存:
fsMap:虛擬檔案系統(路徑 → 內容字串)placedComponents:畫布上所有已放置的零件wires:所有導線連接viewport:目前縮放與平移狀態workspaces:所有 workspace 與activeWorkspaceIdselectedComponentIds、activeFilePath等 UI 狀態- 全部 action:新增/更新/刪除零件、連線、Undo/Redo、Subcircuit 建立、TSX 重新生成、workspace 管理等
store/workspaceFs.ts
處理 workspace 的虛擬檔案系統初始化。提供:
createDefaultWorkspaceFsMap():建立一個含有預設schematics/main.tsx、subcircuits/index.ts、symbols/index.ts、editor/meta.json的初始檔案集合exportWorkspaceJson()/importWorkspaceJson():把整個 workspace 序列化/反序列化成 JSON
store/metaHelpers.ts
讀寫 editor/meta.json(存在 fsMap 裡)。這個 JSON 儲存 Net Anchor 的位置(netAnchors)與 layout 快取,讓自動 net label 的位置可以被持久保存。
Catalog(src/webview/catalog/)
| 檔案 | 功能 |
|---|---|
index.ts |
整合所有 catalog 項目,匯出 CATALOG 查找表與 getCatalogItem(id) / getAllCatalogItems()。 |
parts.ts |
定義所有被動元件與主動元件:Resistor、Capacitor、Inductor、Diode、Transistor、LED、Switch、IC Chip、自訂 Chip、Pin Header、Test Point、Voltage Source/Probe 等。 |
connectivity.ts |
定義連線類元件:Trace(導線)、Net Label、Net Port、Net(net 節點)。 |
primitives.ts |
定義繪圖圖元:Schematic Line、Arc、Text、Port(符號接腳)等,主要用於符號編輯器。 |
每個 CatalogItem 提供:
metadata(id、label、kind、editablePropsSchema、defaultProps)emitTSX(props):根據屬性生成對應的 tscircuit JSX 字串
Net 系統(src/webview/net/)
| 檔案 | 功能 |
|---|---|
NetRegistry.ts |
把 net 名稱(如 VCC、GND、SPI_CLK)映射到穩定的 ID,並推斷每個 net 的語意角色(power、ground、spi、i2c、clock 等)。autoWireCommonNets() 利用它來自動連接同名 net 的零件。 |
electricalGraph.ts |
從 placedComponents + wires 建構 ElectricalGraphModel:把所有接腳位置、導線段、節點(Junction)整合成圖結構,供 layout 與 netlist 使用。 |
extractNetlist.ts |
從 ElectricalGraphModel 提取完整的 netlist(每個 net 包含哪些元件接腳)。 |
junctionGraph.ts |
處理導線的幾何交叉判斷(Union-Find 演算法),判斷哪些線段實際相交形成節點(Junction)。 |
Utils(src/webview/utils/)
| 檔案 | 功能 |
|---|---|
tsxManipulator.ts |
使用 @babel/parser + @babel/traverse + @babel/generator 操作 TSX AST,支援新增/刪除/更新零件屬性,以及從畫布狀態完整重建 TSX 原始碼(regenerateTSX())。 |
exportCompiler.ts |
把 ExportGraph(中間 IR)編譯成 tscircuit JSX 字串,包含 trace 路由點的序列化。 |
elkLayout.ts |
呼叫 elkjs(自帶 bundled 版,無需 Web Worker)執行自動電路圖排版。把 PlacedComponent 轉換為 ELK 節點/邊,取回座標後更新 store。 |
semanticLayout.ts |
在送給 ELK 之前,根據零件語意(IC、去耦電容、電源符號、類比等)預先分群、決定哪些 net 用 label 策略而非拉線,讓 ELK 結果更易讀。 |
fileClassification.ts |
根據檔案路徑與內容(是否有 <board>、<subcircuit>、symbol= 等特徵)判斷 ActiveFileType,決定要顯示哪個編輯器模式。 |
sidebarBridge.ts |
從 Zustand store 快照建構 SidebarState,供 Extension Host 更新 sidebar tree view。 |
projectManager.ts |
解析 fsMap 中所有檔案,建立 subcircuit registry、symbol registry、依賴圖(dependency graph);也處理 ZIP 批次匯入/匯出。 |
symbolDocument.ts |
讀寫 .symbol.json 符號文件格式;把符號文件轉成 TSX 零件程式碼(generateSymbolTsx());把現有 TSX 逆向解析回符號文件(importSymbolTsxToDocument())。 |
coordinateScale.ts |
畫布像素座標與 tscircuit schematic 座標(單位 mm)之間的換算,固定 scale 為 20px/unit。 |
vscodeApiSingleton.ts |
包裝 acquireVsCodeApi()(只能呼叫一次),提供全域唯一的 vscodeApi 實例給 store 和 index.tsx 使用。 |
previewRenderer.ts |
預留的 preview 渲染框架(目前是 stub),未來用來把 TSX 編譯成 SVG 預覽。 |
Types(src/webview/types/)
| 檔案 | 功能 |
|---|---|
catalog.ts |
核心型別:CatalogItem、PlacedComponent、WireConnection、FSMap、EditorState、PropSchema 等。 |
schematic.ts |
每種零件類型的接腳像素佈局(COMPONENT_SCHEMATICS),供 Canvas 渲染時計算接腳位置。 |
exportGraph.ts |
中間 IR 型別:ExportGraph、ExportTrace、ExportNetLabel、ExportNode 等,是畫布狀態到最終 TSX 的橋樑。 |
electricalGraph.ts |
電氣圖型別:ElectricalGraphModel、Net、Port、Junction、WireSegment 等。 |
electricalTruth.ts |
更高層的電氣真值型別,用於語意 layout 分析。 |
workspace.ts |
Workspace 相關型別:StoredWorkspaceState、WorkspaceExport、StoredProjectState 等。 |
project.ts |
專案管理型別:SubcircuitDefinition、SymbolDefinition、DependencyGraph、FileTreeNode 等。 |
schematicView.ts |
Schematic 視圖相關型別。 |
symbolDocument.ts |
符號文件格式型別:SymbolDocument、SymbolPort、SymbolShape、SymbolToolMode 等。 |
catalog.ts 內的 ExposedPortSelection |
Subcircuit 建立時,選擇要暴露哪些接腳的型別。 |
Config(src/webview/config/)
config/paths.ts
動態設定 subcircuits 資料夾路徑(預設 subcircuits/),可由 Extension Host 透過 configUpdate 訊息覆蓋。提供 getSubcircuitsFolder()、getSubcircuitsPrefix()、getSubcircuitsIndexPath() 等 getter。
Lib(src/webview/lib/)
| 檔案 | 功能 |
|---|---|
lib/parts/Potentiometer.tsx |
可變電阻(電位器)的 React 零件元件,供 catalog 使用。 |
lib/patches/index.ts |
Patch 系統:定義對舊版 fsMap 資料格式的遷移補丁,在載入時自動修正不相容的舊資料。 |
External Assets
KiCad 符號庫
KiCad 官方符號庫透過 GitHub API 動態抓取,無需本地 clone。Extension 啟動時會呼叫 https://api.github.com/repos/KiCad/kicad-symbols 取得符號庫清單,並在使用者選取符號時按需下載內容,結果會快取於 context.globalState。
License
MIT