Files
Pier_v1/Code/review_pipeline/ok_cfg.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

138 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import json, re, os
SCR = r"C:\Users\User\AppData\Local\Temp\claude\D--Rhino-MCP-rhino-mcp-main\f46b47bc-9105-4079-9b62-fcbee31b26ae\scratchpad"
tab = json.load(open(SCR + r"\ok_table.json", encoding="utf-8"))
S = json.load(open(SCR + r"\ok_shapes.json", encoding="utf-8"))
Mo = json.load(open(SCR + r"\ok_model_dims.json", encoding="utf-8"))
IM = json.load(open(SCR + r"\ok_images.json", encoding="utf-8"))
_t = {}
for k, v in tab.items():
_t[k] = v
if k == "S4":
_t["UM"] = {"dia": "H22", "L": 4504.0, "n": 92, "tot": 414.368}
tab = _t
D = {}
for e in S:
D.setdefault(e["mark"], e)
HALF = ("P3", "P4")
J = {"C1": "1.510", "C2": "1.510", "C3": "1.510", "C4": "1.510", "C5": "1.510", "C6": "1.510", "C7": "1.050",
"B1": "1.530", "B2": "1.070", "B3": "1.530", "B4": "1.070", "B5": "1.530", "B6": "1.070", "B7": "1.530", "B8": "1.070",
"B10": "0.560×6", "B11": "0.560", "B12": "0.560", "C14": "0.550×4", "C16": "0.550×4", "C17": "0.550"}
KDS = {"C8": "H25", "C9": "H25", "C10": "H25", "C11": "H25", "C12": "H25", "C13": "H25", "C14": "H22", "C16": "H22",
"B9": "H19", "B10": "H19", "B11": "H19", "B12": "H19", "C18": "H19", "C19": "H19", "C20": "H19", "S1": "H19", "S2": "H19"}
KDS_TXT = {"H25": "[M-7] H25 굽힘 내면지름 87.0 < 3.5db 88.9 (1.9 mm 부족).", "H22": "[M-7] H22 굽힘 내면지름 76.8 < 77.7 (0.9 mm 부족).",
"H19": "[M-7] H19 굽힘 내면지름 66.5 < 66.85 (0.35 mm 부족)."}
V = {}
for mk in ("C1", "C2", "C3", "C4", "C5", "C6"):
d = {"C1": "-19.630", "C2": "-19.630", "C3": "-19.630", "C4": "-18.120", "C5": "-18.120", "C6": "-18.120"}[mk]
V[mk] = ("차이 (j)", "[M-2] 모델 설계길이 = a+b+c (재료표 L 은 j 1.510 포함). 모델 총길이 %s m." % d, "도면↔모델")
V["C7"] = ("차이", "[M-3] 바깥 2본(y ±1525) 형상 다름(a·e 606 없음, b·d 4.309). [M-2] j 1.050 제외. 모델 총길이 -17.940 m.", "도면↔모델")
for mk in ("B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8"):
V[mk] = ("일치 (j 형상 없음)", "a·b 일치, 설계길이 = 재료표 L. [M-2] j %s 는 모델 형상에 없음." % J[mk], "도면↔모델")
V["B9"] = ("일치 (경미)", "철근상세 a 586~548 범위 ↔ 모델 567 단일 (재료표 L 4.763 은 567 기준). 길이·본수 일치.", "일치")
V["B10"] = ("일치 (경미)", "a·b 9.448 ↔ 모델 9.445 (3 mm). [M-2] j 0.560×6 은 모델 형상에 없음.", "도면↔모델")
V["B11"] = ("일치 (j 형상 없음)", "a·b 일치. [M-2] j 0.560 은 모델 형상에 없음.", "도면↔모델")
V["B12"] = V["B11"]
for mk in ("C8", "C9", "C10", "C11", "C12", "C13"):
V[mk] = ("차이", "[M-4] 철근상세 a·c(630)·d 가 모델 폐합 형상과 다름, 재료표 L 은 b 평균 기준, 모델은 철근마다 b 가 달라 길이 개별.", "도면↔모델")
V["C14"] = ("차이", "[M-5] a 도면 10.475~3.496 = 모델 +54, b 3.207 단일 ↔ 모델 변화. [M-2] j 0.550×4 는 형상에 없음.", "도면↔모델")
V["C16"] = ("차이", "[M-5] a 11.804 = 모델 11.750 +54, b 3.207 ↔ 모델 3.160. [M-2] j 0.550×4 는 형상에 없음.", "도면↔모델")
V["C15"] = ("차이", "[M-5] 모델 직선 3.442~10.421, 도면 b 188 · c 140 끝 갈고리 없음.", "도면↔모델")
V["C17"] = ("차이", "[M-5] 모델 직선 11.750, 도면 a 11.794 · b 188 · c 140 갈고리 없음. j 0.550 형상 없음.", "도면↔모델")
V["C18"] = ("차이", "[M-6] 도면 a 3.050 단일 ↔ 모델 a 3.207/3.126/2.565 (총길이 +14.302 m).", "도면↔모델")
V["C19"] = ("일치", "a 2.226 · b 370 일치.", "일치")
V["C20"] = ("일치 (경미)", "a 2.721~2.472 범위가 모델과 일치, 평균 3.008 ↔ 재료표 L 2.967 (총길이 +3.095 m).", "일치")
V["P1"] = ("일치", "a 8.313 · b 424(호) · c 500 · r 270 일치.", "일치")
V["P2"] = V["P1"]
V["P3"] = ("일치 (각도 미확인)", "a 3.533 · b 80 일치(반원 2조각 = 1본 환산). [M-8] 이음 각도 도면에 없음.", "미확인")
V["P4"] = ("일치 (각도 미확인)", "a 3.538 · b 65 일치(반원 2조각 = 1본 환산). [M-8] 이음 각도 도면에 없음.", "미확인")
V["P5"] = ("미확인", "a 160 · b 2.341 일치, 끝 길이 c 141 · d 80 이 모델(150 / 갈고리 90°·135°)과 정의가 달라 확인 불가.", "미확인")
V["S1"] = ("일치", "a 2.629 · b 700 일치.", "일치")
V["S2"] = ("일치", "a 1.262 · b 700 일치.", "일치")
for mk in ("S3", "S4", "S5", "S6", "S7", "S8"):
V[mk] = ("일치", "길이·본수 일치.", "일치")
V["UM"] = ("모델 없음", "[M-1] 기초 조립용 철근. 모델에 0본.", "도면↔모델")
def m3(x):
return "%.3f" % (x / 1000.0)
rows = []
last_dia = None
n = 0
tot_t = 0.0
tot_m = 0.0
for mk, t in tab.items():
n += 1
verdict, note, kind = V[mk]
if mk in KDS:
note = note + " " + KDS_TXT[KDS[mk]]
m = Mo.get(mk)
d = D.get(mk)
dd = list(d["dims"]) if d else []
if mk in ("C1", "C2", "C3", "C4", "C5", "C6", "C8", "C10", "C12"):
dd = [x for x in dd if not x.startswith("r=")]
if mk == "C7" and d:
dd += d["dims2"]
detail = " ".join(dd) if d and dd else ("(철근상세 치수 없음: 직선)" if mk in ("S3", "S4", "S7", "S8") else "-")
if mk == "UM" and d:
detail = " ".join(d["dims"])
if m:
k = 2 if mk in HALF else 1
cnt = m["n"] // k
dl = [x * k for x in m["dl"]]
mean = sum(dl) / len(dl)
tot = sum(dl) / 1000.0 / k
tot = sum(m["dl"]) / 1000.0
model = "N %d · 설계길이 %s m" % (cnt, m3(mean)) if min(dl) == max(dl) else "N %d · 설계길이 %s~%s m (평균 %s)" % (cnt, m3(min(dl)), m3(max(dl)), m3(mean))
model += " · 총 %.3f m" % tot
vals = m["values"]
if mk not in HALF and vals:
sv = [str(int(x)) for x in vals[:6]]
model += " · 꼭짓점 치수 " + "/".join(sv) + ("…" if len(vals) > 6 else "")
tot_m += tot
else:
model = "모델 없음 (0본)"
tot_t += t["tot"]
if t["dia"] not in ('"', None):
last_dia = t["dia"]
dia = Mo[mk]["dia"] if mk in Mo else last_dia
table = "L %s × N %d = %.3f m" % (m3(t["L"]), t["n"], t["tot"])
rows.append(dict(no=str(n), mark=mk, item="형상·길이·본수 (%s)" % dia, table=table, detail=detail, model=model, verdict=verdict, note=note, kind=kind))
items = [
dict(code="M-1", mark="UM", content="UM(H22, 기초 조립용 철근) 92본 모델에 없음", cmp="재료표·철근상세 ↔ 모델", diff="L 4.504 m × 92본 = 414.368 m 누락", drawing_side="상세·재료표에 있음 (a 200 · b 1.952 · c 200, 70° 사각 설치). 배치 위치·간격은 예시도뿐", action="모델에 넣을지 판단 필요 (운곡교 UA1 과 같은 유형)", kind="도면↔모델", image=IM["M-1"]),
dict(code="M-2", mark="C1~C7, B1~B8, B10~B12, C14·C16·C17", content="j(겹침) 길이가 재료표 L 에만 있고 모델 형상에는 없음. C1~C7 은 모델 설계길이에도 j 제외", cmp="재료표 L = a+b+c+j ↔ 모델 a+b+c", diff="C1~C6 총길이 -113.25 m, C7 -17.94 m. 그 외 마크는 설계길이 포함, 형상에서만 j 만큼 짧음(합 약 600 m)", drawing_side="j 는 상세의 작은 박스로만 표시, 작도 위치 없음", action="형상에 넣을지 가산 길이로만 둘지 판단. C1~C7 만 설계길이에서 j 가 빠진 점 확인", kind="도면↔모델", image=IM["M-2"]),
dict(code="M-3", mark="C7", content="C7 바깥 2본(y ±1525) 형상이 도면(13본 동일)과 다름", cmp="철근상세 C7 ↔ 모델", diff="a·e 606 없음, b·d 4.309 (도면 4.774), 길이 11.280 (나머지 13.424)", drawing_side="N=13 에 형상 하나, L 14.474", action="바깥 2본을 도면 형상대로 맞출지, 의도된 단축인지 확인", kind="도면↔모델", image=IM["M-3"]),
dict(code="M-4", mark="C8~C13", content="스터럽 폭 a(2.057 ↔ 2.103)와 끝 길이 c 630 이 모델 폐합 형상과 다름", cmp="철근상세 ↔ 모델", diff="총길이 C8 -40.8, C9 -86.6, C10 -30.6, C11 -24.4, C12 -41.8, C13 -35.0 m (합 -259 m)", drawing_side="재료표 L 은 b 범위 평균 기준(예 C8 9.570 = 2×2.057 + 2×2.098 + 2×0.630)", action="c 630(겹침·갈고리) 모델 반영 여부, a 2.057 ↔ 2.103 어느 쪽이 맞는지 판단", kind="도면↔모델", image=IM["M-4"]),
dict(code="M-5", mark="C14~C17", content="루프 a 가산 54, b 단일 3.207 ↔ 모델 변화, C15·C17 끝 갈고리(b 188 · c 140) 없음", cmp="철근상세 ↔ 모델", diff="총길이 C14 -22.5, C15 -23.0, C16 -14.4, C17 -30.0 m", drawing_side="C14 a 10.475~3.496, b 3.207, j 0.550×4 / C15 b 188 · c 140", action="갈고리·j 반영 여부, b 단일값 ↔ 모델 변화 판단", kind="도면↔모델", image=IM["M-5"]),
dict(code="M-6", mark="C18", content="a 3.050 단일값 ↔ 모델 3종 (3.207 / 3.126 / 2.565)", cmp="철근상세 ↔ 모델", diff="총길이 +14.302 m (모델 457.732 / 재료표 443.430)", drawing_side="a 3.050 · b 370 · L 3.790 · 117본", action="모델의 개별 길이가 의도인지 확인", kind="도면↔모델", image=IM["M-6"]),
dict(code="M-7", mark="C8~C13, C14·C16, B9~B12, C18~C20, S1·S2", content="굽힘 내면지름: H25 87.0 < 88.9, H22 76.8 < 77.7, H19 66.5 < 66.85 (3.5db)", cmp="KDS 24 14 21 표 4.5-1 ↔ 모델", diff="1.9 / 0.9 / 0.35 mm 부족", drawing_side="도면에 내면반지름 표기 없음", action="모델 R 을 KDS 기준으로 키울지 결정", kind="기준↔모델", image=IM["M-7"]),
dict(code="M-8", mark="P3, P4", content="링 이음(커플러) 각도·위치 도면에 기준 없음 (모델 90°/270° 가정)", cmp="도면 없음 ↔ 모델 가정", diff="-", drawing_side="철근상세 a·b 뿐, 방향·엇갈림 없음", action="각도 기준 확인 (설계자)", kind="미확인", image=IM["M-8"]),
]
cfg = dict(
bridge="옥성교 P1",
title="옥성교 P1 철근 도면 ↔ 모델 일치 검토 (불일치 종류별 분류)",
purpose="목적: 도면(재료표·철근상세)과 라이노 모델이 일치하는지가 최우선. 범위는 모델↔도면 (도면 내부 불일치는 따로 보관). 작성 2026-10-19, 검토 미확정 초안. 기준: KDS 24 14 21.",
sheet1_desc="도면에 기준이 있거나 없는데 모델이 다르게 만들어진 항목 (M-n). 캡처: 위 도면(철근상세·재료표) / 아래 모델(라이노).",
items=items, rows=rows,
unchecked=[
dict(item="코핑·기둥·기초 철근 위치", content="정면도·단면도의 철근 높이·간격·피복(점 좌표)과 모델 위치 대조", note="재료표·철근상세(형상·길이·본수) 대조만 완료", status="미검토"),
dict(item="받침 세트 10개", content="받침대좌·패드·교량받침·솔플레이트 (ELEVATION TABLE · 솔플레이트 TABLE) 모델 대조", note="선행 보고서 G5 183/183 PASS (표 값 기준)", status="미검토"),
dict(item="코핑 철근 간 간섭", content="철근끼리 교차·관통", note="사용자 지시로 제외 (검토 단계)", status="제외"),
dict(item="P5 갈고리 c 141 · d 80", content="철근상세의 끝 길이 정의가 모델(90°·135° 갈고리)과 맞춰지지 않음", note="도면으로 확인 불가", status="확인 불가"),
],
basis=[
dict(item="입력 파일", content="모델: 옥성교P1_G5.3dm (원본 그대로), 도면: 옥성교P1.dwg → 옥성교P1.dxf (라이노 변환)"),
dict(item="재료표", content="DXF 레이어 CS-TABL-TEX2 의 글자를 x(열)·y(행)로 읽음 (번호 x≈715129, 직경 715879, 길이 717004, 개수 717629, 총길이 719004). 재료표에는 A~J 치수 열이 없음 — 치수는 '철근상세'(레이어 CS-TEXT, 형상 도해 옆 L= N= a= b= c= j=)에서 읽음"),
dict(item="모델 치수", content="중심선(P1-RC-*)의 직선 구간을 연장한 꼭짓점 사이 거리(각진 치수)로 환산. P1·P2·P3·P4 는 호 길이/접선 길이로 비교. P3·P4 는 반원 2조각 = 1본으로 환산"),
dict(item="길이 비교", content="모델 철근의 설계길이(user string design_length + coupler_length)와 재료표 L·총길이를 대조. 형상 실길이(중심선)는 굽힘으로 약간 짧아 비교하지 않음"),
dict(item="KDS 계산", content="내면지름 = 2×(중심선 R − 공칭 db/2). H25 R 56.2 → 87.0, H22 49.5 → 76.8, H19 42.8 → 66.5, H29 65.2 → 101.8, H32 72 → 112.2, H16 24 → 32.1, H13 해당 없음. 기준: D19 이상 3.5db, D16 이하 2db (KDS 24 14 21 표 4.5-1)"),
dict(item="재료표 총계", content="도면 총계 13806.206 m (소계 합). 모델 설계길이 합 %.3f m (UM 제외 시 도면 %.3f m)" % (tot_m, tot_t - tab["UM"]["tot"])),
],
)
json.dump(cfg, open(SCR + r"\ok_cfg.json", "w", encoding="utf-8"), ensure_ascii=False, indent=1)
print(len(rows), tot_t, tot_m)