- 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>
97 lines
6.4 KiB
Python
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)
|