Files
wenil d8cb0dc06d Initial commit: Busbar Designer
Web tool for designing nickel/copper busbars over cylindrical-cell battery
packs (21700, 18650) in hex holders. Flask + build123d backend exports
STEP/DXF/SVG; vanilla JS frontend with live preview, multi-project SQLite
persistence, snapshot history.

Deploy scripts in deploy/ (proxmox-lxc.sh, install.sh, update.sh).
2026-05-24 18:59:50 +03:00

61 lines
1.8 KiB
JavaScript

/* exporter.js — collect busbars into the backend payload and download file. */
const Exporter = (() => {
function buildPayload(state, params) {
const cellsById = new Map(state.cells.map((c) => [c.id, c]));
const busbars = state.busbars.map((bb) => ({
name: bb.name,
color: bb.color,
shape: bb.shape || "panel",
strip_width: params.stripWidth,
pad_radius: params.padRadius,
hole_radius: params.holeRadius,
hole_shape: params.holeShape || "cross",
slit_width: params.slitWidth,
neighbor_factor: params.neighborFactor,
cells: bb.cells
.map((cid) => {
const c = cellsById.get(cid);
return c ? { id: c.id, x: c.x, y: c.y } : null;
})
.filter(Boolean),
}));
return {
units: "mm",
extrude: !!params.extrude,
thickness: params.thickness,
busbars,
};
}
async function exportFormat(fmt, state, params) {
if (!state.busbars.length) {
alert("Create at least one busbar before exporting.");
return;
}
const payload = buildPayload(state, params);
const res = await fetch(`/api/export/${fmt}`, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify(payload),
});
if (!res.ok) {
let msg;
try { msg = (await res.json()).error; } catch { msg = await res.text(); }
alert(`Export failed: ${msg}`);
return;
}
const blob = await res.blob();
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = `busbars.${fmt}`;
document.body.appendChild(a);
a.click();
setTimeout(() => { URL.revokeObjectURL(url); a.remove(); }, 100);
}
return { exportFormat, buildPayload };
})();