"""Command-line twin of the web screen "도면에서 읽기" (engine/geomread.py): print / write the values read from an Ungok-type pier drawing into data//params.json and expected.json (2026-10-19, rewritten on top of engine/geomread 2026-10-20). python tools/apply_pier_read.py 운곡교P1 --dry (a finished pier: only rounding changes; see tools/test_geomread.py) usage: python tools/apply_pier_read.py [--dry] backs up params / expected / confirm first; table + anchor candidates are applied afterwards (candidates screen).""" import shutil import sys import time from pathlib import Path APP = Path(__file__).resolve().parents[1] sys.path.insert(0, str(APP / "web")) sys.path.insert(0, str(APP)) import store # noqa: E402 from engine import geomread # noqa: E402 name = sys.argv[1] pier = store.Pier(name) P, E = pier.load("params"), pier.load("expected") ref = store.rjson(store.template_dir("운곡교P1형") / "params.json") audit = store.rjson(pier.drawings / "audit.json", []) P2, E2, changes, notes = geomread.read(P, E, ref, pier.texts(), geomread.dxf_of(pier.dir, audit), name) print(f"{name}: {len(changes)} changes") for c in changes: brief = lambda v: v if not isinstance(v, (list, dict)) else f"{type(v).__name__}[{len(v)}]" # noqa: E731 print(f" {c['file']}:{c['path']:58s} {str(brief(c['old']))[:22]:>22} -> {str(brief(c['new']))[:30]:<30} | {c['why']}") for n in notes: print("NOTE:", n) if "--dry" in sys.argv: sys.exit(0) bk = pier.dir / "backup" / f"before_apply_pier_read_{time.strftime('%Y%m%d_%H%M%S')}" bk.mkdir(parents=True) for f in ("params.json", "expected.json", "confirm.json"): if (pier.dir / f).exists(): shutil.copy2(pier.dir / f, bk / f) pier.save("params", P2) pier.save("expected", E2) print("saved; backup:", bk)