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

102 lines
11 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
sys.path.insert(0, r"C:\Users\User\AppData\Local\Temp\claude\D--Rhino-MCP-rhino-mcp-main\f46b47bc-9105-4079-9b62-fcbee31b26ae\scratchpad")
sys.path.insert(0, r"C:\Users\User\AppData\Local\Temp\claude\D--Rhino-MCP-rhino-mcp-main\f46b47bc-9105-4079-9b62-fcbee31b26ae\scratchpad\pylib")
from PIL import Image
import compose_new as C
SCR = r"C:\Users\User\AppData\Local\Temp\claude\D--Rhino-MCP-rhino-mcp-main\f46b47bc-9105-4079-9b62-fcbee31b26ae\scratchpad"
CR = SCR + r"\ok_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")
return CR + "\\" + out + ".png"
def cr(n): return CR + "\\" + n + ".png"
def sh(n): return SH + "\\" + n + ".png"
tabs = {
"tab_UM": ["row_head", "row_UM"],
"tab_C1": ["row_head", "row_C1", "row_C2", "row_C3", "row_C4", "row_C5", "row_C6"],
"tab_C7": ["row_head", "row_C7"],
"tab_C8": ["row_head", "row_C8", "row_C9", "row_C10", "row_C11", "row_C12", "row_C13"],
"tab_C14": ["row_head", "row_C14", "row_C15", "row_C16", "row_C17"],
"tab_C18": ["row_head", "row_C18", "row_C19", "row_C20"],
}
for k, v in tabs.items():
stack(v, k)
items = []
items.append(dict(code="M-1", title="UM 기초 조립용 철근 모델 누락", subtitle="도면 철근상세·재료표: UM H22 L 4.504 m × 92본 (총 414.368 m) ↔ 모델: UM 없음 (0본)", color=C.ORANGE,
panels=[dict(label="도면 기초 조립용 철근 상세 · 재료표 UM 행", color=C.BLUE, maxh=520,
images=[dict(path=cr("um_detail"), cap="기초 조립용 철근 상세 (70° 사각 설치, 예시도)"), dict(path=cr("tab_UM"), cap="재료표 UM 행: L 4.504 · N 92 · 총 414.368")]),
dict(label="모델 (라이노) 기초 철근 B1~B12 — UM 없음", color=C.ORANGE, maxh=620, images=[dict(path=sh("O1"))])],
rows=[("차이", "모델에 UM(H22) 마크가 없음. 도면 재료표 H22 소계 1345.896 m 중 UM 414.368 m 가 모델 총길이에서 빠짐."),
("도면 쪽", "철근상세는 형상(a 200 · b 1.952 · c 200)과 '70° 사각 설치' NOTE 만 있고, 92본의 배치 위치·간격 근거는 예시도뿐."),
("조치", "UM 92본을 모델에 넣을지 판단 필요 (운곡교 UA1 과 같은 유형).")]))
items.append(dict(code="M-2", title="j 길이(겹침)가 재료표 L 에만 포함", subtitle="재료표 L = a+b+c+j ↔ 모델 철근은 a+b+c (j 형상 없음) · C1~C7 은 모델 설계길이에도 j 제외", color=C.ORANGE,
panels=[dict(label="도면 철근상세 C1 (a·b·c + j 칸) · 재료표 C1~C6", color=C.BLUE, maxh=520,
images=[dict(path=cr("cell_C1"), cap="C1: L 15.754 = 11.750 + 1.247 + 1.247 + j 1.510"), dict(path=cr("tab_C1"), cap="재료표 C1~C6 (L 15.754 / 13.460)")]),
dict(label="모델 (라이노) 정면도 방향 · C1~C6 + 코핑", color=C.ORANGE, maxh=520, images=[dict(path=sh("O2"), cap="모델 C1: 1.247 + 11.750 + 1.247 = 14.244 (j 없음)")])],
rows=[("차이", "C1~C6 모델 총길이가 재료표보다 113.25 m 짧음 (C1·C2·C3 각 -19.630, C4·C5·C6 각 -18.120), C7 -17.940. C1~C7 의 모델 설계길이(user string)도 j 를 뺀 값(14.244)."),
("다른 마크", "B1~B8(j 1.530/1.070)·B10·B11·B12(j 0.560)·C14·C16(j 0.550×4)·C17(j 0.550)은 설계길이에는 j 가 포함돼 총길이는 재료표와 같지만, 형상(중심선)은 j 만큼 짧음. 모델 형상에 없는 j 합계 약 600 m."),
("조치", "j(겹침 길이)는 도면 상세에서 작은 박스로만 표시되고 작도 위치가 없음 → 모델 형상에 넣을지, 재료표 가산 길이로만 둘지 판단 필요. C1~C7 만 설계길이에서 j 가 빠진 점은 확인 필요.")]))
items.append(dict(code="M-3", title="C7 바깥 2본의 형상이 도면과 다름", subtitle="도면 C7: a 606 · b 4.774 · c 2.662 · d 4.774 · e 606, x1·x2 162° (13본 동일) ↔ 모델 11본 일치 + 바깥 2본(y ±1525) 다름", color=C.ORANGE,
panels=[dict(label="도면 철근상세 C7 · 재료표 C7", color=C.BLUE, maxh=480, images=[dict(path=cr("cell_C7")), dict(path=cr("tab_C7"))]),
dict(label="모델 (라이노) 정면도 방향 · C7 + 코핑", color=C.ORANGE, maxh=480,
images=[dict(path=sh("O3a"), cap="바깥 2본 (y ±1525): a·e 다리 없음, b·d 4.309"), dict(path=sh("O3b"), cap="나머지 11본: 도면 형상(606 / 4.774 / 2.662)")])],
rows=[("차이", "모델 C7 13본 중 y=+1525, -1525 두 본은 끝 다리 a·e(606)가 없고 비스듬한 부분 b·d 가 4.309 (도면 4.774). 길이 11.280 (나머지 13.424)."),
("도면 쪽", "철근상세는 N=13 에 형상 하나만 표기, 길이 14.474 (j 1.050 포함)."),
("조치", "바깥 2본 형상을 도면(동일 형상)대로 맞출지, 의도된 단축인지 확인 필요.")]))
items.append(dict(code="M-4", title="C8~C13 스터럽 치수·끝 길이 c 630", subtitle="철근상세 C8: a 2.057 · b 2.808~1.388 · c 630 ↔ 모델 폐합 직사각형 a 2.103 (c 630 없음)", color=C.ORANGE,
panels=[dict(label="도면 철근상세 C8 · C9 · 재료표 C8~C13", color=C.BLUE, maxh=480,
images=[dict(path=cr("cell_C8")), dict(path=cr("cell_C9")), dict(path=cr("tab_C8"))]),
dict(label="모델 (라이노) 측면(Y-Z) · C8 · C9 각 1본 + 코핑", color=C.ORANGE, maxh=520,
images=[dict(path=sh("O4"), cap="C8 (모델): 폭 2.103, 높이 b 변화"), dict(path=sh("O4b"), cap="C9 (모델)")])],
rows=[("차이", "(1) 스터럽 폭: 철근상세 a 2.057 ↔ 모델 2.103 (+46). (2) 끝 길이 c 630(2개 합 1.260)이 모델 폐합 형상에 없음. (3) 총길이 모델-재료표: C8 -40.8, C9 -86.6, C10 -30.6, C11 -24.4, C12 -41.8, C13 -35.0 m (합 -259 m)."),
("도면 쪽", "재료표 L 은 b 범위의 평균 기준(예: C8 9.570 = 2×2.057 + 2×2.098 + 2×0.630). 모델은 철근마다 b 가 달라 길이가 6.981~9.822 로 다름."),
("조치", "c 630(겹침·갈고리)을 모델에 그릴지, a 2.057 ↔ 2.103 어느 쪽이 맞는지 판단 필요.")]))
items.append(dict(code="M-5", title="C14~C17 루프·타이: a 가산 54, b·갈고리", subtitle="C14·C16 a 모델 = 도면 -54 · b 3.207 단일 ↔ 모델 변화 · C15·C17 끝 갈고리 b 188 · c 140 이 모델에 없음 (직선)", color=C.ORANGE,
panels=[dict(label="도면 철근상세 C14~C17 · 재료표", color=C.BLUE, maxh=420,
images=[dict(path=cr("cell_C14")), dict(path=cr("cell_C15")), dict(path=cr("tab_C14"))]),
dict(label="모델 (라이노) 평면 · 정면 C14~C17 + 코핑", color=C.ORANGE, maxh=520,
images=[dict(path=sh("O5"), cap="평면: C14·C16 루프 / C15·C17 타이"), dict(path=sh("O5b"), cap="정면: C15·C17 (직선, 끝 갈고리 없음)")])],
rows=[("차이", "C14 a 도면 10.475~3.496 ↔ 모델 10.421~3.442 (-54, 가산 규칙). C14·C16 b 도면 3.207 ↔ 모델 2.343~2.974(a 에 따라 변함). C15·C17 은 모델이 직선 3.442~10.421 / 11.750, 도면은 b 188 · c 140 갈고리. 총길이 모델-재료표: C14 -22.5, C15 -23.0, C16 -14.4, C17 -30.0 m."),
("조치", "C14~C17 의 갈고리(b·c)·j 550 반영 여부와 b 단일값 ↔ 모델 변화 판단 필요.")]))
items.append(dict(code="M-6", title="C18 a 3.050 단일값 ↔ 모델 개별 길이", subtitle="철근상세 C18: a 3.050 · b 370 · L 3.790 (117본) ↔ 모델 a 3.207 / 3.126 / 2.565 (3종)", color=C.ORANGE,
panels=[dict(label="도면 철근상세 C18 · 재료표 C18~C20", color=C.BLUE, maxh=420, images=[dict(path=cr("cell_C18")), dict(path=cr("tab_C18"))]),
dict(label="모델 (라이노) 측면(Y-Z) · C18 1본 + 코핑", color=C.ORANGE, maxh=520, images=[dict(path=sh("O6"))])],
rows=[("차이", "모델 C18 은 99본 3.207, 13본 3.126, 5본 2.565. 총길이 모델 457.732 / 재료표 443.430 (+14.3 m). C20 도 a 2.721~2.472 범위와 일치하나 총길이 +3.1 m."),
("조치", "도면은 a 단일값이라 모델의 개별 길이가 의도인지 확인 필요.")]))
items.append(dict(code="M-7", title="굽힘 내면지름 H25·H22·H19 KDS 3.5db 미달", subtitle="KDS 24 14 21 표 4.5-1: 내면지름 ≥ 3.5db · 도면에는 내면반지름 표기 없음", color=C.DYEL,
panels=[dict(label="모델 (라이노) C8 스터럽 모서리 확대", color=C.DYEL, maxh=560, images=[dict(path=sh("O7"), cap="C8 (H25) 굽힘: 중심선 R 56.2 → 내면지름 87.0")])],
rows=[("계산", "H25(C8~C13): 내면지름 87.0 < 3.5×25.4 = 88.9 (1.9 mm 부족). H22(C14~C17 등): 76.8 < 77.7 (0.9 부족). H19(B9~B12·C18~C20·S1·S2): 66.5 < 66.85 (0.35 부족). H29(B1~B8) 101.8 ≥ 100.1, H32(C1~C6) 112.2 ≥ 111.3 은 충족. H16·H13 은 2db 로 충족."),
("조치", "도면에 반지름이 없어 모델 R 을 KDS 기준으로 키울지 결정 필요 (기준↔모델).")]))
items.append(dict(code="M-8", title="P3·P4 이음(커플러) 각도·위치 — 도면 기준 없음", subtitle="철근상세 P3 a 3.533 · b 80, P4 a 3.538 · b 65 ↔ 모델은 반원 2조각의 90°/270° 위치로 가정", color=C.GREY,
panels=[dict(label="도면 철근상세 P3 · P4 (이음 위치·각도 표기 없음)", color=C.BLUE, maxh=420, images=[dict(path=cr("cell_P3")), dict(path=cr("cell_P4"))]),
dict(label="모델 (라이노) 평면 · P3·P4 링 (이음 틈 2곳)", color=C.GREY, maxh=520, images=[dict(path=sh("O8"))])],
rows=[("내용", "철근상세에 링 이음의 방향·엇갈림이 없어 모델이 임의로 90°/270° 에 커플러(P3 80, P4 65)를 둠. 도면으로 확인 불가."),
("조치", "각도 기준 확인 필요 (설계자).")]))
names = {"M-1": "M-1_UM_조립철근누락", "M-2": "M-2_j길이_미작도", "M-3": "M-3_C7_바깥2본형상", "M-4": "M-4_C8-C13_스터럽", "M-5": "M-5_C14-C17_루프타이",
"M-6": "M-6_C18_단일값", "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"\ok_images.json", "w", encoding="utf-8"), ensure_ascii=False)