busbars: FDM test-print export (extruded STL + STEP)
Adds a way to print a busbar on a 3D printer to physically verify
sizing before laser-cutting nickel/copper. The existing "Extrude
solid + 0.2mm" path stays for thin-strip STEP — slicers can't print
0.2mm sheet — so the FDM path has its own thickness input (default
2mm, min 0.5mm).
Backend:
- busbar_export.py: new to_stl() writer. Forces extrude_flag = True
(STL is inherently 3D) and bumps thickness up to 2mm if the
incoming value is <0.5mm. Registers under WRITERS["stl"] so the
existing /api/export/<fmt> route serves it for free.
UI:
- index.html: new "FDM test print" block under the Params panel
with its own thickness input and two buttons (STL, STEP). The
existing 'Extrude solid' checkbox + 0.2mm thickness keep
driving plain "Export STEP".
- styles.css: .fdm-block / .fdm-row / .fdm-buttons styles
matching the existing panel typography.
- app.js: _exportFdm(fmt) reuses Exporter.exportFormat with a
shallow-merged params override ({extrude: true, thickness: fdmT}),
so the on-the-fly request gets the FDM settings without
mutating the live params state.
Verified: STL render of a 3-cell strip @ 2mm => 73KB binary STL
(opens cleanly in slicers); STEP @ 2mm => 160KB ISO-10303-21
solid; existing flat STEP path unchanged at 15KB.
This commit is contained in:
@@ -46,6 +46,7 @@ from build123d import (
|
||||
Sketch,
|
||||
add,
|
||||
export_step,
|
||||
export_stl,
|
||||
extrude,
|
||||
)
|
||||
|
||||
@@ -299,8 +300,29 @@ def to_svg(payload: dict) -> bytes:
|
||||
return path.read_bytes()
|
||||
|
||||
|
||||
def to_stl(payload: dict) -> bytes:
|
||||
"""STL with the busbars extruded to a printable plate.
|
||||
|
||||
STL is inherently 3D, so extrusion is forced regardless of the payload
|
||||
flag. Thickness defaults to 2 mm when missing or <0.5 mm (slicers can't
|
||||
do 0.2 mm sheet — that figure is for the 'thin nickel strip' STEP case).
|
||||
"""
|
||||
busbars, extrude_flag, thickness = parse_payload(payload)
|
||||
if thickness < 0.5:
|
||||
thickness = 2.0
|
||||
shapes = build_shapes(busbars, extrude_flag=True, thickness=thickness)
|
||||
compound = _as_compound(shapes)
|
||||
with TemporaryDirectory() as tmp:
|
||||
path = Path(tmp) / "busbars.stl"
|
||||
# build123d's export_stl takes a single shape; the Compound carries
|
||||
# all busbars together so the slicer sees them as one job.
|
||||
export_stl(compound, str(path))
|
||||
return path.read_bytes()
|
||||
|
||||
|
||||
WRITERS = {
|
||||
"step": (to_step, "application/step", "step"),
|
||||
"dxf": (to_dxf, "image/vnd.dxf", "dxf"),
|
||||
"svg": (to_svg, "image/svg+xml", "svg"),
|
||||
"stl": (to_stl, "model/stl", "stl"),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user