Update wiring diagram maker: formboard router + frontend

Backend formboard router and frontend (canvas, formboard, connector library,
app/api, index/css) updates. Ignore *.log.
This commit is contained in:
2026-07-14 07:09:10 -04:00
parent 906a0a1075
commit f3564cbbb0
9 changed files with 591 additions and 40 deletions
+59
View File
@@ -130,6 +130,20 @@ const CONNECTOR_LIBRARY = {
{ id: "can-j1939", name: "SAE J1939 9-pin", manufacturer: "Amphenol", partNumber: "HD10-9-1939P", pinCount: 9, description: "J1939 CAN heavy-vehicle datalink", pinLabels: ["Battery","+Battery","GND","CAN H","Shield","GND","CAN L","NC","NC"] },
{ id: "can-obd2", name: "OBD-II 16-pin", manufacturer: "Standard", partNumber: "SAE J1962", pinCount: 16, description: "On-board diagnostics port", pinLabels: ["Mfr","Mfr","GND","Mfr","Sig GND","CAN H","K-Line","Mfr","Bat+","Mfr","Mfr","Mfr","Mfr","CAN L","L-Line","OBD+"] },
],
"Deutsch DRC (Round)": [
{
id: "drc-30p", name: "DRC04-30P", manufacturer: "TE Connectivity",
partNumber: "DRC04-30P-A191", pinCount: 30, shape: "circular",
pinRings: [14, 10, 6],
description: "30-pin circular environmental plug (pin contacts), IP67, 1220 AWG",
},
{
id: "drc-30s", name: "DRC06-30S", manufacturer: "TE Connectivity",
partNumber: "DRC06-30S-A191", pinCount: 30, shape: "circular",
pinRings: [14, 10, 6],
description: "30-pin circular environmental socket (receptacle), IP67, 1220 AWG",
},
],
"General Automotive / EV": [
{ id: "ga-motor3", name: "Motor Phase 3-pin", manufacturer: "varies", partNumber: "varies", pinCount: 3, description: "3-phase motor connections", pinLabels: ["U","V","W"] },
{ id: "ga-res2", name: "Resolver 2-pin", manufacturer: "varies", partNumber: "varies", pinCount: 2, description: "Motor resolver position sensor", pinLabels: ["SIN","COS"] },
@@ -155,6 +169,51 @@ function connectorToDevice(connId, diagramId) {
if (!conn) return null;
const pinCount = conn.pinCount || 2;
if (conn.shape === "circular") {
const size = 140;
const cx = size / 2, cy = size / 2;
const pinR = size * 0.471; // pins outside the body circle (body uses 0.386 ratio)
const pins = Array.from({ length: pinCount }, (_, i) => {
const angle = -Math.PI / 2 + (2 * Math.PI * i / pinCount);
const x = cx + pinR * Math.cos(angle);
const y = cy + pinR * Math.sin(angle);
let side;
if (angle >= -3 * Math.PI / 4 && angle < -Math.PI / 4) side = "top";
else if (angle >= -Math.PI / 4 && angle < Math.PI / 4) side = "right";
else if (angle >= Math.PI / 4 && angle < 3 * Math.PI / 4) side = "bottom";
else side = "left";
return {
id: `pin_${i + 1}`,
name: conn.pinLabels ? (conn.pinLabels[i] || String(i + 1)) : String(i + 1),
side,
x_offset: Math.round(x * 10) / 10,
y_offset: Math.round(y * 10) / 10,
};
});
return {
diagram_id: diagramId,
device_type: "connector",
label: conn.name,
reference: "",
x: 200, y: 200,
width: size, height: size,
properties: {
pinCount,
shape: "circular",
pinRings: conn.pinRings || [],
orientation: "right",
partNumber: conn.partNumber || "",
manufacturer: conn.manufacturer || "",
connectorLibraryId: connId,
},
pins,
};
}
// Standard rectangular connector
const w = 120;
const h = Math.max(60, pinCount * 18 + 20);
const pins = Array.from({ length: pinCount }, (_, i) => ({