feat(536-1): E05 보고서 암반검토 시트(있을 때만) — E06 해석 조건 · 절리군 · 측점 위험 모드 × 조건 Fs · 판정 · 양식 s11 · 자리표 · E06 저장본에 절리군
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -3687,6 +3687,452 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "s11",
|
||||
"이름": "암반검토",
|
||||
"칸": {
|
||||
"A1": {
|
||||
"값": "암반 비탈면 검토 (평사투영 · 한계평형)",
|
||||
"서식": 1
|
||||
},
|
||||
"B1": {
|
||||
"서식": 1
|
||||
},
|
||||
"C1": {
|
||||
"서식": 1
|
||||
},
|
||||
"D1": {
|
||||
"서식": 1
|
||||
},
|
||||
"E1": {
|
||||
"서식": 1
|
||||
},
|
||||
"F1": {
|
||||
"서식": 1
|
||||
},
|
||||
"G1": {
|
||||
"서식": 1
|
||||
},
|
||||
"H1": {
|
||||
"서식": 1
|
||||
},
|
||||
"A2": {
|
||||
"값": "절리 = 현장 조사값(사용자 입력) · Markland 운동학 판정 · Hoek-Bray 평면 · 쐐기 안전율(KDS 11 70 05) · 문헌 추정치",
|
||||
"서식": 2
|
||||
},
|
||||
"B2": {
|
||||
"서식": 2
|
||||
},
|
||||
"C2": {
|
||||
"서식": 2
|
||||
},
|
||||
"D2": {
|
||||
"서식": 2
|
||||
},
|
||||
"E2": {
|
||||
"서식": 2
|
||||
},
|
||||
"F2": {
|
||||
"서식": 2
|
||||
},
|
||||
"G2": {
|
||||
"서식": 2
|
||||
},
|
||||
"H2": {
|
||||
"서식": 2
|
||||
},
|
||||
"A4": {
|
||||
"값": "1. 해석 조건 · 판정 요약",
|
||||
"서식": 3
|
||||
},
|
||||
"B4": {
|
||||
"서식": 3
|
||||
},
|
||||
"C4": {
|
||||
"서식": 3
|
||||
},
|
||||
"D4": {
|
||||
"서식": 3
|
||||
},
|
||||
"E4": {
|
||||
"서식": 3
|
||||
},
|
||||
"F4": {
|
||||
"서식": 3
|
||||
},
|
||||
"G4": {
|
||||
"서식": 3
|
||||
},
|
||||
"H4": {
|
||||
"서식": 3
|
||||
},
|
||||
"A5": {
|
||||
"값": "투영 · 측방 한계",
|
||||
"서식": 4
|
||||
},
|
||||
"B5": {
|
||||
"서식": 5
|
||||
},
|
||||
"C5": {
|
||||
"서식": 5
|
||||
},
|
||||
"D5": {
|
||||
"서식": 5
|
||||
},
|
||||
"E5": {
|
||||
"서식": 5
|
||||
},
|
||||
"F5": {
|
||||
"서식": 5
|
||||
},
|
||||
"G5": {
|
||||
"서식": 5
|
||||
},
|
||||
"H5": {
|
||||
"서식": 5
|
||||
},
|
||||
"A6": {
|
||||
"값": "암 단위중량",
|
||||
"서식": 4
|
||||
},
|
||||
"B6": {
|
||||
"서식": 5
|
||||
},
|
||||
"C6": {
|
||||
"서식": 5
|
||||
},
|
||||
"D6": {
|
||||
"서식": 5
|
||||
},
|
||||
"E6": {
|
||||
"서식": 5
|
||||
},
|
||||
"F6": {
|
||||
"서식": 5
|
||||
},
|
||||
"G6": {
|
||||
"서식": 5
|
||||
},
|
||||
"H6": {
|
||||
"서식": 5
|
||||
},
|
||||
"A7": {
|
||||
"값": "우기 지하수",
|
||||
"서식": 4
|
||||
},
|
||||
"B7": {
|
||||
"서식": 5
|
||||
},
|
||||
"C7": {
|
||||
"서식": 5
|
||||
},
|
||||
"D7": {
|
||||
"서식": 5
|
||||
},
|
||||
"E7": {
|
||||
"서식": 5
|
||||
},
|
||||
"F7": {
|
||||
"서식": 5
|
||||
},
|
||||
"G7": {
|
||||
"서식": 5
|
||||
},
|
||||
"H7": {
|
||||
"서식": 5
|
||||
},
|
||||
"A8": {
|
||||
"값": "인장균열 · 볼트",
|
||||
"서식": 4
|
||||
},
|
||||
"B8": {
|
||||
"서식": 5
|
||||
},
|
||||
"C8": {
|
||||
"서식": 5
|
||||
},
|
||||
"D8": {
|
||||
"서식": 5
|
||||
},
|
||||
"E8": {
|
||||
"서식": 5
|
||||
},
|
||||
"F8": {
|
||||
"서식": 5
|
||||
},
|
||||
"G8": {
|
||||
"서식": 5
|
||||
},
|
||||
"H8": {
|
||||
"서식": 5
|
||||
},
|
||||
"A9": {
|
||||
"값": "판정 요약",
|
||||
"서식": 4
|
||||
},
|
||||
"B9": {
|
||||
"서식": 5
|
||||
},
|
||||
"C9": {
|
||||
"서식": 5
|
||||
},
|
||||
"D9": {
|
||||
"서식": 5
|
||||
},
|
||||
"E9": {
|
||||
"서식": 5
|
||||
},
|
||||
"F9": {
|
||||
"서식": 5
|
||||
},
|
||||
"G9": {
|
||||
"서식": 5
|
||||
},
|
||||
"H9": {
|
||||
"서식": 5
|
||||
},
|
||||
"A11": {
|
||||
"값": "2. 절리군 (현장 조사값)",
|
||||
"서식": 3
|
||||
},
|
||||
"B11": {
|
||||
"서식": 3
|
||||
},
|
||||
"C11": {
|
||||
"서식": 3
|
||||
},
|
||||
"D11": {
|
||||
"서식": 3
|
||||
},
|
||||
"E11": {
|
||||
"서식": 3
|
||||
},
|
||||
"F11": {
|
||||
"서식": 3
|
||||
},
|
||||
"G11": {
|
||||
"서식": 3
|
||||
},
|
||||
"H11": {
|
||||
"서식": 3
|
||||
},
|
||||
"A12": {
|
||||
"값": "절리군",
|
||||
"서식": 6
|
||||
},
|
||||
"B12": {
|
||||
"값": "경사방향 (°)",
|
||||
"서식": 6
|
||||
},
|
||||
"C12": {
|
||||
"값": "경사 (°)",
|
||||
"서식": 6
|
||||
},
|
||||
"D12": {
|
||||
"값": "φj (°)",
|
||||
"서식": 6
|
||||
},
|
||||
"E12": {
|
||||
"값": "cj (kPa)",
|
||||
"서식": 6
|
||||
},
|
||||
"F12": {
|
||||
"값": "지속성 (m)",
|
||||
"서식": 6
|
||||
},
|
||||
"G12": {
|
||||
"값": "구간 시작",
|
||||
"서식": 6
|
||||
},
|
||||
"H12": {
|
||||
"값": "구간 끝",
|
||||
"서식": 6
|
||||
},
|
||||
"A13": {
|
||||
"서식": 7
|
||||
},
|
||||
"B13": {
|
||||
"서식": 16
|
||||
},
|
||||
"C13": {
|
||||
"서식": 16
|
||||
},
|
||||
"D13": {
|
||||
"서식": 16
|
||||
},
|
||||
"E13": {
|
||||
"서식": 16
|
||||
},
|
||||
"F13": {
|
||||
"서식": 13
|
||||
},
|
||||
"G13": {
|
||||
"서식": 7
|
||||
},
|
||||
"H13": {
|
||||
"서식": 7
|
||||
},
|
||||
"A15": {
|
||||
"값": "3. 측점별 판정 — 위험 모드 × 조건",
|
||||
"서식": 3
|
||||
},
|
||||
"B15": {
|
||||
"서식": 3
|
||||
},
|
||||
"C15": {
|
||||
"서식": 3
|
||||
},
|
||||
"D15": {
|
||||
"서식": 3
|
||||
},
|
||||
"E15": {
|
||||
"서식": 3
|
||||
},
|
||||
"F15": {
|
||||
"서식": 3
|
||||
},
|
||||
"G15": {
|
||||
"서식": 3
|
||||
},
|
||||
"H15": {
|
||||
"서식": 3
|
||||
},
|
||||
"A16": {
|
||||
"값": "측점",
|
||||
"서식": 6
|
||||
},
|
||||
"B16": {
|
||||
"값": "비탈 (경사 / 방향 · 높이)",
|
||||
"서식": 6
|
||||
},
|
||||
"C16": {
|
||||
"값": "파괴 형태",
|
||||
"서식": 6
|
||||
},
|
||||
"D16": {
|
||||
"값": "조건",
|
||||
"서식": 6
|
||||
},
|
||||
"E16": {
|
||||
"값": "Fs",
|
||||
"서식": 6
|
||||
},
|
||||
"F16": {
|
||||
"값": "기준",
|
||||
"서식": 6
|
||||
},
|
||||
"G16": {
|
||||
"값": "판정",
|
||||
"서식": 6
|
||||
},
|
||||
"H16": {
|
||||
"값": "비고",
|
||||
"서식": 6
|
||||
},
|
||||
"A17": {
|
||||
"서식": 7
|
||||
},
|
||||
"B17": {
|
||||
"서식": 5
|
||||
},
|
||||
"C17": {
|
||||
"서식": 7
|
||||
},
|
||||
"D17": {
|
||||
"서식": 7
|
||||
},
|
||||
"E17": {
|
||||
"서식": 8
|
||||
},
|
||||
"F17": {
|
||||
"서식": 8
|
||||
},
|
||||
"G17": {
|
||||
"서식": 7
|
||||
},
|
||||
"H17": {
|
||||
"서식": 5
|
||||
}
|
||||
},
|
||||
"병합": [
|
||||
"A1:H1",
|
||||
"A2:H2",
|
||||
"A4:H4",
|
||||
"B5:H5",
|
||||
"B6:H6",
|
||||
"B7:H7",
|
||||
"B8:H8",
|
||||
"B9:H9",
|
||||
"A11:H11",
|
||||
"A15:H15"
|
||||
],
|
||||
"열": {
|
||||
"A": {
|
||||
"폭": 14
|
||||
},
|
||||
"B": {
|
||||
"폭": 26
|
||||
},
|
||||
"C": {
|
||||
"폭": 16
|
||||
},
|
||||
"D": {
|
||||
"폭": 7
|
||||
},
|
||||
"E": {
|
||||
"폭": 8
|
||||
},
|
||||
"F": {
|
||||
"폭": 8
|
||||
},
|
||||
"G": {
|
||||
"폭": 8
|
||||
},
|
||||
"H": {
|
||||
"폭": 24
|
||||
}
|
||||
},
|
||||
"행": {
|
||||
"1": {
|
||||
"높이": 36
|
||||
},
|
||||
"2": {
|
||||
"높이": 30
|
||||
},
|
||||
"4": {
|
||||
"높이": 22
|
||||
},
|
||||
"11": {
|
||||
"높이": 22
|
||||
},
|
||||
"12": {
|
||||
"높이": 22
|
||||
},
|
||||
"15": {
|
||||
"높이": 22
|
||||
},
|
||||
"16": {
|
||||
"높이": 22
|
||||
}
|
||||
},
|
||||
"보기": {
|
||||
"눈금선": false
|
||||
},
|
||||
"인쇄": {
|
||||
"용지": "A4",
|
||||
"방향": "portrait",
|
||||
"맞춤": {
|
||||
"폭": 1,
|
||||
"높이": 0
|
||||
},
|
||||
"여백": {
|
||||
"위": 15,
|
||||
"아래": 15,
|
||||
"왼": 10,
|
||||
"오른": 10
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "s10",
|
||||
"이름": "부록_절편",
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
|
||||
## 공통
|
||||
|
||||
- 몫: 사용자 몫(표지 · 개요) = 처음 만들 때만 채움 · 다시 만들 때(보고서 갱신) 안 건드림. 프로그램 몫(목차 · 입력조건 · 측점표 · 대표단면 · 3D요약 · 광역요약 · 보강검토 · 부록_절편) = 갱신 때 통째 다시 씀 · 작업본에 없는 프로그램 몫 시트는 양식 차례 자리에 끼움 · 새 서식은 작업본 서식 표 끝에 붙여 번호를 바꿈.
|
||||
- 시트 차례: 표지 · 목차 · 개요 · 입력조건 · 측점표 · 대표단면 · 3D요약 · 광역요약 · (보강검토) · 부록_절편.
|
||||
- 몫: 사용자 몫(표지 · 개요) = 처음 만들 때만 채움 · 다시 만들 때(보고서 갱신) 안 건드림. 프로그램 몫(목차 · 입력조건 · 측점표 · 대표단면 · 3D요약 · 광역요약 · 보강검토 · 암반검토 · 부록_절편) = 갱신 때 통째 다시 씀 · 작업본에 없는 프로그램 몫 시트는 양식 차례 자리에 끼움 · 새 서식은 작업본 서식 표 끝에 붙여 번호를 바꿈.
|
||||
- 시트 차례: 표지 · 목차 · 개요 · 입력조건 · 측점표 · 대표단면 · 3D요약 · 광역요약 · (보강검토) · (암반검토) · 부록_절편.
|
||||
- PDF: 표지 = 쪽 번호 · 머리말 없음 · 본문 = 머리말(왼 사업명 = 표지 `C8` · 오른 보고서 이름) · 꼬리말 「- n / N -」(목차 = 1 쪽).
|
||||
- 사용자 확정 전 표기 한 규칙 — 기본값 그대로 = 「(기본값 · 사용자 확정 전)」 · 바꿈 = 「(사용자 입력)」 · 물성 = 「문헌 추정치 · 사용자 확정 전」.
|
||||
- 서식 번호(`서식` 표): 1 title · 2 sub · 3 section · 4 label · 5 text · 6 head · 7 body(가운데 글) · 8 fs(0.00) · 9 int(0) · 10 ng(N.G 빨강 채움) · 11 ok(O.K 초록) · 12 notice · 13 num1(#,##0.0) · 14 num0(#,##0) · 15 para(위 맞춤 긴 글) · 16 prop(0.0) · 17 chain(#,##0.00) · 18 head8 · 19 num8(0.00) · 20 num8(0.0) · 21 int8 · 22 목차 내용 · 23 목차 쪽 · 24 목차 장 · 25 sum8(0.00 · 회색) · 26 표지 제목.
|
||||
@@ -117,6 +117,14 @@
|
||||
|
||||
- 6 행 · 10 행 서식을 줄마다 복사 · 저장본 = (측점 · 종류 · 비탈)마다 가장 최근 하나.
|
||||
|
||||
## s11 암반검토 (프로그램 몫 · E06 암반 해석 저장본 · 없으면 시트를 뺌)
|
||||
|
||||
| 칸 | 내용 |
|
||||
| --- | --- |
|
||||
| `B5`~`B9` (각 B:H 병합 · 서식 5) | 투영 · 측방 한계 · 암 단위중량 · 우기 지하수(KDS 11 70 05 표 4.3-3 암반 ½ 심도) · 인장균열 · 볼트 · 판정 요약(낡으면 「E06 [해석] 뒤 [보고서 갱신]」) — 기본값 그대로 = 사용자 확정 전 표기 |
|
||||
| 11 · 12 행 꼴(제목 3 · 머리 6) 다음 절리군 하나 = 한 줄(13 행 서식) | A 이름(7) · B 경사방향 · C 경사 · D φj · E cj(16) · F 지속성(13) · G · H 구간 시작 · 끝(7) · 모르면 「-」 · 없으면 「절리군 없음」 |
|
||||
| 절리 줄 다음 한 줄 띄고 15 · 16 행 꼴 · 그 아래 측점 비탈 × 위험 모드 × 조건 = 한 줄(17 행 서식) | A 측점(7) · B 비탈 글(쪽 · 경사 / 방향 · 높이)(5) · C 파괴 형태(평면 · 쐐기 · 전도 + 절리)(7) · D 조건(7) · E Fs · F 기준(8) · G 판정(7 → 10 · 11 · 전도 「검토」) · H 비고(블록 안 생김 · 미끄러짐 면 · 지속성)(5) · 위험 모드 없는 비탈 = 「없음」 한 줄 |
|
||||
|
||||
## s10 부록_절편 (프로그램 몫 · 대표 단면마다 한 쪽)
|
||||
|
||||
양식 1~5 행 = 덩이 꼴(1 제목 · 2 단위 · 3 머리 · 4 절편 줄 서식 · 5 합계 서식). 대표 단면마다 지배 조건(Fs / 기준 가장 낮음) 임계면의 절편표.
|
||||
|
||||
@@ -37,7 +37,7 @@ STYLE_KEYS = {
|
||||
PRINT_KEYS = {"용지", "방향", "배율", "맞춤", "여백", "머리행", "쪽나눔"}
|
||||
A1 = re.compile(r"^([A-Z]{1,3})(\d+)$")
|
||||
NAMES = [
|
||||
"표지", "목차", "개요", "입력조건", "측점표", "대표단면", "3D요약", "광역요약", "보강검토",
|
||||
"표지", "목차", "개요", "입력조건", "측점표", "대표단면", "3D요약", "광역요약", "보강검토", "암반검토",
|
||||
"부록_절편",
|
||||
] # fmt: skip
|
||||
|
||||
@@ -151,7 +151,7 @@ def test_양식_계약():
|
||||
book = _form()
|
||||
_contract(book)
|
||||
assert [s["이름"] for s in book["시트"]] == NAMES
|
||||
ids = ["s1", "s9", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s10"]
|
||||
ids = ["s1", "s9", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s11", "s10"]
|
||||
assert [s["id"] for s in book["시트"]] == ids
|
||||
|
||||
|
||||
@@ -174,6 +174,7 @@ def test_양식_인쇄_쪽나눔_머리행_그림():
|
||||
"3D요약": 1,
|
||||
"광역요약": 0,
|
||||
"보강검토": 0,
|
||||
"암반검토": 0,
|
||||
}
|
||||
# N.G 빨강 조건부 서식 — 측점표 판정 열 · 서식 표에 N.G 칸 서식(빌더가 인쇄 · xlsx 용으로 직접 씀)
|
||||
assert by["측점표"]["조건부서식"][0]["범위"][0]["c0"] == 9
|
||||
@@ -237,9 +238,10 @@ def test_견본_pdf_쪽수_머리행(png):
|
||||
)
|
||||
sections = [i for i, t in enumerate(texts) if "대표 단면" in t and "안전율 Fs" in t]
|
||||
assert len(sections) == 2 # 단면마다 한 쪽
|
||||
# 표지 1 + 목차 1 + 개요 1 + 입력조건 1 + 측점표 n + 대표단면 2 + 3D 1 + 광역 1 + 보강 1 + 부록 1
|
||||
# 표지 1 + 목차 1 + 개요 1 + 입력조건 1 + 측점표 n + 대표단면 2 + 3D 1 + 광역 1 + 보강 1 + 암반 1
|
||||
# + 부록 1
|
||||
# (양식 빈 판)
|
||||
assert len(pages) == 1 + 1 + 1 + 1 + len(stab) + 2 + 1 + 1 + 1 + 1
|
||||
assert len(pages) == 1 + 1 + 1 + 1 + len(stab) + 2 + 1 + 1 + 1 + 1 + 1
|
||||
assert all(float(pages[i].mediabox.width) > float(pages[i].mediabox.height) for i in stab)
|
||||
html = spreadsheet.print_htmls([{"book": book, "figures": {k: png for k in figs}}])[0]
|
||||
assert html.count("<img ") == 3 # 단면 2 + 3D 띠 1
|
||||
|
||||
@@ -443,3 +443,51 @@ def test_analyze_station(monkeypatch):
|
||||
nets = model.station_net(e, _doc()["settings"])
|
||||
assert set(nets) == {"equal_angle", "equal_area", "phi"}
|
||||
assert nets["equal_area"]["zones"]["planar"]
|
||||
|
||||
|
||||
def test_e05_rock_sheet(monkeypatch):
|
||||
"""E05 암반검토 s11 — 조건 글 · 절리군 줄 · 측점 위험 모드 × 조건 줄 · 판정 서식."""
|
||||
from E05_StabReport import E05_StabReport_Build as build
|
||||
from E05_StabReport import E05_StabReport_Rock as rock
|
||||
from E06_StabRock import E06_StabRock_Router as router
|
||||
|
||||
cross, design = _cross("left")
|
||||
monkeypatch.setattr(
|
||||
model,
|
||||
"rock_stations",
|
||||
lambda _s: [{"chainage_m": 20.0, "label": "STA", "ground_type": "ripping_rock"}],
|
||||
)
|
||||
monkeypatch.setattr(model.src, "cross_section", lambda _s, _c: {**cross, "design": design})
|
||||
ground = {
|
||||
"materials": [],
|
||||
"stations": [],
|
||||
"safety_factors": {"dry": {"cut": 1.5}, "wet": {"cut": 1.2}},
|
||||
"seismic": {"enabled": False},
|
||||
}
|
||||
doc = _doc()
|
||||
stations = model.analyze(None, doc, ground)
|
||||
value = {
|
||||
"fingerprint": "fp",
|
||||
"settings": doc["settings"],
|
||||
"sets": doc["sets"],
|
||||
"summary": router._summary(stations),
|
||||
"stations": stations,
|
||||
"stale": False,
|
||||
}
|
||||
sheet = next(s for s in build.form()["시트"] if s["id"] == "s11")
|
||||
rock.fill_rock(sheet, value, {})
|
||||
cells = sheet["칸"]
|
||||
assert "기본값 · 사용자 확정 전" in cells["B7"]["값"] and "½" in cells["B7"]["값"]
|
||||
assert cells["B9"]["값"].startswith("깎기 비탈 1")
|
||||
assert cells["A13"]["값"] == doc["sets"][0]["name"]
|
||||
rows = [r for r in range(17, 40) if cells.get(f"A{r}", {}).get("값") == "STA"]
|
||||
assert len(rows) == len(stations[0]["cases"]) + len(stations[0]["kinematic"]["toppling"])
|
||||
for r, case in zip(rows, stations[0]["cases"]):
|
||||
assert cells[f"E{r}"]["값"] == pytest.approx(case["F"])
|
||||
assert cells[f"G{r}"]["값"] == ("O.K" if case["ok"] else "N.G")
|
||||
assert cells[f"G{r}"]["서식"] == (build.ST_OK if case["ok"] else build.ST_NG)
|
||||
old = {k: v for k, v in value.items() if k != "sets"} # 옛 저장본 = 측점에 실린 절리
|
||||
sheet = next(s for s in build.form()["시트"] if s["id"] == "s11")
|
||||
rock.fill_rock(sheet, old, {})
|
||||
assert sheet["칸"]["A13"]["값"] == doc["sets"][0]["name"]
|
||||
assert sheet["칸"]["G13"]["값"] == "-" # 구간 모름
|
||||
|
||||
Reference in New Issue
Block a user