Files
Pier_v1/Code/검토수정/스크립트/add_lap_sanoe_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

97 lines
6.4 KiB
Python

"""산외교 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)