component
STM32G431CBT6 - Arm Cortex-M4 Microcontroller
Public Made by Adomby adom
STMicroelectronics Microcontrollers (MCU/MPU/SOC), LQFP-48(7x7). Pinout checked against ST's open pin data, KiCad symbol/footprint/3D.
main
John Lauer
3D model from KiCad's own package generator at the datasheet's values: radiused gull-wing leads in matte tin, reviewed…
9ad862b
#!/bin/bash
# Build a component page's 3D assets from a KiCad-generator model already etched in work/<slug>:
# <slug>.step (plain), <slug>-etched.step (reviewed marking, gate PASS)
# usage: assets.sh <slug> <generator key> <params.json> <page dir>
# Writes into work/<slug>/out: <slug>.glb, <slug>-etched.glb, <slug>-hero.glb, lod/*.glb + previews, stats.json
set -euo pipefail
slug=$1; key=$2; params=$3; page=$4
W=~/project/kicad-gen/work; D=$W/$slug; O=$D/out; PY=~/project/kicad-gen/venv/bin/python
HERO=/tmp/claude-1001/-home-adom-project/43add640-14a6-413a-b15b-ffdadeb7cf16/scratchpad/component-hero/skills/component-hero/scripts/hero_glb.py
TOOLS=$page/provenance/tools
mkdir -p $O/lod
LOD="node $HOME/project/kicad-gen/node3/lod.mjs"
conv() { # conv in.step out.glb [lod.mjs options...]: STEP -> GLB (uncompressed), batch/simplify/quantize, materials
local in=$1 out=$2; shift 2
local log=$O/convert.log raw=$O/raw-$(basename $out)
timeout 900 step2glb convert "$in" -o "$raw" --compress none >>$log 2>&1 || { tail -5 $log; exit 1; }
$LOD "$raw" "$out" "$@" 2>>$log | tail -1 >> $O/lod-steps.jsonl
rm -f "$raw"
$PY $W/materials.py "$out" >/dev/null
}
: > $O/lod-steps.jsonl
# page files: the plain model and the board-use etched model, uncompressed, primitives batched per part
conv $D/$slug.step $O/$slug.glb
conv $D/$slug-etched.step $O/$slug-etched.glb
# super-low: the same generator run with an undrafted, unfilleted body (leads unchanged)
python3 - "$params" $D/superlow.json <<'EOF'
import json, sys
p = json.load(open(sys.argv[1])); p.update({"the": 0.0, "ef": 0.0}); p["model_name"] = p.get("model_name", "x") + "_superlow"
json.dump(p, open(sys.argv[2], "w"))
EOF
$PY $W/kgen.py $key $D/superlow.json $D/$slug-superlow.step >$O/superlow.json 2>/dev/null
# four LODs, all board-use (no footprint art): high = etched uncompressed, medium = etched quantized,
# low = plain quantized (marking unreadable at that size), super-low = undrafted plain quantized
cp $O/$slug-etched.glb $O/lod/$slug-high.glb
conv $D/$slug-etched.step $O/lod/$slug-medium.glb --quantize
conv $D/$slug.step $O/lod/$slug-low.glb --simplify 0.5:0.002 --quantize
conv $D/$slug-superlow.step $O/lod/$slug-super-low.glb --simplify 0.25:0.004 --quantize
for l in high medium low super-low; do $PY $W/render.py $O/lod/$slug-$l.glb $O/lod/$slug-$l.png --view iso --size 400 --glbtool $TOOLS/glbtool.py >/dev/null; done
$PY $TOOLS/glbtool.py stats $O/$slug.glb $O/$slug-etched.glb $O/lod/$slug-{high,medium,low,super-low}.glb > $O/stats.json
# the annotated hero (display only) from the board-use model
$PY $HERO $O/$slug-etched.glb $page/$slug.kicad_mod $page/page.json $O/$slug-hero.glb --png $O/$slug-hero-preview.png > $O/hero.log 2>&1 || { tail -5 $O/hero.log; exit 1; }
grep -iE "align|offset|PASS|FAIL|warn" $O/hero.log | head -5
python3 -c "
import json;s=json.load(open('$O/stats.json'))
for x in s: print(' ',x['file'],x['triangles'],'tris',x['primitives'],'prims',x['bytes'],'B','helpers',x['helperNodes'],'mark',x['mark'])"