- 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>
102 lines
11 KiB
Python
102 lines
11 KiB
Python
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)
|