Files
Pier_v1/Code/운곡교P2판독/extract_r2.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

113 lines
5.4 KiB
Python

"""R2 (column rebar) reading of the Ungok P2 drawings -> data/운곡교p2 params.column_rebar / rebar_marks(P*) /
expected.G2.
Findings (D1 front view + sections C-C/D-D/E-E, D3 schedule):
- sections identical to P1 drawing: main bars r 870.5 / 825.5 (46 div, start 0.001 deg), hoop arc 897.5 drawn
- D3: P4/P5 R904 (H29, coupler gap 85), P3 R899 (H19), P1 A 16.343, P2 16.683, P3 37 pcs
- D1 labels 'P4 H29@100', 'P5 H29@100', chain '150','1.030','8@120','22@120','37@300=11.100', ties '8@1.800'
- front view: P2 bottom = footing bottom + 300 (214CA), P1 leg at +300 with R340 / leg 500 (214CB/214CC)
Rules reused from P1 (HITL H1/H2): main radii = section CAD, hoop radius = schedule R, bar tops = schedule.
"""
import json
import shutil
import sys
import time
from pathlib import Path
HERE = Path(__file__).resolve().parent
APP = HERE.parent / "교각모델링앱"
PIER = APP / "data" / "운곡교p2"
sys.path.insert(0, str(APP))
from engine import reader # noqa: E402
FB = 25123 # footing bottom (R1)
def schedule():
texts = json.loads((PIER / "drawings" / "texts.json").read_text(encoding="utf-8"))
out = {}
for t in reader.table_candidates(texts):
if not t["key"].startswith("schedule"):
continue
last = None
for _, r in reader.table_records(t["rows"], lambda s: bool(reader.MARK_RE.match(s))):
dia = r.get("직경", "")
last = last if dia in ('"', "") else dia
r["_dia"] = last
out[r["_key"]] = r
return out
def chain(start, groups, base):
z = base + sum(start)
pts = [z]
for n, p in groups:
for _ in range(n):
z += p
pts.append(z)
return pts
def main():
S = schedule()
P = json.loads((PIER / "params.json").read_text(encoding="utf-8"))
E = json.loads((PIER / "expected.json").read_text(encoding="utf-8"))
stamp = time.strftime("%Y%m%d_%H%M%S")
for f in ("params.json", "expected.json"):
shutil.copy2(PIER / f, PIER / "backup" / f"{Path(f).stem}_before_R2_{stamp}.json")
sch = {}
for m in ("P1", "P2", "P3", "P4", "P5", "P6"):
r = S[m]
d = {"mark": m, "shape": r["형식"], "dia": r.get("직경", ""), "n": r["개수"], "L": r["길이"]}
for k in ("A", "B", "C", "R"):
if k in r:
d[k] = r[k]
sch[m] = d
groups = [[8, 120], [22, 120], [37, 300]]
levels = chain([150, 1030], groups, FB)
marks = ["P4"] * 9 + ["P5"] * 22 + ["P3"] * 37
ties = chain([150, 1030], [[8, 1800]], FB)
a1, a2 = float(S["P1"]["A"]) * 1000, float(S["P2"]["A"]) * 1000
cr = P["column_rebar"]
cr["_note"] = "Column rebar P1-P6 (Ungok P2). Z = EL x 1000. Angles from +X counter-clockwise (plan)."
cr["schedule"] = sch
mb = cr["main_bars"]
mb["p1"].update({"hook_leg_z": FB + 300, "straight_from": FB + 300 + 340, "straight_len": round(a1)})
mb["p2"].update({"z0": FB + 300, "length": round(a2)})
mb["src"] = {"radii": "D1 단면 C-C/D-D/E-E dots 870.5 / 825.5 (46 each, start 0.001 deg) = P1 drawing (HITL H2 rule)",
"bottom": "D1 정면도 214CA bottom = footing bottom + 300; 214CB leg 500, 214CC R340",
"top": "D3 schedule A (P1 16.343, P2 16.683) -> top EL 42.106 both (P1 rule H1)"}
cr["hoops"] = {"radius": 904, "radius_by_mark": {"P3": 899}, "levels": levels, "marks": marks,
"src": {"levels": "D1 정면도 '150','1.030','8@120=960','22@120=2.640','37@300=11.100'; front dots 1180 + 120n",
"radius": "D3 R: P4/P5 904 (2*pi*904 = 5680 = L), P3 899 (pi*899 = A 2.824); "
"section arc drawn 897.5 = P1 drawing not updated -> schedule adopted (P1 rule H2)"}}
cr["ties"].update({"levels": ties, "src": {"levels": "D1 정면도 '150','1.030','8@1.800=14.400'",
"angles": "D1 단면 tie lines 0/45/90/135 (1795 drawn), D3 P6 A 1.836 / B 150"}})
for m, r in sch.items():
P["rebar_marks"][m] = {"dia": S[m]["_dia"], "shape": r["shape"]}
dia = {m: int(S[m]["_dia"][1:]) for m in sch}
E["G2"] = {
"schedule_L": {m: round(float(S[m]["길이"]) * 1000) for m in sch},
"schedule_n": {m: int(S[m]["개수"]) for m in sch},
"dia": dia,
"hoop_chain": {"start": [150, 1030], "groups": groups},
"hoop_marks_by_zone": [["P4", 9], ["P5", 22], ["P3", 37]],
"tie_chain": {"start": [150, 1030], "groups": [[8, 1800]]},
"tie_offset": dia["P4"] / 2 + dia["P6"] / 2,
"r_outer": 870.5, "r_inner": 825.5, "r_hoop": 904,
"main_divisions": 46, "bottom_above_footing": 300,
"p1_top_parts": [300, int(S["P1"]["R"]), round(a1)],
"no_fillet_marks": ["P1", "P2", "P4", "P5"],
"src": "D3 L·수량·R·A (Ungok P2); D1 '150','1.030','8@120=960','22@120=2.640','37@300=11.100','8@1.800=14.400'; "
"section radii (HITL H2 rule); tie offset = H29/2 + H16/2 (hoop P4 H29 label, P6 H16)",
}
(PIER / "params.json").write_text(json.dumps(P, ensure_ascii=False, indent=1), encoding="utf-8")
(PIER / "expected.json").write_text(json.dumps(E, ensure_ascii=False, indent=1), encoding="utf-8")
print("levels", len(levels), levels[0], levels[-1], "ties", ties[0], ties[-1])
print("marks dia", {m: P["rebar_marks"][m] for m in sch})
print("schedule L", E["G2"]["schedule_L"], "n", E["G2"]["schedule_n"])
if __name__ == "__main__":
main()