main
John Lauer Component record for rc0402fr-0733kl: files batch 1 dea64e1 21h ago
"""Fusion .lbr, Altium SchLib/PcbLib, hero GLB and the plain-STEP thumbnail for one page.

usage: finish.py <slug>   (after build.py and a first records.py run, which writes page.json)
"""
import sys, os, json, subprocess, hashlib, shutil
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from parts import PARTS
ROOT = "/tmp/claude-1001/esc3"
HERO_PY = os.path.join(ROOT, "component-hero/skills/component-hero/scripts/hero_glb.py")
slug = sys.argv[1]
P = next(p for p in PARTS if p["slug"] == slug)
OUT = os.path.join(ROOT, "pages", slug); MPN = P["mpn"]
B = json.load(open(os.path.join(ROOT, "work", f"{slug}-build.json")))
sha = lambda f: hashlib.sha256(open(os.path.join(OUT, f), "rb").read()).hexdigest()
def run(cmd, cwd=OUT):
    r = subprocess.run(cmd, capture_output=True, text=True, cwd=cwd)
    if r.returncode != 0:
        print("FAILED", cmd, r.stdout[-1500:], r.stderr[-1500:]); sys.exit(1)
    return (r.stdout + r.stderr).strip()
rec = {}
# plain STEP thumbnail for models.json
run(["step2glb", "thumbnail", B["step"], "-o", "docs/models/step-plain.png"])
# Fusion / EAGLE
o = run(["adom-lbr", "generate", "--sym", B["sym"], "--fp", B["fp"], "--part-metadata", "page.json", "-o", f"{MPN}.lbr"])
_l = run(["adom-lbr", "lint", f"{MPN}.lbr"]); lint = json.loads(_l[_l.index("{"):_l.rindex("}") + 1])
assert lint["passed"], lint
rec["lbr"] = {"file": f"{MPN}.lbr", "tool": "adom-lbr " + run(["adom-lbr", "--version"]).split()[-1],
              "command": f"adom-lbr generate --sym {B['sym']} --fp {B['fp']} --part-metadata page.json -o {MPN}.lbr",
              "lint": {"passed": lint["passed"], "errors": len(lint.get("errors", [])), "warnings": len(lint.get("warnings", []))}, "sha256": sha(f"{MPN}.lbr")}
# Altium: hub JSON beside the STEP so the PcbLib embeds the body
os.makedirs(os.path.join(OUT, "altium"), exist_ok=True)
o1 = run(["adom-lbr", "import-kicad", "--sym", B["sym"], "--fp", B["fp"], "--mpn", MPN, "--out", f"{MPN}.adom-lbr.json"])
o2 = run(["adom-lbr", "assemble-altium", "--no-dedupe", "--out", f"altium/{MPN}", f"{MPN}.adom-lbr.json"])
rep = json.loads(o2[o2.index("{"):o2.rindex("}") + 1])
assert rep["status"] == "ok" and rep["models"]["embedded"] == 1, rep
rec["altium"] = {"files": [f"altium/{MPN}.SchLib", f"altium/{MPN}.PcbLib", f"{MPN}.adom-lbr.json"],
                 "commands": [f"adom-lbr import-kicad --sym {B['sym']} --fp {B['fp']} --mpn {MPN} --out {MPN}.adom-lbr.json",
                              f"adom-lbr assemble-altium --no-dedupe --out altium/{MPN} {MPN}.adom-lbr.json"],
                 "report": rep, "hints": [l for l in o1.splitlines() if l.startswith("HINT")],
                 "sha256": {f: sha(f) for f in (f"altium/{MPN}.SchLib", f"altium/{MPN}.PcbLib", f"{MPN}.adom-lbr.json")}}
# hero GLB (component-hero standard)
o = run(["/home/adom/.venvs/cq/bin/python", "-I", HERO_PY, "package-reference.glb", B["fp"], "page.json", f"{slug}-hero.glb", "--png", "docs/verify/hero-preview.png"])
print(o)
assert "align OK" in o, o
rec["hero"] = {"file": f"{slug}-hero.glb", "tool": "adom/component-hero skills/component-hero/scripts/hero_glb.py",
               "tool_sha256": hashlib.sha256(open(HERO_PY, "rb").read()).hexdigest(),
               "inputs": ["package-reference.glb", B["fp"], "page.json"], "result": o.splitlines()[-1], "sha256": sha(f"{slug}-hero.glb")}
json.dump(rec, open(os.path.join(ROOT, "work", f"{slug}-finish.json"), "w"), indent=1)
print("finished", slug)