- 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>
93 lines
8.9 KiB
Python
93 lines
8.9 KiB
Python
import sys, os, json
|
||
SCR = r"C:\Users\User\AppData\Local\Temp\claude\D--Rhino-MCP-rhino-mcp-main\f46b47bc-9105-4079-9b62-fcbee31b26ae\scratchpad"
|
||
sys.path.insert(0, SCR)
|
||
sys.path.insert(0, SCR + r"\pylib")
|
||
from PIL import Image
|
||
import compose_new as C
|
||
|
||
CR = SCR + r"\sw_crops"
|
||
SH = SCR + r"\shots"
|
||
OUT = r"D:\★Pier 자료\심수석님 검토 파일\검토_산외교P1\도면↔모델_불일치_시각자료"
|
||
os.makedirs(OUT, exist_ok=True)
|
||
|
||
|
||
def stack(names, out):
|
||
ims = [Image.open(CR + "\\" + n + ".png").convert("RGB") for n in names]
|
||
w = max(i.width for i in ims)
|
||
h = sum(i.height for i in ims)
|
||
m = Image.new("RGB", (w, h), (34, 40, 49))
|
||
y = 0
|
||
for i in ims:
|
||
m.paste(i, (0, y))
|
||
y += i.height
|
||
m.save(CR + "\\" + out + ".png")
|
||
|
||
|
||
def cr(n): return CR + "\\" + n + ".png"
|
||
def sh(n): return SH + "\\" + n + ".png"
|
||
|
||
|
||
stack(["row_head400", "row_C1", "row_C2", "row_C3", "row_C4", "row_C5", "row_C6"], "tab_C1")
|
||
stack(["row_head400", "row_C7", "row_C8", "row_C9", "row_C10", "row_C11", "row_C12", "row_C13"], "tab_C7")
|
||
stack(["row_head400", "row_C10", "row_C11"], "tab_C10")
|
||
stack(["row_head400", "row_C14", "row_C15"], "tab_C14")
|
||
stack(["row_head500", "row_B8"], "tab_B8")
|
||
stack(["row_head500", "row_P1"], "tab_P1")
|
||
stack(["row_head400", "row_P3", "row_P4"], "tab_P3")
|
||
stack(["row_head400", "row_C12", "row_C13"], "tab_C12")
|
||
|
||
items = []
|
||
items.append(dict(code="M-1", title="일부 철근이 재료표 단일값보다 짧음", subtitle="C1~C6·C14·C15: 재료표 A·B·D 는 단일값 ↔ 모델은 철근마다 길이가 다름 (C1 A 8.462~9.259)", color=C.ORANGE,
|
||
panels=[dict(label="도면 재료표 C1~C6 · 형상 IX (C1~C4) · IV (C5·C6)", color=C.BLUE, maxh=480,
|
||
images=[dict(path=cr("shape_IX"), cap="형상 IX: a(사선) · b · c · x1 x2"), dict(path=cr("tab_C1"), cap="재료표: C1 A 9.259 · B 1.364 · C 1.369 (13본 동일)")]),
|
||
dict(label="모델 (라이노) 정면도 방향 · C1 + 코핑", color=C.ORANGE, maxh=520,
|
||
images=[dict(path=sh("S1"), cap="C1 y+1500: A 8.462 (짧음)"), dict(path=sh("S1b"), cap="C1 y+1000: A 9.259 (도면)")])],
|
||
rows=[("차이", "C1: 13본 중 9본 A 9.259, 2본 9.204, 2본 8.462. C2 A 9.297 ↔ 8.501~9.297, C3·C4·C5(B 3.580~4.018)·C6·C14(A 2.633~3.000)·C15(A 4.118~4.517)도 같은 유형."),
|
||
("도면 쪽", "재료표는 마크당 값 하나 (13본 동일 표기)."),
|
||
("조치", "코핑 형상에 맞춘 의도된 단축인지, 도면 단일값대로 맞출지 확인 필요.")]))
|
||
items.append(dict(code="M-2", title="J·C 길이가 재료표 L 에만 있고 모델 형상에는 없음", subtitle="재료표 L = A+B+C+J (C1 9.259+1.364+1.369+J 1.560 = 13.551) ↔ 모델 철근 형상은 J 제외 (11.992)", color=C.ORANGE,
|
||
panels=[dict(label="도면 형상 III (j 칸) · 재료표 C10~C13", color=C.BLUE, maxh=480,
|
||
images=[dict(path=cr("shape_III"), cap="형상 III: a · b · j(작은 박스)"), dict(path=cr("tab_C7"), cap="재료표 C7~C13 (J 열)")]),
|
||
dict(label="모델 (라이노) C1 정면 · C10 평면", color=C.ORANGE, maxh=520,
|
||
images=[dict(path=sh("S1b"), cap="C1: 1.364+9.259+1.369 = 11.992 (J 1.560 없음)"), dict(path=sh("S4"), cap="C10 폐합 루프: J 660 없음")])],
|
||
rows=[("차이", "J: C1~C4 1.560, C5·C6 0.940, C7~C9 C 660×2, C10·C12·C13 0.660, P2 0.380, B2·B5 1.000, B8 0.570. 모델 설계길이(user string)는 재료표 L 과 같지만 중심선 형상은 그만큼 짧음 (C1 형상 평균 11.822 m < L 13.551 m)."),
|
||
("조치", "J 를 형상에 넣을지(겹침·갈고리 길이) 가산 길이로만 둘지 판단 필요.")]))
|
||
items.append(dict(code="M-3", title="C7~C13 치수 가산(+54/+44/+99) 산식", subtitle="재료표 A·C·L 은 대푯값·가산값(a = (1.250×2ea + 2.000×1ea)/3ea + 주철근D + 수직스터럽D) ↔ 모델은 철근마다 작도값", color=C.ORANGE,
|
||
panels=[dict(label="도면 형상 II 와 NOTE · 재료표 C7~C13", color=C.BLUE, maxh=480,
|
||
images=[dict(path=cr("shape_II"), cap="형상 II + NOTE (a 산식)"), dict(path=cr("tab_C7"))]),
|
||
dict(label="모델 (라이노) 측면(Y-Z) · C7 1본 + 코핑", color=C.ORANGE, maxh=520, images=[dict(path=sh("S3"), cap="C7 (모델): 작도 폭 2.000 → 재료표는 +54")])],
|
||
rows=[("차이", "C7~C9: A 1.554 · C 660 단일 ↔ 모델 A 0.953~2.000 · C 0.477~1.000, L 평균 -0.027/-0.018/-0.027 m. C11·C12·C13 은 재료표 = 모델 +44/+54/+99 로 일치 확인 (가산 규칙)."),
|
||
("조치", "가산 규칙의 적용 범위 확인 (운곡교 M-5 와 같은 유형).")]))
|
||
items.append(dict(code="M-4", title="C10 재료표 A 최대 9.570 에 대응하는 철근 없음", subtitle="재료표 C10: A 9.570~3.393 (7본) ↔ 모델 A 최대 8.687 (8.633 + 54)", color=C.ORANGE,
|
||
panels=[dict(label="도면 형상 III · 재료표 C10·C11", color=C.BLUE, maxh=480, images=[dict(path=cr("shape_III")), dict(path=cr("tab_C10"))]),
|
||
dict(label="모델 (라이노) 평면 · C10 폐합 루프 7개 + 코핑", color=C.ORANGE, maxh=520, images=[dict(path=sh("S4"), cap="C10 7본: A 3.339~8.633")])],
|
||
rows=[("차이", "재료표 A 최대 9.570 ↔ 모델 최대 8.687, 설계길이 합 -6.178 m (L 21.711 대표값 ↔ 모델 평균 20.828)."),
|
||
("조치", "최대 폭 9.570 에 해당하는 루프가 있는지 확인 필요.")]))
|
||
items.append(dict(code="M-5", title="B8 사각 7.345 × 7.345 ↔ 재료표 A 7.300 · B 7.350", subtitle="기초 둘레 폐합근 B8 (H16, 7본)", color=C.ORANGE,
|
||
panels=[dict(label="도면 재료표 B8 · 형식 V 도해", color=C.BLUE, maxh=480, images=[dict(path=cr("shape_V")), dict(path=cr("tab_B8"))]),
|
||
dict(label="모델 (라이노) 평면 · B8 + 기초", color=C.ORANGE, maxh=520, images=[dict(path=sh("S5"), cap="B8 모델: 7.345 × 7.345")])],
|
||
rows=[("차이", "모델 7.345 × 7.345 ↔ 재료표 A 7.300 · B 7.350 (L 31.581 = 2A+2B+4J, 모델 중심선 29.339 m)."),
|
||
("조치", "작도 ±3.672.5(7.345)와 재료표 값 중 어느 쪽이 맞는지 확인.")]))
|
||
items.append(dict(code="M-6", title="주철근 커플러 476개 모델에 없음", subtitle="재료표 아래 커플러 표: 주철근 커플러 개수 476 (H32) ↔ 모델 P1 은 커플러 없이 연속 28.545 m", color=C.ORANGE,
|
||
panels=[dict(label="도면 커플러 개수 표 · 재료표 P1", color=C.BLUE, maxh=420, images=[dict(path=cr("coupler_cnt"), cap="주철근 476 · 띠철근 49"), dict(path=cr("tab_P1"), cap="P1 H32 L 28.545 × 68")]),
|
||
dict(label="모델 (라이노) 기둥 주철근 P1 (68본 연속)", color=C.ORANGE, maxh=620, images=[dict(path=sh("S6"))])],
|
||
rows=[("차이", "표의 커플러 476개(68본 × 7 로 추정)가 모델에는 없고 P1 이 연속 철근. 띠철근 커플러 49개는 P3 24 + P4 25 로 모델과 일치."),
|
||
("조치", "주철근 커플러 위치·개수를 모델에 반영할지 판단.")]))
|
||
items.append(dict(code="M-7", title="굽힘 내면지름 H22·H19 KDS 3.5db 미달", subtitle="KDS 24 14 21 표 4.5-1: 내면지름 ≥ 3.5db · 도면에는 내면반지름 표기 없음", color=C.DYEL,
|
||
panels=[dict(label="모델 (라이노) C7 스터럽 모서리 확대", color=C.DYEL, maxh=560, images=[dict(path=sh("S7"), cap="C7 (H22) 굽힘: 중심선 R 49.5 → 내면지름 76.8")])],
|
||
rows=[("계산", "H22 (B2·B5·C7~C10·C15): 76.8 < 3.5×22.2 = 77.7 (0.9 mm 부족). H19 (P5): 66.5 < 66.85 (0.35 부족). H32 112.2 ≥ 111.3, H16 32.1 ≥ 2db 31.8, H13 26.3 ≥ 25.4 는 충족."),
|
||
("조치", "모델 R 을 KDS 기준으로 키울지 결정 (기준↔모델).")]))
|
||
items.append(dict(code="M-8", title="P3·P4 이음(커플러) 각도·위치 — 도면 기준 없음", subtitle="형상 V·X 도해의 COUPLER 위치(상·하) 뿐, 각도·엇갈림 표기 없음 ↔ 모델 90°/270° 가정", color=C.GREY,
|
||
panels=[dict(label="도면 형상 V (P3) · X (P4) · 재료표 P3·P4", color=C.BLUE, maxh=420, images=[dict(path=cr("shape_V")), dict(path=cr("shape_X")), dict(path=cr("tab_P3"))]),
|
||
dict(label="모델 (라이노) 평면 · P3·P4 링 (이음 틈)", color=C.GREY, maxh=520, images=[dict(path=sh("S8"))])],
|
||
rows=[("내용", "도면은 커플러 위치를 도해로만 보이고 단마다의 엇갈림 각도가 없어 모델이 임의 위치에 둠 (P3 55, P4 55)."),
|
||
("조치", "각도 기준 확인 필요 (설계자).")]))
|
||
names = {"M-1": "M-1_일부철근짧음", "M-2": "M-2_J길이_미작도", "M-3": "M-3_C7-C13_가산산식", "M-4": "M-4_C10_A최대", "M-5": "M-5_B8_정사각",
|
||
"M-6": "M-6_주철근커플러476", "M-7": "M-7_굽힘내면지름", "M-8": "M-8_P3P4_이음각도"}
|
||
res = {}
|
||
for it in items:
|
||
it["out"] = OUT + "\\" + names[it["code"]] + ".png"
|
||
res[it["code"]] = it["out"]
|
||
print(it["code"], C.make(it))
|
||
json.dump(res, open(SCR + r"\sw_images.json", "w", encoding="utf-8"), ensure_ascii=False)
|