"""산외·옥성 기초 전단·세로철근 수정(2026-10-26)을 '수정 내역' 계열 시트에 추가한다. - 수정 내역: R-10(옥성 B9), R-11(산외 B7), R-12(산외 B9·B10) 행 추가 - 수정 증거(마크별): 같은 철근 행 추가 - 미수정·보류: 산외 B7 행을 '수정 완료'로 갱신, 옥성 B9 연장 부족 행 추가 - 수정 파일·해시: 산외·옥성 수정2 를 '중간본' 으로, 수정3 두 파일을 '최신' 으로 추가 입력: Code/검토수정/결과/c1_shear_fix.json. 같은 R-10 이 이미 있으면 중단(이중 적용 방지). """ import copy import datetime import hashlib import json import sys from pathlib import Path import openpyxl from openpyxl.styles import PatternFill ROOT = Path(r"D:\★Pier 자료\프로그램\Pier_T") REV = ROOT / "검토파일" XLSX = REV / "4개교_공통사항_종합.xlsx" res = json.loads((ROOT / "Code" / "검토수정" / "결과" / "c1_shear_fix.json").read_text(encoding="utf-8")) wb = openpyxl.load_workbook(XLSX) ws = wb["수정 내역"] if any(r[0].value == "R-10" for r in ws.iter_rows(min_row=4)): sys.exit("R-10 이 이미 있음 - 중단") def append_like(sheet, values, like_row): r = sheet.max_row + 1 for j, v in enumerate(values, 1): c = sheet.cell(row=r, column=j, value=v) s = sheet.cell(row=like_row, column=j) c.font = copy.copy(s.font) c.fill = copy.copy(s.fill) c.border = copy.copy(s.border) c.alignment = copy.copy(s.alignment) c.number_format = s.number_format sheet.auto_filter.ref = "A3:%s%d" % (openpyxl.utils.get_column_letter(sheet.max_column), r) return r so, ok = res["sanoe"], res["okseong"] b7, b9s, b10s, b9o = so["sample"]["B7"], so["sample"]["B9"], so["sample"]["B10"], ok["sample"]["B9"] n7, n9, n10, no9 = so["stat"]["B7_done"], so["stat"]["B9_done"], so["stat"]["B10_done"], ok["stat"]["B9_done"] rows = [ ["R-10", "옥성교", "기초 C형 띠철근 B9 (H19) 갈고리 연장", "B9 (tie-C)", "양 끝 연장 57.1 / 길이 %.1f (재료표 L 4,763 보다 짧음)" % b9o["len_old"], "양 끝 연장 %.1f / 길이 %.1f (= 재료표 L)" % (b9o["tail_new"], b9o["len_new"]), no9, "사용자 승인 2026-10-26: 도면에 값이 있으면 재료표 길이를 따름 → 연장을 늘려 중심선 길이 = 재료표 L. 걸림 높이 126 / 2124 는 바깥 주철근에 이미 걸려 있어 유지", "옥성교P1_G5_수정3_20261026.3dm", "저장 직전 문서 확인: 171본 모두 길이 4,763.0, 객체 수 %d → %d 동일, 파이프 부피 오차 0.2%% 이내" % (ok["objects_before"], ok["objects_after"]), "연장 %.1f < KDS 5db 95.5 (1.5mm 부족) — 재료표 L 을 따른 결과. 설계자 확인" % b9o["tail_new"]], ["R-11", "산외교", "기초 세로철근 B7 (H13) 양 끝 높이", "B7 (H13 세로철근)", "양 끝 z 166 / 2384 (바깥 주철근 150 / 2400 안쪽) / 길이 %.1f" % b7["len_old"], "양 끝 z 132.5 / 2414.5 (바깥 주철근에 걸림: 150−11−6.5, 2400+8+6.5) / 길이 %.1f" % b7["len_new"], n7, "사용자 승인 2026-10-26: 피복 밖으로 나갈 수 있는 철근은 전단·세로철근, 주철근에 걸어줌 (운곡교 B9·옥성교 B9 와 같은 방식)", "산외교P1 G5_수정3_20261026.3dm", "저장 직전 문서 확인: 98본 z 범위 132.5~2414.5, 갈고리 R19.5·연장 80.5 유지(KDS H13 최소 R 19.05, 5db 65 만족). 객체 수 %d → %d 동일" % (so["objects_before"], so["objects_after"]), "도면 B7 값은 [추론](체크무늬 98본, 갈고리 +Y). 길이 %.1f > 재료표 L 2,418 (+47) — 설계자 확인" % b7["len_new"]], ["R-12", "산외교", "기초 중간 직선철근 B9·B10 (H16) 갈고리 연장", "B9, B10", "연장 76 / 길이 %.1f (재료표 L 7,500)" % b9s["len_old"], "연장 %.1f / 길이 %.1f (= 재료표 L)" % (b9s["tail_new"], b9s["len_new"]), n9 + n10, "사용자 승인 2026-10-26: 연장을 늘려 중심선 길이 = 재료표 L (도면에 값이 있으면 재료표를 따름)", "산외교P1 G5_수정3_20261026.3dm", "저장 직전 문서 확인: B9 7본·B10 7본 모두 길이 7,500.0, 연장 86.3 ≥ KDS 5db 79.5", "-"], ] for row in rows: append_like(ws, row, 4) ev = wb["수정 증거(마크별)"] ev_rows = [ ["옥성교", "B9", "H19", "전단철근 갈고리 연장", no9, "연장 57.1 / 길이 %.1f" % b9o["len_old"], "연장 %.1f / 길이 %.1f" % (b9o["tail_new"], b9o["len_new"]), round((b9o["len_new"] - b9o["len_old"]) * no9, 1), "합계 길이 변화(mm). 재료표 L 4,763 에 맞춤"], ["산외교", "B7", "H13", "세로철근 끝 높이(기초 하단 기준 mm)", n7, "z 166 / 2384, 길이 %.1f" % b7["len_old"], "z 132.5 / 2414.5, 길이 %.1f" % b7["len_new"], round((b7["len_new"] - b7["len_old"]) * n7, 1), "합계 길이 변화(mm). 바깥 주철근에 걸림"], ["산외교", "B9", "H16", "중간 직선철근 갈고리 연장", n9, "연장 76 / 길이 %.1f" % b9s["len_old"], "연장 %.1f / 길이 %.1f" % (b9s["tail_new"], b9s["len_new"]), round((b9s["len_new"] - b9s["len_old"]) * n9, 1), "재료표 L 7,500 에 맞춤"], ["산외교", "B10", "H16", "중간 직선철근 갈고리 연장", n10, "연장 76 / 길이 %.1f" % b10s["len_old"], "연장 %.1f / 길이 %.1f" % (b10s["tail_new"], b10s["len_new"]), round((b10s["len_new"] - b10s["len_old"]) * n10, 1), "재료표 L 7,500 에 맞춤"], ] for row in ev_rows: append_like(ev, row, 4) hold = wb["미수정·보류"] for r in hold.iter_rows(min_row=4): if r[0].value == "산외교" and str(r[1].value).startswith("B7"): r[3].value = "수정 완료(2026-10-26): 양 끝을 바깥 주철근에 걸리게 옮김 (z 132.5 / 2414.5)" r[4].value = "도면 값이 [추론]이고 길이 2,465.3 이 재료표 L 2,418 보다 47mm 김. '수정 내역' R-11" r[5].value = "설계자 확인 (도면 B7 형상·길이)" append_like(hold, ["옥성교", "B9 (H19 C형 띠철근)", "171본", "연장 93.9 < KDS 5db 95.5 (1.5mm 부족)", "재료표 L 4,763 에 맞춘 결과. 연장을 KDS 로 키우면 L 초과. '수정 내역' R-10", "설계자 확인 (L 과 KDS 중 우선)", "R-10"], 4) append_like(hold, ["산외·옥성교", "B8·B10·B11·B12 등 겹침 이음이 있는 띠·루프철근", "-", "재료표 L 에 겹침 J 가 있으나 형상에 없음", "공통 문제 C-3(겹침 길이를 형상에 넣을지 정책 미정)이라 이번에는 수정하지 않음", "정책 결정", "C-3"], 4) # 파일·해시 fs = wb["수정 파일·해시"] def sha(p): h = hashlib.sha256() with open(p, "rb") as f: for blk in iter(lambda: f.read(1 << 20), b""): h.update(blk) return h.hexdigest() for r in fs.iter_rows(min_row=4): if r[1].value in ("검토파일/검토_산외교P1/산외교P1 G5_수정2_20261026.3dm", "검토파일/검토_옥성교P1/옥성교P1_G5_수정2_20261026.3dm"): r[3].value = "중간본" r[3].fill = PatternFill(fill_type=None) new_files = [("산외교", "검토_산외교P1/산외교P1 G5_수정3_20261026.3dm", "기초 전단·세로철근(B7 걸기, B9·B10 연장) 포함 — 전체 수정 포함"), ("옥성교", "검토_옥성교P1/옥성교P1_G5_수정3_20261026.3dm", "기초 C형 띠철근 B9 연장 포함 — 전체 수정 포함")] latest_fill = copy.copy(fs.cell(row=9, column=4).fill) for b, rel, what in new_files: p = REV / rel stt = p.stat() r = append_like(fs, [b, "검토파일/" + rel, what, "최신", round(stt.st_size / 1e6, 1), datetime.datetime.fromtimestamp(stt.st_mtime).strftime("%Y-%m-%d %H:%M"), sha(p)], 4) fs.cell(row=r, column=4).fill = PatternFill("solid", fgColor="FFE2EFDA") wb.save(XLSX) print("saved", XLSX)