Files
Pier_v1/검토파일/검토_운곡교P1/스크립트/make_classified_xlsx.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

251 lines
42 KiB
Python

import sys; sys.path.insert(0,"./pylib")
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter
# ---- reuse the 4-way rows written earlier (head, R) without re-saving that workbook
src = open('xl4.py', encoding='utf-8').read()
a = src.index("head=['번호'")
b = src.index("for j,h in enumerate(head,1):")
ns = {}
exec(src[a:b], ns)
R = [list(r) for r in ns['R']]
# ---- new rows (model-formula question) appended
R.append(['58','C9~C13','모델 길이 산식 규칙 (+54.3 적용 범위)','해당 없음','해당 없음','재료표 변하는 치수 = 도면 중심선 + 54.3 (선행보고서 7.2)','스터럽 높이 b·폐합근 길이 A 에는 +54.3 적용, 폭(스터럽 A, 폐합근 B)에는 미적용','확인 필요','C12 모델 폭 1106 (+54.3 = 1160)은 스터럽 폭과 같아짐. 폭에도 규칙을 적용해야 하는지 판단 필요 (적용 시 C12 +1.95 m, C13 +0.98 m)'])
R.append(['59','C1~C16','[단면도 (정면도 가운데, S=1:60, EL 43.555)] 철근 점·스터럽','해당 없음','B-B 오른쪽 절반(Y≥0)만 작도: 상면 3단 12점/행(깊이 248.2/348.2/448.2), C16 6점(104.5), C12·C13 행 3점(Y 317/843/1423, 깊이 793.7…), C7·C8 12점(하면 위 104.5), 스터럽 Y 290/870/1450(상·하 77.5)','해당 없음','B-B 와 같은 위치·높이 (모델이 B-B 값과 일치)','일치','단면도는 B-B 와 같은 단면을 전체 높이로 그린 것(같은 상면 EL 43.555, 깊이 3,144, 폭 3,100). 값은 B-B 와 0.3mm 이내로 같음'])
R.append(['60','C1~C16','[단면도] 점 위치·스터럽 높이·미확인 가로선','해당 없음','점 +4.5mm(C16 104.5), 스터럽 상·하 77.5, 상면 -100 전폭 선(EL 43.455) 1개: B-B 와 동일','해당 없음','B-B 와 동일 (100 안쪽)','도면 내부','D-1·D-3·D-12 와 같은 항목이 단면도에도 반복됨 (새 항목 없음)'])
R.append(['61','S1·S2','형상·길이·본수·총길이','D2 상세: 훅 700 (대좌 89 + 코핑 611), S1 길이 2.4 m(2.5 m 칸 안), S2 1.1 m','D2 단면 C-C: S1 가로선 10개(2.4 m), S2 세로선 21개(1.1 m)','S1 III H19 50본 A 2.400 B 700 L 3.800 / S2 105본 A 1.100 B 700 L 2.500','S1 50본(5격자×10) L 3,800, 총 190.0 m / S2 105본(5격자×21) L 2,500, 총 262.5 m','일치','총길이 재료표 190.000 / 262.500 과 정확히 일치'])
R.append(['62','S1·S2','간격 (D2 단면 C-C, 도면 좌표 ÷2)','해당 없음','S1: 112.5 / 125 x7 / 112.5 (1.2 m 칸), S2: 50, 75, 125 x18, 75 (2.5 m 칸)','해당 없음','S1: 113/125/124…/112, S2: 74, 125 x18…, 74 (회전 4.4° 반영)','일치','D2 상세는 S=1:30 이라 좌표가 2배로 그려져 있음 (치수 문자는 실제값)'])
R.append(['63','S1·S2','높이 기준 (S1 철근 중심)','D2 전열 상세: 대좌 상면에서 50 아래 (대좌 높이 139, 훅 아래로 89+611)','해당 없음','해당 없음','코핑 상면에서 50 아래 (대좌 아래, 예: z 43,648 = 코핑 EL 43.698 -50), 훅 700 아래','불일치','모델이 대좌 높이만큼(139~164mm) 낮음. 모델 src 가 "추론"으로 표기됨. 도면에서 해석 확인 필요'])
R.append(['64','S1·S2','층 순서 (위/아래)','D2 상세: S2 점이 S1 선보다 13.5mm 위 (작도 기호 오프셋)','해당 없음','해당 없음','S1 위 · S2 아래, 50mm 간격 (src "upper layer [추론]")','불일치','도면은 S2 가 위, 모델은 S1 이 위. 도면은 확정 표기 없음 → 확인 필요'])
R.append(['65','S1·S2','배치 대상 (전열·후열 / 대좌 개수)','D1 평면도: 3.100 폭에 S1 / S2 / S1 구간 표기, D2 상세는 전열 1개 (2.5 x 1.2)','해당 없음','S1 50 = 5x10, S2 105 = 5x21','5개 격자, 각 격자가 전열·후열 두 대좌를 가로지르는 2.4 m (Y -1288~1104)','미확인','D1 평면도의 S1/S2/S1 구간 표기와 D2 상세 1개의 대응이 도면에 명확하지 않음'])
R.append(['66','S1·S2','D2 전열 상세의 대좌 높이','D2 상세 대좌 139','해당 없음','해당 없음','전열(3500 kN) 대좌 164, 후열(2800 kN) 대좌 139','미확인','상세 제목은 전열인데 높이 139 는 모델 후열 값. 도면 내부 불일치 가능성'])
R.append(['67','B1~B8','[기초] 상·하면 철근 높이: 같은 철근을 정면도와 측면 단면도에서 비교','정면도(기초): 선(X방향 철근) B5 +2100, B6·B8 +150, B7 +250 / 점(Y방향) B1 +2073, B2·B4 +122, B3 +227.5','측면 단면도(기초): 선(Y방향) B1 +2100, B2·B4 +150, B3 +250 / 점(X방향) B5 +2127, B6·B8 +178, B7 +277','해당 없음','모델은 점 값 사용: B1 +2073, B5 +2127, B2·B4 +122, B6·B8 +178, B3 +227.5, B7 +277','불일치','같은 철근이 두 뷰에서 27~28mm(B3 22.5) 다르게 그려짐 (선=설계 중심, 점=접촉 철근 기호). 도면 내부 불일치, 모델은 점 값을 따름'])
R.append(['68','B1~B8','[기초] 교차하는 두 철근의 간격 (상면 B1/B5, 하면 B2·B4/B6·B8, 중앙 B3/B7)','두 뷰 모두 27~28mm (철근 지름 합의 반, 접촉)','측면 단면도도 27~28mm','해당 없음','상면 54, 하면 56, 중앙 49.5 (점 값을 서로 다른 뷰에서 가져와 간격이 2배)','불일치','모델이 도면 두 뷰 중 어느 쪽과도 맞지 않는 조합. 모델 확인·수정 필요'])
R.append(['69','B5, B6, B2','[기초] 상면 피복·다리 끝 높이','상면 선 100 아래, 다리 B6 +150~+2100 (끝 100 아래)','다리 B2 +150~+2100','다리 B=1.950','B5 중심 73 아래(순피복 58.5, 선행 E-06), B6 다리 끝 +2128 (72 아래), B2 다리 끝 +2072 (128 아래)','불일치','도면 선 기준 100 아래와 모델이 ±27mm 다름. 선행보고서 E-06 확인'])
R.append(['70','B12','[기초] 본수','우측 점 3+4+3+4=14 (z 550/950/1350/1750) → 전체 28','측면 단면도 B11 점도 28 구성','B12 34본 (L 7.800, A 7.600 B 100)','28본 (총 218.400 m)','불일치','재료표 34 ↔ 작도 28 (선행 E-05 확인, 모델은 작도를 따름). 재료표 총길이 265.200 ↔ 모델 218.400'])
R.append(['71','B3','[기초] 위치 치수 (중앙 줄)','점 38개 (오프셋 125~4375, 4575), 치수 줄 "100 / 450 / 33@250 = 8.250 / 450 / 100"','해당 없음','B3 38본','38본 (점과 동일)','불일치','치수(450 끝, 34+2=36본)와 점·재료표(38본)가 다름. 도면 내부, 모델은 점·재료표를 따름'])
R.append(['72','B10','[기초] 단 수와 치수','치수 "9@200=1.800" (10단 z 1950~150), 점은 9단 (z 1950~350)','측면도 점도 9단','B10 9본, A 9.198 B 7.644','9단 z 1950~350, 루프 9.198 x 7.644','불일치','치수는 10단인데 점·재료표는 9단. 점 위치 ±4593/±3818 ↔ 표 ±4599/±3822 (6/4mm)'])
R.append(['73','B9','[기초] 수량·배치','라벨 "H16 @500" (작도 위치 불명)','해당 없음','B9 H16 수량 칸 빈칸, L 2.155 총 1,062.415','493본 체크무늬 34x29 격자 (총길이 역산)','미확인','수량은 총길이/L 로 역산(선행 M-01). 도면에서 배치를 확인하지 못함'])
R.append(['74','B1~B8, B10~B12','[기초] 본수·형상·길이·간격','B1 점 19(우측)→38, B3 19→38, 하면 점 37→73, B12 14→28, B10 9단','B5·B7 점 16→32, B6+B8 점 31→61, B11 점 14→28','B1 38 / B2 38 / B3 38 / B4 35 / B5 32 / B6 32 / B7 32 / B8 29 / B10 9 / B11 28, 형상·A·B·L 표기','동일 본수·위치, 총길이 B1 304.0 / B2 437.0 / B3 304.0 / B4 266.0 / B5 305.6 / B6 417.6 / B7 305.6 / B8 265.35 / B10 303.156 / B11 261.8 m (재료표와 일치)','일치','하면 70@125=8.750 (+200 끝) = B2 38 + B4 35 교차, 상면 35@250 (+200 끝) = B1 38, 측면 58@125 / 29@250 = B6+B8 61 / B5 32'])
R.append(['75','B11, B12','[기초] 4단 높이와 위치','B12 점 z +550/950/1350/1750 (500 간격 교차), B11 선 +550/+1750','측면: B11 점 +550/950/1350/1750, B12 선 +550/+1750','B11 28 / B12 34','z 550/950/1350/1750, X ±375~±3875, Y ±250~±3250','일치','높이·위치는 도면과 모델 일치 (B12 본수는 행 70)'])
R.append(['76','B1~B12','[기초] 내면반지름 (굽힘 R 중심: S29 65.3, S25 56.3, S19 42.8, S16 24.0)','도면에 없음','도면에 없음','R 칸 빈칸','모델 파이프 직경 29/25/19/16 로 내면지름 101.6 / 87.6 / 66.6 / 32.0','기준 충족(여유 적음)','KDS 3.5db(공칭 28.6/25.4/19.1) = 100.1 / 88.9 / 66.9 : S25 1.3mm, S19 0.3mm 부족 (S29·S16 충족). 파이프 직경 대신 공칭을 쓰면 경계'])
R.append(['77','P1·P2','[기둥] 본수·형상·길이','D1 정면도: P1 S32 / P2 S32 Div.46','단면 C-C·D-D·E-E: 두 줄 링 S32 Div.46 (각 46본)','P1 XIV S32 46 (A 16.213 B 534 C 500 R 340 L 17.247), P2 XVI S32 46 (A 16.553 L 16.553)','P1·P2 각 46본, 길이 17,247 / 16,553, 총 793.365 / 761.438 m (재료표 793.362 / 761.438)','일치','P1 하단 훅: 정면도 호 R 340 (시작 z 26848 → 끝 z 26508, 수평 500) = 모델'])
R.append(['78','P1·P2','[기둥] 하단 높이 (기초 안)','P1 호 끝 z 26.508, P2 하단 z 26.508','해당 없음','해당 없음','하단 EL 26.508 (기초 하면 +300)','일치','정면도 점·선과 모델 일치'])
R.append(['79','P1·P2','[기둥] 상단 높이 (선행 E-02)','P1 상단 EL 43.011, P2 EL 40.411 (기둥 상단에서 끝)','해당 없음','P1 A 16.213 + 호 → 43.061, P2 A 16.553 → 43.061','P1·P2 모두 EL 43.061','불일치','도면 내부: 정면도 ↔ 재료표 (P1 50mm, P2 2,650mm). 모델은 재료표를 따름'])
R.append(['80','P1·P2','[기둥] 철근 중심 반지름 (선행 E-03)','선 P1 875 / P2 830, 치수 125·875·875·125 (P1 중심 875)','작도 점 P1 870.5 / P2 825.5','해당 없음','P1 870.5 / P2 825.5 (점 값)','불일치','도면 내부: 치수·선 ↔ 점 4.5mm (모델은 점, 띠철근 R 897 내면과 3.5mm 간섭 회피 쪽)'])
R.append(['81','P3','[기둥] 띠철근 단수·간격·형상','치수 36@300=10.800 (P5 상단 30.988부터, 상단 EL 41.788), 라벨 H19 @300, 링 점 36개','단면 E-E: H19 @300','P3 VI H19 36 (A 2.818 B 200 R 897 L 6.436)','36단 z 31288~41788 @300 (반원 2개씩 72), R 897, 설계 6.436','일치','좌우 반원 두 개로 구성, 이음은 단마다 90° 엇갈림 적용(도면에 기준 각도 없음 → 행 86)'])
R.append(['82','P3~P5','[기둥] 링 점 위치 반지름 (선행 E-04)','링 점 오프셋 902 (R 897 + 5)','해당 없음','R 897','R 897','불일치','도면 내부: 점 902 ↔ 표 897 (5mm, 4.5mm 안쪽 이동과 같은 유형), 모델은 표 897'])
R.append(['83','P4·P5','[기둥] 띠철근 간격 (선행 E-01, 계산서 확인)','치수 8@120=960 / 22@120=2.640 (총 17.203 사슬), 라벨 H19 @100','단면 C-C·D-D: H19 @100','P4 9본 (A 2.753 B 65 R 897 L 5.636), P5 22본 (A 5.571 B 65 R 897 L 5.636)','P4 9단 z 27388~28348 @120, P5 22단 z 28468~30988 @120 (치수를 따름)','불일치','도면 내부: 라벨 @100 ↔ 치수 @120 (재료표 본수 9·22는 @120과 일치). 구조계산서 확인 사항 — 모델은 @120 가정, 확정 아님'])
R.append(['84','P6','[기둥] 크로스타이 단수·개수·길이','선 EL 29.188 / 30.988 / 38.188 / 39.988 (1800 간격), 치수 8@1.800=14.400, 각 선 반길이 875','단면: 4방향 선(0/45/90/135°) 라벨 H16 @1.800','P6 III H16 36 (A 1.836 B 150 L 2.136)','9단 x 4방향 = 36본, z 27388~41788 @1800 (+17.5 링 위), 직선 1,788, 설계 2.136','일치(경미 차이)','정면도 선 반길이 875(총 1,750) ↔ 모델 직선 1,788 (링 반지름 894까지): 19mm/끝. 높이·본수 일치'])
R.append(['85','P1~P6','[기둥] 이음·갈고리 각도 기준 (P3 이음 엇갈림, P4·P5 커플러 위치, P1·P2 46분할 시작각)','"이음 부분이 엇갈리도록 배치" 노트만 있음','단면에 각도 표기 없음','해당 없음','P3 이음 0/180° 에서 단마다 90° 엇갈림, 커플러 90/270°, P1·P2 0°부터 7.826°','미확인','도면에 기준 각도가 없어 모델 값이 가정'])
R.append(['86','P3','[기둥] 갈고리 내면지름·연장 (모델 R 42.75, 구부림 142.4°, 연장 86.7)','도면에 없음','도면에 없음','B 200','내면지름 66.5 (3.5 x 모델 파이프 19) , 연장 86.7 (4.6db)','기준 미적용','KDS 24 14 21: 공칭 19.1 기준 내면지름 66.85 (0.35mm 부족), 갈고리 연장 5db = 95mm 보다 약 8mm 짧음 → 확인 필요 (P6 갈고리는 충족: 내면지름 32, 연장 126)'])
R.append(['87','받침','[받침] 대좌 평면·높이','D1 단면도: 후열 대좌 139.0 (전열은 169.4, 행 95)','D1 평면도: 받침 쌍 2.5 m 폭','D2 표: C6 1200, C3 2500(쌍), h1 전열 164 / 후열 139','대좌 1200 x 1250 (쌍 2500), 높이 164 / 139 (코핑 상면 위)','일치','회전 전열 4.4° / 후열 3.1° (행 97)'])
R.append(['88','받침','[받침] 몰탈 패드 평면·두께','D1 평면도 후열 3.1° 패드 (행 96)','해당 없음','D2 표: (A+200) x (B+200) = 900 x 840 / 990 (전열), 900 x 740 / 850 (후열), h2 50','900 x 840 / 990, 900 x 740 / 850, 두께 50','일치','패드 상면 = EL.X (행 91)'])
R.append(['89','받침','[받침] 교량받침 본체 A x B, 높이 h3','해당 없음','해당 없음','D2 표: A 700, B 640 / 790(교축방향 #3) / 540 / 650(교축방향 #8), h3 181','700 x 640 / 790 / 540 / 650, 높이 181','일치','교량받침 상세(S=1:20)의 A·B·h2·h3 정의와 일치'])
R.append(['90','받침','[받침] 솔플레이트 L x W, 두께, 경사','해당 없음','해당 없음','D2 표: L 800, W 740 / 890 / 640 / 750, T 30, S -1.901~-1.910%, T1 38 / T2 22','L 800, W 740 / 890 / 640 / 750, 두께 22.4~37.6 (평균 30)','일치(경미 차이)','T1·T2 정수 38/22 ↔ S 기준 37.6/22.4 : 0.4mm (표 반올림)'])
R.append(['91','받침','[받침] 패드 상면 EL.X (= 코핑 상면 + h1 + h2)','해당 없음','해당 없음','D2 표: 전열 43.625 / 43.697 / 43.768 / 43.840 / 43.912, 후열 43.600 / 43.672 / 43.744 / 43.816 / 43.887','43.625 / 43.697 / 43.769 / 43.841 / 43.912, 후열 43.600 / 43.672 / 43.744 / 43.816 / 43.887','일치(경미 차이)','#3, #4 만 1mm 차이 (코핑 계단 71.85mm 반올림)'])
R.append(['92','받침','[받침] 합계 높이 E = h1 + h2 + h3 + h4','해당 없음','해당 없음','D2 표: E 425 (전열), 400 (후열)','대좌 바닥~솔플레이트 평균 상면 425 / 400','일치','EL.X 정의는 E 가 아니라 코핑 상면 + h1 + h2 (선행 4.2)'])
R.append(['93','받침','[받침] 받침 중심 위치(Y) 와 구간 분할 C1·C2·C3, S1·S2','D1 평면도: 3.100 폭을 S1 / S2 / S1 로 표기','해당 없음','D2 표: C1 600 / 602, C2 1298, C3 2500, S1 852 / 950, S2 1298','받침 중심 Y -698 (전열) / +600 (후열) → 간격 1298, 코핑 반폭 1550 - 698 = 852, 1550 - 600 = 950','일치','S1 852 + S2 1298 + S1 950 = 3100 (받침 중심으로 나눈 구간). C1+C2+C1 = 2498 ↔ C3 2500 (표 2mm)'])
R.append(['94','받침','[받침] 받침 간격(X) 과 평면 위치','D1 평면도: 받침 간격 2.505, 후열 패드 중심 코핑 중심 +2548 / +5053','해당 없음','해당 없음','간격 2505, 후열 패드 중심 x +2548 / +5053','일치','평면도에서 후열 받침 4·5 번 위치 확인 (전열은 평면도에 다른 형식)'])
R.append(['95','받침','[받침] 전열 대좌 높이','D1 단면도 전열 대좌 높이 169.4','해당 없음','D2 표 h1 164','164','불일치','도면 내부: D1 169.4 ↔ D2 표 164 (5.4mm, 선행 E-10). 모델은 표를 따름'])
R.append(['96','받침','[받침] 후열 패드 평면 폭','D1 평면도 후열 패드 900 x 840 (전열과 같은 크기로 작도)','해당 없음','D2 표 (A+200) x (B+200) = 900 x 740 (B 540)','900 x 740','불일치','도면 내부: D1 840 ↔ D2 740 (100mm, 선행 E-11). 모델은 표를 따름'])
R.append(['97','받침','[받침] 평면 회전각 (곡선교)','D1 평면도 후열 받침 3.1° (전열은 형식이 달라 확인 못 함)','해당 없음','해당 없음','전열 4.4° / 후열 3.1°','미확인','후열 3.1° 일치, 전열 4.4° 미확인'])
R.append(['98','받침','[받침] 솔플레이트 경사 방향 (T1 / T2 어느 쪽이 두꺼운지)','교량받침 상세: 교축방향 화살표만 있고 T1/T2 위치 방향 불명','해당 없음','D2 표 S(%) 부호만 있음','모델이 가정 (선행 4.2)','미확인','도면에 방향 정의 보완 필요'])
R.append(['99','받침','[연단거리 검토] 받침 연단거리 (D2 교량받침 연단거리 검토)','D1 평면도·D2: 필요연단길이 s = 200 + 5.0L = 451.2mm, 적용거리 472.7mm','해당 없음','해당 없음','전열 #3 받침(790 x 700) 코핑 끝 연단거리 472.9 (전열 #1·2·4·5 는 478.7, 후열 586.1)','일치','적용거리 472.7 = 가장 작은 받침(#3, B 790, 4.4° 회전) 값과 0.2mm 차이. 필요 451.2 ≤ 적용 472.7'])
R.append(['100','받침','[연단거리 검토] 필요지지길이 N = 809mm ↔ 적용 1503.3mm','D2 검토표: N 809, 적용 1503.3','해당 없음','해당 없음','모델에서 대응하는 값을 특정하지 못함','미확인','적용 1503.3 이 어느 거리인지 도면에 정의가 없음 (필요 809 보다 큼)'])
R.append(['101','P1·P2','[기둥 단면 C-C·D-D·E-E] 46분할 시작각·반지름','해당 없음','점 92개 (각 46), 각도 0°부터 7.826° 간격, P1 870.5 / P2 825.5, 같은 각도에 정렬 (세 단면 동일)','S32 Div.46','46본씩, 0°부터 7.826°, P1 870.5 / P2 825.5','일치','선행 M-12 중 46분할 시작각은 확인됨 (P3 이음·커플러 각도는 단면에도 표기 없음)'])
R.append(['102','P3~P6','[기둥 단면] 띠철근 반지름과 크로스타이 길이','정면도 링 점 902, 크로스타이 선 반길이 875','단면: 띠철근 호 R 897.5, 크로스타이 4방향(0/45/90/135°) 길이 1795','R 897, P6 A 1.836 L 2.136','R 897, 크로스타이 직선 1788 (설계 2.136)','일치(경미 차이)','링 897 / 897.5 / 902 (0.5~5mm), 크로스타이 1795 ↔ 1788 (7mm)'])
R.append(['103','P3~P5','[기둥 단면] 단면별 띠철근 종류','해당 없음','C-C: P4 H19 @100, D-D: P5 H19 @100, E-E: P3 H19 @300','P4 9 / P5 22 / P3 36','P4 z 27388~28348, P5 28468~30988 (@120), P3 31288~41788 (@300)','일치','@100 은 선행 E-01 (치수는 @120, 계산서 확인)'])
R.append(['104','UA1','[기초 조립용 철근] 모델 반영 여부','해당 없음','D3 상세: 70° 삼각 지지, 500 수평 다리, 상단 200 꺾임, 길이 VAR','UA1 XVII H22 73본 (A 200, B 1.988, C 500, L 5.176 = 2B + A + 2C), 총 377.848 m, 1.149 t','모델에 없음 (선행 M-03: 모델 제외)','불일치','도면↔모델: 모델에 조립용 철근이 빠져 있음 (73본). 도면은 "배치 예시도"'])
R.append(['105','UA1','[기초 조립용 철근] 수량·배치','D3 설치위치 도면: 1.0 x 1.2 간격 예시도 (S=NONE), "실제 철근 배치 간격에 따라 위치는 변경"','압축 검토표: 기초 두께 H=2.0 → H19, 2.5·3.0 → H22 (기초 2.2 m 에 H22)','73본','-','미확인','수량 73본이 어떤 배치에서 나왔는지 도면에서 확인 불가 (예시도)'])
for r in R:
if r[0] == '21':
r[3] = '우측 끝 선 꺾임점 오프셋 C1 5941.6 / C2 5952.6 / C3 5964.6 (정면도)'; r[4] = '해당 없음'; r[6] = '5943.1 / 5953.9 / 5964.8 (모델 직선 끝 + 굽힘 접선)'; r[7] = '일치'; r[8] = '우측만 확인 (1.5mm 이내). 좌측은 정면도 미작도'
if r[0] == '97':
r[3] = 'D1 평면도: 전열 85.6° (= 4.4°), 후열 86.9° (= 3.1°)'; r[6] = '전열 4.4° / 후열 3.1°'; r[7] = '일치'; r[8] = '두 회전각 모두 평면도 선 방향과 일치'
if r[0] == '65':
r[3] = 'D1 평면도 S1/S2/S1 은 치수 이름 (표 S1·S2 칸 852/1298/950 과 같은 이름)이며 철근 마크가 아님'; r[8] = '구간 표기는 해소됨. 남은 문제: D2 상세(전열 1개, 2.5x1.2)가 전열 대좌만인지 대좌 쌍 전체인지 도면에 없음'
if r[0] == '57':
r[1] = 'C14'; r[3] = '해당 없음'; r[4] = 'B-B 상면 -100 전폭(2,900) 선 1개 (EL 43.455): 절단면 뒤쪽 C14 상단 연결근(x=+2913)이 선으로 보이는 것. 정면도 점은 EL 43.443'; r[6] = 'C14 상단 EL 43.442 (x=+2913, 1본)'; r[7] = '일치(경미 차이)'; r[8] = '해소: B-B 는 절단면 뒤쪽 철근도 그림. 점(43.443) ↔ 선(43.455) 12mm 는 점/선 표기 차이 (D-1 과 같은 유형)'
if r[0] == '79':
r[8] = '도면 내부: 정면도·D2 주철근 조립도(P1 2,600 위 / P2 기둥 상단까지) ↔ 재료표 (P1 50mm, P2 2,650mm). 모델은 재료표를 따름'
if r[0] == '66':
r[8] = '상세 제목은 전열인데 높이 139 는 후열 값 (모델 전열 164 / 후열 139). 도면 내부 불일치'
if r[0] == '47':
r[3] = '좌측 반쪽 정면도에 없음'; r[7] = '일치(간접)'; r[8] = '간접 확인: 재료표 B 범위 최솟값 1.376 = 모델 맨 왼쪽 스터럽 b 1,376.5 (중심선 높이 + 54.3 규칙). 좌우 대칭 배치는 가정'
if r[0] == '55':
r[8] = '추정: 도면 점 위치로는 최하단 점(x=±1913 EL 41.011, x=±2913 EL 41.511)은 훅을 아래로 하면 하면 밖으로 164 / 74mm 나가고, 상단 점(x=2913 EL 43.442)은 훅을 위로 하면 상면 밖으로 165mm 나감 → 하부 점은 위, 상부 점은 아래 훅으로 보임 (도면 직접 표기는 없음)'
if r[0] == '54':
r[8] = '모델이 최하단 점 2개를 350mm 올림 (하면과 훅 간섭 때문으로 추정, 근거 기록 없음). 훅을 위로 두면 도면 점 위치 그대로 들어가므로 올릴 필요가 없을 가능성 (행 55 추정)'
if r[0] == '65':
r[7] = '일치(간접)'; r[8] = '간접 확인: 받침 쌍 풋프린트 C3 2500 x C6 1200 = 메시 2.5 x 1.2 (대좌 1개 1250 x 1200 보다 큼), 재료표 50/105 = 5격자 x 10/21 → 모델의 "격자당 1장(쌍 전체)"과 일치. 상세 제목 "전열"은 보는 방향 표기로 추정'
if r[0] == '73':
r[7] = '일치(간접)'; r[8] = '간접 확인: 라벨 H16 @500 + 격자 34 x 29 (@250) 체크무늬 986 / 2 = 493 = 총길이 1,062.415 / L 2.155 와 정확히 일치. 수량 자체는 도면에 미기재'
if r[0] == '32':
r[8] = r[8] + ' (간접: 재료표 A = E = 650 으로 좌우 같음)'
if r[0] == '56':
r[8] = r[8] + ' (간접: 재료표 L 5.611 = A 5.261 + 350 한쪽 훅, 왼쪽 끝 훅과 일치)'
if r[0] == '53':
r[8] = r[8] + ' (간접: 좌측 18본 = 재료표 41본 - 우측 23본)'
if r[0] == '98':
r[6] = '교축방향(Y) 경사 1.905% (전열 쪽 두꺼움), X 성분 0.10~0.15% 는 회전각(4.4°/3.1°) 때문'; r[8] = '도면은 T1/T2 위치·광주방향과의 대응 표기 없음 → 모델 두꺼운 쪽(전열) 가정, 확인 필요'
# ---- classification: 구분
CAT = {}
for r in R:
CAT[r[0]] = '일치'
for n in ('1','2','3','22','37','39','41','16','18','29','35','44','49','50','52','66','60','67','70','71','72','79','80','82','83','95','96','0'):
CAT[n] = '도면 내부'
for n in ('54','58','63','64','68','69','104'):
CAT[n] = '도면↔모델'
for n in ('36','20','76','86'):
CAT[n] = '기준↔모델'
for n in ('47','55','65','73','85','98','100','105'):
CAT[n] = '미확인'
for n in ('47','65','73'):
CAT[n] = '간접 확인'
# ---- colours
def fill(c): return PatternFill('solid', fgColor=c)
HDR = fill('1F3864')
COL = {'일치': fill('C6EFCE'), '도면 내부': fill('FFF200'), '도면↔모델': fill('FF9933'), '기준↔모델': fill('FFC000'), '미확인': fill('E7E6E6'), '간접 확인': fill('BDD7EE')}
thin = Side(style='thin', color='999999'); BR = Border(left=thin, right=thin, top=thin, bottom=thin)
def put_header(ws, r0, head):
for j, h in enumerate(head, 1):
c = ws.cell(r0, j, h); c.font = Font(bold=True, color='FFFFFF'); c.fill = HDR
c.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True); c.border = BR
def put_rows(ws, r0, rows, catcol, h=48):
for i, row in enumerate(rows, 1):
for j, v in enumerate(row, 1):
c = ws.cell(r0 + i, j, v); c.border = BR
c.alignment = Alignment(vertical='center', wrap_text=True, horizontal='center' if j in (1, 2, catcol) else 'left')
cc = ws.cell(r0 + i, catcol); cc.fill = COL.get(row[catcol - 1], COL['미확인']); cc.font = Font(bold=True)
ws.row_dimensions[r0 + i].height = h
def widths(ws, ws_w):
for j, w in enumerate(ws_w, 1): ws.column_dimensions[get_column_letter(j)].width = w
wb = Workbook()
# ======== sheet 0 : legend / summary
s0 = wb.active; s0.title = '분류 안내'
s0['A1'] = '운곡교 P1 코핑 철근 C1~C16 : 도면 ↔ 모델 일치 검토 (불일치 종류별 분류)'; s0['A1'].font = Font(bold=True, size=14)
s0['A2'] = '목적: 도면(정면도·단면 A-A/B-B·재료표)과 라이노 모델이 일치하는지가 최우선. 도면 내부 불일치는 따로 분리. 작성 2026-10-15, 검토 미확정.'
s0.merge_cells('A2:E2'); s0['A2'].alignment = Alignment(wrap_text=True); s0.row_dimensions[2].height = 32
cnt = {}
for r in R: cnt[CAT[r[0]]] = cnt.get(CAT[r[0]], 0) + 1
leg = [['색', '구분', '뜻', '항목 수', '볼 시트'],
['주황', '도면↔모델', '도면들끼리는 같거나 도면에 정보가 없는데 모델이 다르게 만들어졌거나 가정한 것 (모델 확인·수정 대상)', cnt.get('도면↔모델', 0), '① 도면↔모델 불일치'],
['진한 노랑', '기준↔모델', '설계기준(KDS 24 14 21)에 모델이 맞는지 (도면에는 정보 없음)', cnt.get('기준↔모델', 0), '① 도면↔모델 불일치'],
['노랑', '도면 내부', '도면끼리 서로 다름 (정면도·단면·재료표 간). 모델은 그중 한쪽을 따름 (도면 정정 요청 대상)', cnt.get('도면 내부', 0), '② 도면 내부 불일치'],
['초록', '일치', '도면과 모델이 일치 (정상 차이·1mm 이하 포함)', cnt.get('일치', 0), '③ 전체 대조표'],
['연한 파랑', '간접 확인', '도면에 직접 표기가 없어 다른 값(재료표·형상·기하 제약)으로 추정 확인한 것 (도면 직접 확인은 아님)', cnt.get('간접 확인', 0), '③ 전체 대조표'],
['회색', '미확인', '확인하지 못했거나 도면에 정보가 없어 판단 불가', cnt.get('미확인', 0), '③ 전체 대조표']]
put_header(s0, 4, leg[0])
for i, row in enumerate(leg[1:], 1):
for j, v in enumerate(row, 1):
c = s0.cell(4 + i, j, v); c.border = BR; c.alignment = Alignment(wrap_text=True, vertical='center', horizontal='center' if j in (1, 2, 4) else 'left')
s0.cell(4 + i, 1).fill = COL[row[1]]
s0.row_dimensions[4 + i].height = 40
widths(s0, [12, 14, 80, 10, 24])
s0['A11'] = '판단 기준: "도면↔모델"은 모델이 도면과 다른 경우, "도면 내부"는 도면끼리 다른 경우. 도면끼리 다르면 모델은 반드시 한쪽과 달라지므로, 그 경우는 도면 내부로 분류하고 "모델이 따른 쪽"을 따로 적었다.'
s0.merge_cells('A11:E11'); s0['A11'].alignment = Alignment(wrap_text=True, vertical='top'); s0.row_dimensions[11].height = 44
s0['A12'] = '모델 파일: 운곡교p1.3dm (2026-10-14 저장본) / 도면: D1(교각도1 정면도·단면 A-A·B-B) D2 D3(재료표) — D:\\★Pier 자료\\심수석님 검토 파일\\철근 모델랑 운곡교P1_바이브코딩\\'
s0.merge_cells('A12:E12'); s0['A12'].alignment = Alignment(wrap_text=True); s0.row_dimensions[12].height = 32
# ======== sheet 1 : model vs drawing (priority)
M = [
['M-1','C14','최하단 점 2개 높이: x=1913 정면도 EL 41.011 / 모델 41.361, x=2913 정면도 EL 41.511 / 모델 41.861 (대칭 위치 x=-1913·-2913 도 같은 값)','정면도 점 ↔ 모델','모델이 350mm 높음','도면 점은 서로 일치(정면도·A-A 가로선), 모델만 다름','모델이 올린 근거 기록 없음. 정면도 점 위치대로면 훅(아래 가정 350)이 콘크리트 하면(EL 40.826 / 41.235) 아래로 나감 → 훅이 위쪽일 가능성. 모델 수정 또는 도면 확인 필요','도면↔모델'],
['M-2','C14','훅 방향: 도면에 표기 없음, 모델은 "아래"로 가정','도면 없음 ↔ 모델 가정','-','도면 정보 없음','x=+2913 상단 점(EL 43.442)은 위로 불가. M-1 과 함께 판단','미확인'],
['M-3','C7·C8','굽힘 4곳(호-다리 약 79° x2, 평면부-호 약 29° x2)이 각진 연결, 내면반지름 미반영','KDS 24 14 21 ↔ 모델','중심선 약 37mm 영향','C1~C6 모델은 필렛 적용됨(모델 내부에서도 불일치)','도면에는 반지름이 없음. KDS 내면지름 ≥ 3.5db 를 모델에 반영할지 결정 필요','기준↔모델'],
['M-4','C1~C6','내면반지름 여유 거의 없음: 모델 내면지름 약 101.5 ↔ KDS 3.5db=100.1(공칭 28.6) / 101.5(모델 파이프 직경 29 기준)','KDS 24 14 21 ↔ 모델','여유 0.4mm 이하','도면에는 반지름 없음','모델 파이프 직경이 29mm. 반지름을 키울지, 공칭 28.6 로 맞출지 결정 필요','기준↔모델'],
['M-6','S1·S2','철근 높이 기준: 도면 = 대좌 상면에서 50 아래(대좌 안), 모델 = 코핑 상면에서 50 아래(대좌 아래)','D2 전열 상세 ↔ 모델','139~164mm 낮음','도면 상세 1개뿐이며 대좌 높이 139','모델 src 가 "추론". 모델 수정 또는 도면 해석 확인 필요','도면↔모델'],
['M-7','S1·S2','층 순서: 도면 = S2 위, 모델 = S1 위 (50mm 간격)','D2 상세 ↔ 모델','순서 반대','도면에 확정 표기 없음 (작도 기호 위치만)','모델 src "upper layer [추론]". 확인 필요','도면↔모델'],
['M-8','B1~B8','기초 교차 철근 간격: 도면 27~28mm(접촉) ↔ 모델 54~56mm (점 값을 서로 다른 뷰에서 가져옴)','도면(정면도·측면도 모두) ↔ 모델','약 27mm','두 뷰 모두 27~28mm 로 일치','모델 B1/B5/B2·B4/B6·B8/B3/B7 높이 재조정 또는 근거 확인 필요','도면↔모델'],
['M-9','B5, B6, B2','기초 상면 피복·다리 끝: 도면 선 기준 상면 100 아래 ↔ 모델 B5 73, B6 다리 끝 72, B2 다리 끝 128 아래 (선행 E-06)','도면 선 ↔ 모델','±27mm','도면 두 뷰의 선이 같은 값(100)','M-8 과 함께 조정','도면↔모델'],
['M-10','B1~B12','기초 굽힘 내면반지름: 모델 S25 87.6mm, S19 66.6mm 는 KDS 공칭 기준(88.9 / 66.9)에 1.3 / 0.3mm 부족, S29·S16 은 충족','KDS 24 14 21 ↔ 모델','1.3mm','도면에 반지름 없음','파이프 직경 대신 공칭 직경으로 계산하거나 반지름 확대','기준↔모델'],
['M-11','P3','기둥 P3 갈고리: 모델 내면지름 66.5 (공칭 19.1 기준 66.85, 0.35mm 부족), 연장 86.7mm (KDS 5db=95mm 보다 약 8mm 짧음)','KDS 24 14 21 ↔ 모델','연장 약 8mm','도면에 반지름·연장 표기 없음','갈고리 형상(연장·반지름) 재검토 필요','기준↔모델'],
['M-12','P1~P6','기둥 철근 각도 기준 중 P3 이음 엇갈림·P4/P5 커플러 위치가 도면에 없어 모델이 가정 (46분할 시작각은 단면 C-C·D-D·E-E 에서 확인됨)','도면 없음 ↔ 모델 가정','-','도면에 기준 각도 없음','도면 보완 요청 또는 가정 명시','미확인'],
['M-13','UA1','기초 조립용 철근 UA1 (H22 73본, 377.848 m)이 모델에 없음 (선행 M-03). 도면은 배치 예시도, 수량은 재료표에서만 확정','재료표·D3 상세 ↔ 모델','73본','도면: 70° 삼각 지지 상세','모델 반영 여부 결정 (수량 근거 확인 필요)','도면↔모델'],
['M-5','C9~C13','모델 길이 산식에서 +54.3 규칙 적용 범위: 변하는 치수(스터럽 높이 b, 폐합근 길이 A)에는 적용, 폭(스터럽 A, 폐합근 B)에는 미적용','재료표 규칙(도면 중심선+54.3) ↔ 모델','C12 약 1.95 m, C13 약 0.98 m','재료표 폭 1.407 은 기준 불명','폭에도 적용해야 하는지 판단 필요','도면↔모델'],
]
s1 = wb.create_sheet('① 도면↔모델 불일치')
s1['A1'] = '① 도면 ↔ 모델 불일치 (최우선 확인) — 주황 / 진한 노랑'; s1['A1'].font = Font(bold=True, size=14)
s1['A2'] = '도면은 서로 일치(또는 정보 없음)하는데 모델이 다르게 만들어진 항목. 지금까지 C1~C16 코핑 철근에서 발견된 것은 아래 7건이며, 나머지 항목은 모델이 도면과 일치함(③ 시트).'
s1.merge_cells('A2:H2'); s1['A2'].alignment = Alignment(wrap_text=True); s1.row_dimensions[2].height = 32
h1 = ['번호', '마크', '내용', '비교', '차이 크기', '도면 쪽 상태', '확인·조치 필요 사항', '구분']
put_header(s1, 4, h1); put_rows(s1, 4, M, 8, 62); widths(s1, [8, 10, 62, 22, 18, 30, 62, 14])
# ======== sheet 2 : drawing-internal
D = [
['D-1','C1~C6, C16, C7·C8','단면 A-A·B-B 철근 점 그림이 치수·정면도보다 4.5mm 안쪽으로 그려짐 (상면 3단 104.5/204.5/304.5, C16, 하면 C7·C8 104.5)','단면 점 ↔ 단면 치수 · 정면도','4.5mm','모델은 치수·정면도(100)를 따름','치수 우선. 도면 정정 요청 사항 (선행보고서 E-06 유형)','도면 내부'],
['D-2','C7·C8','하면 피복: 단면 A-A 하면 치수 110 ↔ 단면 B-B 100 · 정면도 100','단면 A-A ↔ B-B · 정면도','약 9.5mm','모델은 100 (B-B·정면도 따름)','A-A 하면 치수만 다름. 오기 가능성, 확인 요청','도면 내부'],
['D-3','C9·C10·C11','스터럽 높이: 단면 A-A·B-B (상·하 77.5 안쪽) ↔ 정면도 (상·하 100 안쪽). 단면이 약 45mm 큼','단면 ↔ 정면도','약 45mm','모델은 정면도·재료표 B 를 따름 (재료표 B 도 정면도와 일치)','선행보고서에 없던 항목. 확인 필요','도면 내부'],
['D-4','C9·C10·C11','스터럽 폭: 재료표 A=1.407 (3루프 동일) ↔ 단면 1.160 / 1.740 / 1.160','재료표 ↔ 단면 A-A·B-B','3루프 합 4,221 ↔ 4,060','모델은 단면을 따름','선행보고서 E-07 확인','도면 내부'],
['D-5','C12·C13','폐합근 폭: 재료표 B=1.407 ↔ 단면 루프 폭 1106 / 1686 / 1106 (+54.3 = 1160/1740)','재료표 ↔ 단면 A-A·B-B','-','모델은 단면을 따름','선행보고서 E-08 확인','도면 내부'],
['D-6','C9·C11·C12','재료표 L 이 변하는 치수를 (최대+최소)/2 로 평균: 정면도·단면 형상으로 계산한 정확한 길이와 다름','재료표 ↔ 정면도·단면 형상','C9 -23.8 m, C11 -21.3 m, C12 -32.0 m','모델은 정확한 형상 길이','선행보고서는 폭 차이를 원인으로 봤으나 실제로는 평균 근사가 더 큼. 본별 길이 목록 요청','도면 내부'],
['D-7','C2·C5','재료표 L 12.081 ↔ A+B+C = 12.082','재료표 내부','1mm','모델은 12,082','반올림 오차로 추정','도면 내부'],
['D-8','C1~C6','다리 각도: 재료표 X1·X2 98°/96° ↔ 정면도 오른쪽 다리선 6.43°(=96.4°)','재료표 ↔ 정면도','0.4°','모델은 정면도(96.4°)를 따름. 왼쪽은 정면도 없어 97.6°는 미확인','재료표는 반올림 값으로 추정','도면 내부'],
['D-9','C7·C8','재료표 형상 VII 의 B·D·R·X1·X2·J 칸 빈칸 (선행보고서 M-04)','재료표 누락 ↔ 정면도(R 12,100 호)','-','모델은 정면도 R 12,100 사용','재료표 보완 요청. 정면도에서 해석 근거 확보','도면 내부'],
['D-10','C7·C8','정면도에 다리 650 구간 표기 없음 (C1 다리선과 겹침), 왼쪽 다리 정면도 없음 → 재료표 A = E = 650, L 13.994 로 간접 확인','정면도 정보 부족','-','재료표 650 = 모델 650','정면도로는 확인 불가','간접 확인'],
['D-13','S1·S2','D2 교좌면 보강 철근 상세("전열" 1개, 2.5x1.2)가 전열 대좌만 해당하는지 쌍 전체인지 도면에 없음 (D1 평면도 S1/S2/S1 은 치수 이름으로 해소됨)','D1 평면도 ↔ D2','-','모델은 5격자로 해석','도면 보완 요청','미확인'],
['D-14','S1·S2','D2 "전열" 상세의 대좌 높이 139 ↔ D2 표 전열(3500 kN) 대좌 164 (139 는 후열 값)','D2 상세 ↔ D2 표','25mm','모델은 표 (전열 164 / 후열 139)','도면 확인 요청','도면 내부'],
['D-15','B1~B8','기초: 같은 철근을 정면도·측면 단면도에서 점/선으로 그린 높이가 27~28mm 다름 (B1 2073↔2100, B5 2100↔2127, B2·B4 122↔150, B6·B8 150↔178, B7 250↔277, B3 227.5↔250)','정면도(기초) ↔ 측면 단면도(기초)','27~28mm','모델은 점 값을 사용','어느 값이 설계 중심인지 도면 확인 요청 (선 100 / 150 이 치수와 일치)','도면 내부'],
['D-16','B12','기초: 재료표 B12 34본 ↔ 작도 점 28 (선행 E-05 확인)','재료표 ↔ 정면도·측면도','6본 (46.8 m)','모델은 작도 28','재료표 정정 또는 도면 보완 요청','도면 내부'],
['D-17','B3','기초 중앙 줄 치수 33@250 + 450 (36본) ↔ 점·재료표 38본','정면도(기초) 치수 ↔ 점·재료표','2본','모델은 38','치수 정정 요청','도면 내부'],
['D-18','B10','기초 B10 치수 9@200=1.800 (10단) ↔ 점 9단·재료표 9본, 표 치수 ±4599/±3822 ↔ 점 ±4593/±3818','정면도(기초) 치수 ↔ 점·재료표','1단 / 6·4mm','모델은 9단·표 치수','치수 정정 요청','도면 내부'],
['D-19','B9','기초 B9 수량 빈칸 (선행 M-01), 배치 도면 불명','재료표 누락','-','모델은 총길이 역산 493본','재료표 수량 기입 요청','미확인'],
['D-20','P1·P2','기둥 주철근 상단: 정면도 P1 EL 43.011 / P2 EL 40.411(기둥 상단에서 끝) ↔ 재료표 둘 다 EL 43.061 (선행 E-02)','정면도 ↔ 재료표','P1 50mm, P2 2,650mm','모델은 재료표(43.061)','도면 정정 요청 (P2 정착 길이 영향 큼)','도면 내부'],
['D-21','P1·P2','기둥 주철근 반지름: 치수·선 P1 875 / P2 830 ↔ 작도 점 870.5 / 825.5 (선행 E-03)','치수·선 ↔ 점','4.5mm','모델은 점','치수 우선 여부 확인','도면 내부'],
['D-22','P3~P5','링 반지름: 정면도 점 902 / 단면 호 897.5 / 표 R 897 (선행 E-04)','점 ↔ 재료표','5mm','모델은 R 897','경미','도면 내부'],
['D-23','P4·P5','띠철근 라벨 H19 @100 ↔ 치수 @120 (재료표 9·22본은 @120과 일치, 선행 E-01) — 구조계산서 확인 사항','라벨 ↔ 치수','100 ↔ 120','모델은 @120','계산서에서 간격 확인 후 확정','도면 내부'],
['D-24','받침','전열 대좌 높이: D1 단면도 169.4 ↔ D2 표 h1 164 (선행 E-10)','D1 단면도 ↔ D2 표','5.4mm','모델은 표 164','도면 정정 요청','도면 내부'],
['D-25','받침','후열 패드 폭: D1 평면도 840 (전열 크기) ↔ D2 표 740 (선행 E-11)','D1 평면도 ↔ D2 표','100mm','모델은 표 740','도면 정정 요청','도면 내부'],
['D-11','C9','정면도 좌측 반쪽(C9 구간)이 그려지지 않음 → 재료표 B 최솟값 1.376 = 모델 맨 왼쪽 스터럽으로 간접 확인','정면도 정보 부족','-','모델은 우측과 대칭으로 작성','C9 위치·높이는 정면도로 확인 불가','간접 확인'],
['D-12','C14','단면 B-B 상면 -100 전폭 선 (EL 43.455) = 절단면 뒤쪽 C14 상단 연결근(x=+2913)이 선으로 보이는 것 (정면도 점 EL 43.443)','단면 B-B 선 ↔ 정면도 점','12mm','모델 EL 43.442','해소 (점/선 표기 차이)','일치'],
]
s2 = wb.create_sheet('② 도면 내부 불일치')
s2['A1'] = '② 도면 내부 불일치 (정면도·단면·재료표 서로 다름) — 노랑'; s2['A1'].font = Font(bold=True, size=14)
s2['A2'] = '도면끼리 다른 항목. 모델은 그중 한쪽을 따랐으므로 "모델이 따른 쪽"을 같이 적었다. 도면 정정 요청 또는 확인 요청용.'
s2.merge_cells('A2:H2'); s2['A2'].alignment = Alignment(wrap_text=True); s2['A2'].alignment = Alignment(wrap_text=True); s2.row_dimensions[2].height = 28
h2 = ['번호', '마크', '내용', '비교', '차이 크기', '모델이 따른 쪽', '조치', '구분']
put_header(s2, 4, h2); put_rows(s2, 4, D, 8, 56); widths(s2, [8, 14, 62, 26, 20, 34, 46, 12])
# ======== sheet 3 : full table
s3 = wb.create_sheet('③ 전체 대조표')
s3['A1'] = '③ 정면도 · 단면도(A-A, B-B) · 라이노 모델 · 재료표 4자 대조표 (C1~C16)'; s3['A1'].font = Font(bold=True, size=14)
s3['A2'] = '구분 열 색: 초록=일치 / 노랑=도면 내부 불일치 / 주황=도면↔모델 / 진한 노랑=기준↔모델 / 회색=미확인'
s3.merge_cells('A2:J2')
head3 = ['번호', '마크', '검토 항목', '정면도', '단면도(A-A / B-B)', '재료표(D3)', '라이노 모델', '판정', '비고 / 근거', '구분']
rows3 = []
for r in R:
rows3.append(list(r) + [CAT[r[0]]])
put_header(s3, 4, head3); put_rows(s3, 4, rows3, 10, 54); widths(s3, [6, 10, 28, 30, 34, 28, 34, 16, 52, 12])
s3.freeze_panes = 'D5'
# ======== sheet 4 : not reviewed
s4 = wb.create_sheet('④ 미검토 마크')
rows4 = [['항목', '내용', '비고', '상태']]
data4 = [['코핑 철근 간 간섭', '선행 보고서 4.3 (P6 크로스타이 교차, B5·B6 다리 겹침 등)', '사용자 지시로 제외', '제외'], ['좌측 반쪽', 'C9 좌측 스터럽, C7·C8 왼쪽 다리, C16 왼쪽 끝, C14 좌측 점 — 정면도에 좌측 반쪽이 그려지지 않음', '도면으로 확인 불가', '확인 불가']]
put_header(s4, 1, rows4[0])
for i, row in enumerate(data4, 1):
for j, v in enumerate(row, 1):
c = s4.cell(1 + i, j, v); c.border = BR; c.alignment = Alignment(wrap_text=True, vertical='center')
s4.cell(1 + i, 4).fill = COL['미확인']
widths(s4, [10, 18, 70, 10])
# ======== sheets 5/6 : height comparison + measurement basis (copied from the earlier height table)
from openpyxl import load_workbook
OLD = r'D:\★Pier 자료\심수석님 검토 파일\검토_운곡교P1\검토표_상면3단_높이비교.xlsx'
try:
ow = load_workbook(OLD)
for src_name, new_name in (('상면3단 높이 비교', '⑤ 상면3단 높이 비교'), ('측정 근거', '⑥ 측정 근거 좌표')):
so = ow[src_name]; sn = wb.create_sheet(new_name)
for row in so.iter_rows():
for c in row:
if c.value is None: continue
n = sn.cell(c.row, c.column, c.value); n.alignment = Alignment(wrap_text=True, vertical='center')
if c.fill is not None and c.fill.fgColor is not None and c.fill.fill_type:
n.fill = fill(c.fill.fgColor.rgb[-6:]) if isinstance(c.fill.fgColor.rgb, str) else n.fill
if c.font is not None and c.font.bold: n.font = Font(bold=True, color=(c.font.color.rgb[-6:] if c.font.color is not None and isinstance(c.font.color.rgb, str) else '000000'))
for col, dim in so.column_dimensions.items(): sn.column_dimensions[col].width = dim.width
for rng in so.merged_cells.ranges: sn.merge_cells(str(rng))
except Exception as ex:
print('height sheets not copied:', ex)
out = r'D:\★Pier 자료\심수석님 검토 파일\검토_운곡교P1\대조표_C1-C16_도면모델_분류.xlsx'
try:
wb.save(out)
except PermissionError:
out = out.replace('.xlsx', '_최종.xlsx'); wb.save(out)
print('saved', out, cnt)