"""산외교 J 겹침(코핑 전단철근 시험 수정4 + 기초 B2·B5·B8 수정5, 2026-10-27)을 엑셀에 반영한다. 백업(양쪽 폴더) → Pier_T 사본 수정 → 원본 폴더로 복사 → SHA-256 확인. R-19 가 이미 있으면 중단.""" import copy, datetime, hashlib, json, shutil, sys from pathlib import Path import openpyxl from openpyxl.drawing.image import Image as XLImage from openpyxl.styles import Alignment, PatternFill ROOT = Path(r"D:\★Pier 자료\프로그램\Pier_T") REV = ROOT / "검토파일" ORIG = Path(r"D:\★Pier 자료\심수석님 검토 파일") NAME = "4개교_공통사항_종합.xlsx" W = Path(r"C:\Users\User\AppData\Local\PierApp\jobs\c1_work") cop = json.loads((W / "c1_lap_sanoe.json").read_text(encoding="utf-8")) ft = json.loads((W / "c1_lap_sanoe_footing.json").read_text(encoding="utf-8")) stamp = datetime.date.today().strftime("%Y%m%d") for d in (REV, ORIG): shutil.copy2(d / NAME, d / ("4개교_공통사항_종합_백업_%s_산외J겹침.xlsx" % stamp)) wb = openpyxl.load_workbook(REV / NAME) ws = wb["수정 내역"] if any(r[0].value == "R-19" for r in ws.iter_rows(min_row=4)): sys.exit("R-19 이미 있음") GREEN = PatternFill("solid", fgColor="FFE2EFDA") 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 cs, fs_ = cop["stat"], ft["stat"] ncop = sum(cs.values()); nft = sum(fs_.values()) r = append_like(ws, ["R-19", "산외교", "J(겹침이음) 반영 — 코핑 전단철근(시험) + 기초 B2·B5·B8", "코핑 C7·C8·C9·C10·C12·C13 / 기초 B2·B5(IV, J=1,000), B8(V, J=570)", "J 표기 없이 1본 연속 형상(ㅁ·U·ㄷ 한 줄)", "재료표 J 를 반영해 2조각으로 나누고 J 만큼 같은 선에서 겹침 (코핑 %d본 + 기초 %d본, 조각 중심선 길이 합 = 기존 + J(IV·VIII) / +2J(II·V))" % (ncop, nft), ncop + nft, "대호지교 코드의 겹침 방식(II 뚜껑+바닥, III/XII/V 좌·우 ㄷ, VIII/IV L 두 개 + J 겹침). 사용자 요청 2026-10-27: 기초도 코핑처럼 수정", "산외교P1 G5_수정4_20261026.3dm (코핑), 산외교P1 G5_수정5_20261027.3dm (코핑+기초, 최신)", "객체 수 2004 → 2316 → 2454 (기초 B2 31·B5 31·B8 7본 → 조각 추가). 기초 평균 조각 합: B2 11757→12757, B5 11713→12713, B8 29339→30479. 파이프 부피 오차 0.5%% 이내, Rhino 캡처로 겹침 위치 확인", "재료표 L(B8 31,581 등)은 III/XII/V 에서 2A+2B+4J 인데 모델 조각은 +2J 만 반영(도면 그림도 겹침 2곳) → 설계자 확인. 코핑 기둥(P2) 후프 J 380 및 다른 3개 교량은 미작업"], 4) ws.cell(row=r, column=1).fill = GREEN ev = wb["수정 증거(마크별)"] for m, v in (("B2", "IV"), ("B5", "IV"), ("B8", "V")): i = ft["info"][m] append_like(ev, ["산외교", m, "-", "J 겹침 2조각(기초 %s)" % v, i["bars"], "1본 연속, 길이 평균 %.1f" % i["avg_len_old"], "2조각 J 겹침, 조각 길이 합 평균 %.1f" % i["avg_len_new_sum_of_pieces"], round(i["avg_len_new_sum_of_pieces"] - i["avg_len_old"], 1), "R-19. 파일 산외교P1 G5_수정5_20261027.3dm"], 4) for m, i in cop["info"].items(): append_like(ev, ["산외교", m, "-", "J 겹침 2조각(코핑 전단)", i["bars"], "1본 연속, 길이 평균 %.1f" % i["avg_len_old"], "2조각 J 겹침, 조각 길이 합 평균 %.1f" % i["avg_len_new_sum_of_pieces"], round(i["avg_len_new_sum_of_pieces"] - i["avg_len_old"], 1), "R-19. 파일 산외교P1 G5_수정4_20261026.3dm"], 4) fs = wb["수정 파일·해시"] def sha(p): h = hashlib.sha256() with open(p, "rb") as f: for b in iter(lambda: f.read(1 << 20), b""): h.update(b) return h.hexdigest() for row in fs.iter_rows(min_row=4): if str(row[1].value).endswith("산외교P1 G5_수정2_20261026.3dm") and row[3].value == "최신": row[3].value = "승인본(J 겹침 전)"; row[3].fill = PatternFill(fill_type=None) for nm, note, st in (("산외교P1 G5_수정4_20261026.3dm", "코핑 전단철근 J 겹침(시험)", "중간본"), ("산외교P1 G5_수정5_20261027.3dm", "코핑 + 기초 B2·B5·B8 J 겹침 — 전체 수정 포함", "최신")): p = REV / "검토_산외교P1" / nm s = p.stat() rr = append_like(fs, ["산외교", "검토파일/검토_산외교P1/" + nm, note, st, round(s.st_size / 1e6, 1), datetime.datetime.fromtimestamp(s.st_mtime).strftime("%Y-%m-%d %H:%M"), sha(p)], 4) if st == "최신": fs.cell(row=rr, column=4).fill = GREEN wd = wb["공통 문제 상세(이미지)"] nr = wd.max_row + 1 like = nr - 1 vals = {1: "C-3", 2: "[개별] 산외교 J(겹침이음) 반영 — 코핑 전단철근 + 기초 B2·B5·B8 (수정4·5)", 7: "재료표 J(B2·B5 형상 IV J=1,000, B8 형상 V J=570)가 모델에 없고 1본 연속 형상이었음", 8: "대호지교 방식: IV → L 두 개를 하부 직선 중앙에서 J 만큼 겹침, V → 좌·우 ㄷ 두 개를 위·아래 변 중앙에서 겹침", 9: "수정 완료(2026-10-27) 'R-19'. 기초 B2 %d·B5 %d·B8 %d본, 코핑 %d본. 재료표 L 의 4J(III/XII/V)와 모델 2J 차이는 설계자 확인" % (fs_["B2_done"], fs_["B5_done"], fs_["B8_done"], ncop)} for col, v in vals.items(): c = wd.cell(row=nr, column=col, value=v) s = wd.cell(row=like, column=col) c.font = copy.copy(s.font); c.fill = copy.copy(s.fill); c.border = copy.copy(s.border) c.alignment = Alignment(wrap_text=True, vertical="top") wd.cell(row=nr, column=9).fill = copy.copy(GREEN) wd.row_dimensions[nr].height = 360 im = XLImage(str(REV / "수정후_캡처" / "산외교_기초J겹침_전후.png")) w0, h0 = im.width, im.height im.width, im.height = 1000, int(1000 * h0 / w0) wd.add_image(im, "F%d" % nr) wb.save(REV / NAME) shutil.copy2(REV / NAME, ORIG / NAME) print("sha equal:", sha(REV / NAME) == sha(ORIG / NAME), sha(REV / NAME)[:16], "images:", len(openpyxl.load_workbook(REV / NAME)["공통 문제 상세(이미지)"]._images), "row", nr)