#!/usr/bin/env python3 """Export Electron Cloud + flux flywheel PNGs for Z = 1..118 (z_knowns/frame_ZZZZ.png).""" from __future__ import annotations import argparse import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT / "src")) from kingdom.core.elements import KNOWN_ELEMENT_MAX from kingdom.core.flux_explorer import explore_flux_element from kingdom.viz.electron_cloud import build_electron_cloud_figure OUT_DIR = ROOT / "z_knowns" FRAME_WIDTH = 798 FRAME_HEIGHT = 340 def frame_path(z: int) -> Path: return OUT_DIR / f"frame_{z:04d}.png" def render_frame(z: int) -> None: payload = explore_flux_element(z) fig = build_electron_cloud_figure( payload["element"], stability_score=payload["flywheel"]["stability_score"], height=FRAME_HEIGHT, ) path = frame_path(z) fig.write_image(str(path), width=FRAME_WIDTH, height=FRAME_HEIGHT, scale=1) print(f"Wrote {path.relative_to(ROOT)} ({payload['element'].symbol}, Z={z})") def main() -> None: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--from", dest="z_min", type=int, default=1) parser.add_argument("--to", dest="z_max", type=int, default=KNOWN_ELEMENT_MAX) parser.add_argument("--force", action="store_true", help="Overwrite existing frames") args = parser.parse_args() z_min = max(1, min(args.z_min, KNOWN_ELEMENT_MAX)) z_max = max(z_min, min(args.z_max, KNOWN_ELEMENT_MAX)) OUT_DIR.mkdir(parents=True, exist_ok=True) written = 0 skipped = 0 for z in range(z_min, z_max + 1): path = frame_path(z) if path.exists() and not args.force: skipped += 1 continue render_frame(z) written += 1 print(f"Done: {written} written, {skipped} skipped → {OUT_DIR}") if __name__ == "__main__": main()