Files
Pier_v1/Code/교각모델링/extract_footing_rebar.py
T
ahnyongjooandClaude Sonnet 5.5 964a841de1 chore(rebar): Pier_T_rebar 작업 폴더 초기 구성 및 외부 의존 파일 통합
- Code\rebar_pipeline, review_pipeline, pier-program을 정션에서 실제 폴더로 전환
- Code\rhino_mcp 및 CLAUDE_rhino배경.md 추가, .mcp.json은 PYTHONPATH로 새 위치 사용
- pier-program 내부 .git 제거(이력은 backup\pier-program_20261028.bundle에 보관)
- worktree 가이드 반영(CLAUDE.local.md, HANDOFF.md)
- D:\Rhino-MCP 경로 참조를 새 위치로 치환

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:20:18 +09:00

80 lines
4.3 KiB
Python

"""Read footing rebar B1-B12 and append `footing_rebar` to params.json (existing keys unchanged).
Sources: D3 schedule (판독/3_survey.json), D1 정면도/단면도 rebar dots and lines (판독/front.json, side.json),
D1·D2 dimension chains. Heights are z above footing bottom (EL 26.208). Values tagged [hitl] are pending
user approval (설계서 v0.1.05 §6).
"""
import json
from collections import defaultdict
from pathlib import Path
HERE = Path(__file__).resolve().parent
FB = 26208
def dots(name, cx):
d = json.loads((HERE / "판독" / f"{name}.json").read_text(encoding="utf-8"))
lv = defaultdict(list)
for r in d:
if r["type"] == "CIRCLE" and r["layer"].startswith("CS-RBAR") and 8115 < r["pts"][0][1] < 10316 \
and abs(r["r"] - 27) < 1:
lv[round(r["pts"][0][1] - 8115.6, 1)].append(round(r["pts"][0][0] - cx, 1))
return {z: sorted(v) for z, v in lv.items()}
def mirror(xs, edge=None):
"""Half-view positions (x >= 0) -> full symmetric list; drop column/B10 dots beyond `edge`."""
xs = [x for x in xs if edge is None or x <= edge]
return sorted({-x for x in xs} | set(xs))
def main():
sched_rows = {}
texts = json.loads((HERE / "판독" / "3_survey.json").read_text(encoding="utf-8"))["texts"]
for m in ["B%d" % i for i in range(1, 13)]:
for t0 in [t for t in texts if t["text"] == m and t["y"] > 15000]:
row = sorted([t for t in texts if abs(t["y"] - t0["y"]) < 40 and t0["x"] - 50 <= t["x"] < t0["x"] + 20000],
key=lambda a: a["x"])
sched_rows[m] = [t["text"] for t in row]
fd, sd = dots("front", 12159.4), dots("side", 30133.6) # front dots = Y-bars (x), side dots = X-bars (y)
edge_x, edge_y = 4575, 3800
layers = {
"bottom_Y1": dict(marks="B2/B4 alternate", z=122.0, pos=mirror(fd[122.0], edge_x), axis="Y"),
"bottom_X2": dict(marks="B6/B8 alternate", z=178.0, pos=mirror(sd[178.0], edge_y), axis="X"),
"bottom_Y3": dict(marks="B3", z=227.5, pos=mirror(fd[227.5], edge_x), axis="Y"),
"bottom_X4": dict(marks="B7", z=277.0, pos=mirror(sd[277.0], edge_y), axis="X"),
"top_Y": dict(marks="B1", z=2073.0, pos=mirror(fd[2073.0], edge_x), axis="Y"),
"top_X": dict(marks="B5", z=2127.0, pos=mirror(sd[2127.0], edge_y), axis="X"),
"mid_X": dict(marks="B11", axis="X",
levels={z: mirror(sd[z], edge_y - 1) for z in (550.0, 950.0, 1350.0, 1750.0)}),
"mid_Y": dict(marks="B12", axis="Y",
levels={z: mirror(fd[z], edge_x - 1) for z in (550.0, 950.0, 1350.0, 1750.0)}),
}
b9_x = [-4125 + 250 * i for i in range(34)] # D1 정면도 '450','33@250=8.250','450' (중앙)
b9_y = [-3500 + 250 * j for j in range(29)] # D1 단면도 '300','28@250=7.000','300' (중앙)
b9 = [(x, y) for i, x in enumerate(b9_x) for j, y in enumerate(b9_y) if (i + j) % 2 == 0]
fr = dict(
_note="Footing rebar B1-B12; z above footing bottom EL 26.208; X/Y as model axes",
schedule=sched_rows, layers=layers,
b9=dict(grid_x=b9_x, grid_y=b9_y, checker_parity=0, count=len(b9), z0=150 - 22.5, a=1995, b=96, c=64,
src="D1 EREC vertical lines z 150~2100 @250 both views; count = 1062.415/2.155 = 493 [역산]; "
"checkerboard parity [추론, hitl]"),
b10=dict(levels=[150 + 200 * k for k in range(1, 10)], size_x=9198, size_y=7644,
src="D1 정면도 우측 '150','9@200=1.800'; dots x=4593/y=3818; D3 B10 a 9.198 b 7.644"),
legs=dict(B2=dict(leg=1950, dir="up", at="Y ends"), B6=dict(leg=1950, dir="up", at="X ends"),
B5=dict(leg=200, dir="down"), B7=dict(leg=200, dir="up"),
B1=dict(hook=200, dir="down"), B3=dict(hook=200, dir="up"),
B11=dict(leg=100, dir="down [hitl]"), B12=dict(hook=100, dir="down [hitl]")),
counts_check={k: (len(v["pos"]) if "pos" in v else sum(len(p) for p in v["levels"].values()))
for k, v in layers.items()},
)
pp = HERE / "params.json"
params = json.loads(pp.read_text(encoding="utf-8"))
params["footing_rebar"] = fr
pp.write_text(json.dumps(params, ensure_ascii=False, indent=2), encoding="utf-8")
print(json.dumps(dict(counts=fr["counts_check"], b9=len(b9), schedule=sched_rows), ensure_ascii=False))
if __name__ == "__main__":
main()