- 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>
138 lines
13 KiB
Python
138 lines
13 KiB
Python
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)
|