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

93 lines
8.9 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 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)