Merge remote-tracking branch 'origin/main_desktop_1' into sub_laptop_1
This commit is contained in:
@@ -38,6 +38,14 @@ from dataclasses import dataclass, field
|
||||
from typing import Any, Iterable
|
||||
|
||||
from common_util.common_util_structure_face_role import structure_face_role
|
||||
from common_util.common_util_excavation import (
|
||||
BASIS_WALL,
|
||||
WALL_BLINDING_DEPTH_M,
|
||||
WALL_FOUNDATION_DEPTH_M,
|
||||
WALL_TRENCH_CLEARANCE_M,
|
||||
wall_trench_area_m2,
|
||||
wall_trench_width_m,
|
||||
)
|
||||
from B08_Quantity.B08_Quantity_Engine_ObservedUnit import (
|
||||
BASIS_DERIVED,
|
||||
BASIS_OBSERVED,
|
||||
@@ -67,6 +75,17 @@ STONE_BACK_LENGTH_TABLE: dict[int, dict[str, float | None]] = {
|
||||
}
|
||||
DEFAULT_BACK_LENGTH_CM = 45
|
||||
|
||||
#: ⑤ 돌 중량이 어디서 온 값인가 (2026-09-08 사용자 확정 2차 ⑤ 「DB 확인 → 없으면 현재 유지,
|
||||
#: 나중에 프로그램에서 확인할 수 있게 근거를 남길 것」).
|
||||
#: ⚠ **품셈·교본에는 돌중량표가 없다** — 지식DB 전수 확인 결과 이 값이 나오는 곳은
|
||||
#: 실무 원단위 라이브러리 한 곳뿐이다(기술문서에는 그 라이브러리를 인용한 줄만 있음).
|
||||
#: 그래서 값을 바꾸지 않고 **어디서 온 값인지**를 줄마다 달아 화면에서 되짚게 한다.
|
||||
STONE_WEIGHT_SOURCE = "uljin_library"
|
||||
STONE_WEIGHT_BASIS = (
|
||||
"⚠ 실무 관측값 — 울진 소광 원단위 라이브러리 「돌뒷길이별 원단위표」(35·45·55㎝만 있음)."
|
||||
" 품셈·교본에는 돌중량표가 없음"
|
||||
)
|
||||
|
||||
|
||||
#: 돌 종류별 계수표 — 품셈 13-4-3·13-4-4 [주]① · 교본 7-3.
|
||||
#: ⚠ 지금까지 **건설품셈 참고자료 한 벌**(돌 종류로 안 갈리는 표)로만 돌고 있었다.
|
||||
@@ -92,6 +111,20 @@ def load_stone_kind_table() -> dict[str, Any]:
|
||||
return {}
|
||||
|
||||
|
||||
#: ⑨ 계수를 **어느 열로 볼 것인가** (2026-09-08 사용자 확정 2차 ⑨).
|
||||
#: 기본은 **품셈 열**(야면석 고임돌 0.11 · 채움 0.15)이고, 「실무 관행」으로 두면
|
||||
#: 건설품셈 참고자료 한 벌(깬돌 계열 0.15 · 0.20)로 덮어쓴다.
|
||||
#: ⚠ **빈 칸은 「안 정함」**이고 그때 기본(품셈)으로 선다 — 등록부 default 는 비어 있다.
|
||||
#: 기본값을 등록부가 아니라 여기가 갖는 것은 `face_slope_ratio` 와 같은 결이다.
|
||||
COEFF_BASIS_KEY = "stone_coeff_basis"
|
||||
COEFF_BASIS_PRACTICE = {"실무 관행", "실무관행", "practice", "관행"}
|
||||
|
||||
|
||||
def wants_practice_coefficients(options: dict[str, Any]) -> bool:
|
||||
"""계수를 실무 관행 열로 볼 것인가. 빈 칸이면 **아니오**(= 품셈 열)."""
|
||||
return str(options.get(COEFF_BASIS_KEY) or "").strip() in COEFF_BASIS_PRACTICE
|
||||
|
||||
|
||||
def stone_coefficients(options: dict[str, Any], back_cm: int) -> tuple[dict[str, Any], str]:
|
||||
"""(계수 한 벌, 알림). 돌 종류를 안 고르면 **종전 값**으로 돌되 그 사실을 알린다.
|
||||
|
||||
@@ -105,14 +138,21 @@ def stone_coefficients(options: dict[str, Any], back_cm: int) -> tuple[dict[str,
|
||||
return {}, ""
|
||||
if key not in [str(x) for x in (table.get("back_lengths_cm") or [])]:
|
||||
return {}, (f"뒷길이 {back_cm}㎝ 는 품셈 표(25·30·35·45·55·60·75㎝)에 없어 계수가 없습니다")
|
||||
if not kind:
|
||||
practice = wants_practice_coefficients(options)
|
||||
if not kind or practice:
|
||||
fallback = table.get("fallback") or {}
|
||||
message = (
|
||||
f"「{kind}」이지만 계수를 **실무 관행 열**(건설품셈 참고자료)로 덮어썼습니다 —"
|
||||
" 기본은 품셈 열입니다(확정 ⑨)"
|
||||
if practice and kind
|
||||
else str(fallback.get("message") or "")
|
||||
)
|
||||
return {
|
||||
"wedge_stone_m3_per_m2": (fallback.get("wedge_stone_m3_per_m2") or {}).get(key),
|
||||
"fill_concrete_m3_per_m2": (fallback.get("fill_concrete_m3_per_m2") or {}).get(key),
|
||||
"backfill_ratio": fallback.get("backfill_ratio_of_back_length"),
|
||||
"kind": "",
|
||||
}, str(fallback.get("message") or "")
|
||||
}, message
|
||||
if kind not in (table.get("kinds") or []):
|
||||
return {}, f"「{kind}」은(는) 아는 돌 종류가 아니라 계수를 못 골랐습니다"
|
||||
wedge = ((table.get("wedge_stone_m3_per_m2") or {}).get(kind) or {}).get(key)
|
||||
@@ -159,8 +199,9 @@ STONE_MASONRY = {
|
||||
# 적어 둔다 — 관측 원단위가 있는 종류는 그 표가 이기고, 없는 종류만 이 값으로 선다.
|
||||
"weep_hole_length_m": 0.5, # 물구멍관 1개소당 관 길이
|
||||
"mortar_m3_per_m2": 0.009, # 줄눈 모르터 (찰쌓기만)
|
||||
"excavation_extra_m": 0.2, # 터파기 폭 여유
|
||||
"backfill_thickness_m": 0.2, # 되메우기 두께
|
||||
# ⚠ 터파기 여유폭·되메우기 두께는 **공용 한 벌**로 옮겼다
|
||||
# (`common_util/common_util_excavation.py` — 화면 B06 과 짝인 TS 가 있다).
|
||||
# 여기서 다시 두면 그림과 물량이 갈린다.
|
||||
}
|
||||
|
||||
# 성분이 어디로 가는가 — 이중계상을 막는 표시.
|
||||
@@ -172,9 +213,12 @@ STONE_MASONRY = {
|
||||
#: 구조물 시공이 원활하도록 **100 mm 두께의 버림콘크리트**를 타설하도록 한다」.
|
||||
#: 폭 근거: KCS 34 50 05 「버림 콘크리트의 두께는 설계도서에 따르며, **폭은 잡석다짐의
|
||||
#: 폭과 동일**하게 한다」.
|
||||
#: ⚠ 우리에게 **잡석다짐 폭이 아직 없다**(기초잡석은 품셈에 공종만 있고 두께·폭이 없음).
|
||||
#: 그래서 **터파기 폭(평균두께 + 여유 0.2m)을 잠정으로** 쓰고 근거 문구에 그 사실을 적는다.
|
||||
#: 잡석다짐 폭이 정해지면 이 한 줄만 바꾸면 된다.
|
||||
#: ⭐ 그 잡석다짐 폭이 **정해졌다** — 「기준 구조물에서 유도, 같은 값을 공유」
|
||||
#: (2026-09-08 사용자 확정 2차 ⑪ 「기슭막이면 **하단 길이** × 종단방향 폭 × 높이」).
|
||||
#: ⇒ 벽에서 **하단 길이 = 하부 두께**다. 종전의 「터파기 폭 잠정」을 그 값으로 바꾼다.
|
||||
#: ⚠ **기초잡석(품셈 12-25) 물량은 아직 못 센다** — 폭은 이제 있으나 **두께가 어느
|
||||
#: 원문에도 없다**(품셈은 ㎥당 품만 줌). 실무 관측은 관보호공 날개벽 T=0.2 하나뿐이라
|
||||
#: **다른 구조물 값을 옮겨 쓰지 않고** 사유로 드러낸다.
|
||||
#: 돌을 **사 오나 캐나** — 기본은 「캔다」(2026-09-09 사용자 확정 ②).
|
||||
#: 법이 그쪽을 권한다 — 별표2 「석축 등에 필요한 야면석 등은 **가급적 현장에서
|
||||
#: 채취·사용**하도록 운반거리를 조사한다」. 실무 견적 다섯 권에도 야면석 **구입 단가가
|
||||
@@ -195,6 +239,31 @@ STONE_SUPPLY_PURCHASED = {"구입", "구입품", "사서", "purchase", "purchase
|
||||
#: 뒤집힌다. 우리는 **양수**로 주고, 빼는 것은 받는 쪽이 한다.
|
||||
COLLECTED_STONE_KEY = "collected_stone_deduction_m3"
|
||||
|
||||
#: ⑩ 채움 콘크리트 강도 (2026-09-08 사용자 확정 2차 ⑩ 「기본 210, 고를 수 있게」).
|
||||
#: ⚠ **빈 칸은 「안 정함」**이고 그때 210 으로 선다 — 등록부 default 는 비어 있다.
|
||||
#: 180 은 국가기준 하한(돌쌓기 전용 값)이라 고르면 그 값이 이긴다.
|
||||
FILL_CONCRETE_MPA_KEY = "fill_concrete_mpa"
|
||||
FILL_CONCRETE_MPA_DEFAULT = "210"
|
||||
FILL_CONCRETE_MPA_CHOICES = ("180", "210")
|
||||
|
||||
|
||||
def fill_concrete_mpa(options: dict[str, Any]) -> tuple[str, str]:
|
||||
"""(강도, 근거). 안 정했으면 기본 210 이고 그 사실이 근거에 적힌다."""
|
||||
value = str(options.get(FILL_CONCRETE_MPA_KEY) or "").strip()
|
||||
if value in FILL_CONCRETE_MPA_CHOICES:
|
||||
return value, f"강도 {value} — 저장 제원에서 고른 값"
|
||||
if value:
|
||||
return (
|
||||
FILL_CONCRETE_MPA_DEFAULT,
|
||||
f"강도 {FILL_CONCRETE_MPA_DEFAULT} — ⚠ 저장값 「{value}」은 180·210 중에"
|
||||
" 없어 기본으로 섬",
|
||||
)
|
||||
return (
|
||||
FILL_CONCRETE_MPA_DEFAULT,
|
||||
f"강도 {FILL_CONCRETE_MPA_DEFAULT} — 안 정해 기본값(확정 ⑩)",
|
||||
)
|
||||
|
||||
|
||||
BLINDING_THICKNESS_M = 0.10
|
||||
#: 버림을 뺄 수 있는 칸 — 「기본은 넣고, 빼고 싶으면 뺀다」(사용자 확정 ⑭).
|
||||
#: 저장 제원에 이 칸이 없으면 **넣는 쪽**이 기본이다.
|
||||
@@ -219,6 +288,11 @@ DESTINATION = {
|
||||
# ⚠ 자재도 토공도 아닌 자리 — **유토곡선이 사토에서 뺄 밑수**다. 자재총괄은
|
||||
# `material` 만 모으므로 여기 섞이지 않는다.
|
||||
"채집석": "haul_deduction", # ⚠ 자재 카탈로그가 이름으로 찾는다 — 공백 없는 한 낱말(B09 규약)
|
||||
# ⚠ **보여 주기만 하는 줄** — 자재도 토공도 일위대가도 아니다. 정본 계산표 좌측 열에
|
||||
# 「입적」으로 실려 있어 그 이름 그대로 낸다(2026-09-08 확정 ⑦). 값은 이미 식 안에
|
||||
# 있던 것을 줄로 꺼낸 것뿐이고, `material`·`earthwork` 어디에도 안 섞인다.
|
||||
# ⚠ 「석적」은 정본에 없다(소광리 시트에만) — **안 낸다.**
|
||||
"입적": "reference",
|
||||
}
|
||||
|
||||
# ⚠ 배합 성분 — 산출물에 나타나면 안 된다(㉢). B09 일위대가가 배합표로 분해한다.
|
||||
@@ -242,6 +316,8 @@ class Component:
|
||||
# 두 근거가 한 표에 섞이므로 줄마다 단다. 안 적으면 나중에 못 되짚는다.
|
||||
basis_kind: str = BASIS_DERIVED
|
||||
source: str = ""
|
||||
#: 규격 — 같은 이름이라도 단가가 갈리는 값(채움 콘크리트 강도 등). 받는 쪽이 읽는다.
|
||||
spec: str = ""
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
@@ -368,21 +444,42 @@ def wants_blinding(options: dict[str, Any]) -> bool:
|
||||
return True
|
||||
|
||||
|
||||
def _blinding_component(base_width_m: float, length_m: float, options: dict[str, Any]):
|
||||
"""버림 콘크리트 한 줄. 넣지 않기로 했으면 `None`."""
|
||||
def _blinding_component(
|
||||
base_width_m: float,
|
||||
length_m: float,
|
||||
options: dict[str, Any],
|
||||
width_basis: str = "",
|
||||
):
|
||||
"""버림 콘크리트 한 줄. 넣지 않기로 했으면 `None`.
|
||||
|
||||
폭은 **잡석다짐 폭**(KCS 34 50 05)이고, 그 값은 확정 ⑪ 로 **구조물 하단 길이**다.
|
||||
부르는 쪽이 그 폭과 까닭(`width_basis`)을 함께 넘긴다.
|
||||
"""
|
||||
if not wants_blinding(options) or base_width_m <= 0 or length_m <= 0:
|
||||
return None
|
||||
basis = (
|
||||
f"기초 폭 {base_width_m:.2f}m × 연장 × 두께 {BLINDING_THICKNESS_M:.2f}m"
|
||||
" · 두께는 KDS 44 90 00(100㎜) · 폭은 잡석다짐 폭(KCS 34 50 05)"
|
||||
)
|
||||
if width_basis:
|
||||
basis = f"{basis} = {width_basis}"
|
||||
return Component(
|
||||
"버림콘크리트",
|
||||
"㎥",
|
||||
base_width_m * length_m * BLINDING_THICKNESS_M,
|
||||
DESTINATION["버림콘크리트"],
|
||||
f"기초 폭 {base_width_m:.2f}m × 연장 × 두께 {BLINDING_THICKNESS_M:.2f}m"
|
||||
" · 두께는 KDS 44 90 00(100㎜) · ⚠ 폭은 잡석다짐 폭(KCS 34 50 05)이라야 하나"
|
||||
" 그 값이 아직 없어 **터파기 폭을 잠정**으로 씀",
|
||||
basis,
|
||||
)
|
||||
|
||||
|
||||
#: 기초잡석(품셈 12-25)이 아직 못 서는 까닭 — **폭은 있고 두께가 없다.**
|
||||
RUBBLE_BASE_BLOCKED = (
|
||||
"기초잡석(12-25) 물량이 안 섬 — 폭은 하단 길이 {width:.2f}m 로 섰으나 **두께가 원문에 "
|
||||
"없음**(품셈 12-25 는 ㎥당 품만 줌). 실무 관측은 관보호공 날개벽 T=0.2 하나뿐이라 "
|
||||
"다른 구조물 값을 옮겨 쓰지 않음"
|
||||
)
|
||||
|
||||
|
||||
#: ⚠ **저장 제원의 실제 칸 이름**은 `back_len_cm` 이다(레지스트리 확인).
|
||||
#: 앞서 `stone_back_length_cm` 을 읽고 있어 **저장값이 영영 안 닿고 늘 기본 45㎝ 로 돌았다**
|
||||
#: — 뒷길이를 75 로 골라도 45 계수가 붙던 자리다. 값이 나오므로 아무 시험도 안 잡았다.
|
||||
@@ -427,8 +524,9 @@ BOULDER_MASONRY = {
|
||||
# ⚠ 검산 참고값 — 곱하지 않는다. 까닭은 `STONE_MASONRY` 의 같은 칸 주석을 볼 것.
|
||||
# 큰돌쌓기는 전면 기울기가 「1:0.3 **이상**」이라 특히 하드코딩하면 안 된다.
|
||||
"sheet_check_factor_at_0_3": 1.04,
|
||||
"excavation_extra_m": 0.2, # 터파기 폭 여유
|
||||
"backfill_thickness_m": 0.2, # 되메우기 두께
|
||||
# ⚠ 터파기 여유폭·되메우기 두께는 **공용 한 벌**로 옮겼다
|
||||
# (`common_util/common_util_excavation.py` — 화면 B06 과 짝인 TS 가 있다).
|
||||
# 여기서 다시 두면 그림과 물량이 갈린다.
|
||||
}
|
||||
|
||||
|
||||
@@ -469,7 +567,6 @@ def boulder_masonry(
|
||||
# ⚠ 큰돌쌓기는 **표준경사표 대상이 아니다** — 교본이 「1:0.3 **이상**」으로만 두었다.
|
||||
# 저장 제원에 값이 있으면 그것을 쓰고, 없으면 하한 0.3 으로 둔다.
|
||||
slope_ratio = _num(options.get("face_slope_ratio"), 0.3)
|
||||
constants = BOULDER_MASONRY
|
||||
face_area = height_m * length_m
|
||||
# 기울기 몫은 **한 번만** — 13-4 와 같은 자리다(㉘).
|
||||
masonry_area = face_area * math.hypot(1.0, slope_ratio)
|
||||
@@ -490,30 +587,23 @@ def boulder_masonry(
|
||||
upper_cm = float(str(diameter).split("~")[-1])
|
||||
thickness = upper_cm / 100.0
|
||||
# 버림 콘크리트 — 돌쌓기와 같은 자리(사용자 확정 ⑭). 빼려면 저장 제원에서 「안 넣음」.
|
||||
blinding = _blinding_component(thickness + constants["excavation_extra_m"], length_m, options)
|
||||
blinding = _blinding_component(
|
||||
thickness,
|
||||
length_m,
|
||||
options,
|
||||
f"하단 길이(직경 위끝) {thickness:.2f}m — 확정 ⑪ 준용",
|
||||
)
|
||||
if blinding is not None:
|
||||
components.append(blinding)
|
||||
excavation = height_m * (thickness + constants["excavation_extra_m"]) * length_m
|
||||
backfill = height_m * constants["backfill_thickness_m"] * length_m
|
||||
components.extend(
|
||||
[
|
||||
Component(
|
||||
"터파기",
|
||||
"㎥",
|
||||
excavation,
|
||||
DESTINATION["터파기"],
|
||||
f"높이 × (벽두께 {thickness:g}m + 0.2) × 연장 · ⚠ 큰돌쌓기 터파기 폭 규정이"
|
||||
" 품셈에 없어 돌쌓기 방식을 준용",
|
||||
),
|
||||
Component("되메우기", "㎥", backfill, DESTINATION["되메우기"], "높이 × 0.2 × 연장"),
|
||||
Component(
|
||||
"잔토처리",
|
||||
"㎥",
|
||||
excavation - backfill,
|
||||
DESTINATION["잔토처리"],
|
||||
"터파기 − 되메우기",
|
||||
),
|
||||
]
|
||||
_trench_components(
|
||||
height_m,
|
||||
length_m,
|
||||
thickness,
|
||||
options,
|
||||
notes,
|
||||
"⚠ 큰돌쌓기 터파기 폭 규정이 품셈에 없어 돌쌓기 방식을 준용",
|
||||
)
|
||||
)
|
||||
|
||||
notes.append(
|
||||
@@ -534,6 +624,66 @@ def boulder_masonry(
|
||||
return components, notes
|
||||
|
||||
|
||||
def _trench_components(
|
||||
height_m: float,
|
||||
length_m: float,
|
||||
thickness: float,
|
||||
options: dict[str, Any],
|
||||
notes: list[str],
|
||||
extra_basis: str = "",
|
||||
) -> list[Component]:
|
||||
"""터파기·되메우기·잔토 — **공용 단면 함수 한 벌**(`common_util_excavation`).
|
||||
|
||||
⚠ 여기서 식을 다시 짜지 않는다 — 화면(B06 횡단도)이 그리는 단면과 같은 코드라야
|
||||
그림과 물량이 안 갈린다. 평균두께는 이쪽이 낸 값을 **넘겨 준다**(저쪽은 두께를 모름).
|
||||
⚠ 「기초유 / 기초버림」은 정본 탭 제목이고 **기초분 0.45 냐 0.07 이냐**를 가른다.
|
||||
안 고른 프로젝트는 **비탈분만** 세우고 사유를 남긴다 — 한쪽으로 찍으면 임의값이
|
||||
금액으로 굳는다(기초분이 통째로 0.45㎥/m 다).
|
||||
"""
|
||||
foundation = str(options.get("foundation") or "").strip()
|
||||
if foundation in ("기초유", "기초버림"):
|
||||
has_foundation = foundation == "기초유"
|
||||
area = wall_trench_area_m2(height_m, thickness, has_foundation=has_foundation)
|
||||
base_depth = WALL_FOUNDATION_DEPTH_M if has_foundation else WALL_BLINDING_DEPTH_M
|
||||
base_basis = f"기초분({foundation}) + "
|
||||
else:
|
||||
width = wall_trench_width_m(thickness)
|
||||
area = None if width is None else height_m * width
|
||||
base_depth = 0.0
|
||||
base_basis = ""
|
||||
notes.append(
|
||||
"⚠ 기초 유/무(기초유·기초버림)를 안 정해 **기초 터파기 몫이 안 섰음** — 비탈분만 세움"
|
||||
)
|
||||
if area is None:
|
||||
notes.append("⚠ 높이·평균두께가 없어 터파기가 서지 않음")
|
||||
return []
|
||||
excavation = area * length_m
|
||||
backfill = (base_depth + height_m) * WALL_TRENCH_CLEARANCE_M * length_m
|
||||
basis = (
|
||||
f"{base_basis}H × (평균두께 {thickness:.2f} + {WALL_TRENCH_CLEARANCE_M}) × 연장"
|
||||
f" · {BASIS_WALL}"
|
||||
)
|
||||
if extra_basis:
|
||||
basis = f"{basis} · {extra_basis}"
|
||||
return [
|
||||
Component("터파기", "㎥", excavation, DESTINATION["터파기"], basis),
|
||||
Component(
|
||||
"되메우기",
|
||||
"㎥",
|
||||
backfill,
|
||||
DESTINATION["되메우기"],
|
||||
f"(기초깊이 {base_depth:g} + H) × {WALL_TRENCH_CLEARANCE_M} × 연장",
|
||||
),
|
||||
Component(
|
||||
"잔토처리",
|
||||
"㎥",
|
||||
excavation - backfill,
|
||||
DESTINATION["잔토처리"],
|
||||
"터파기 − 되메우기",
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
def stone_masonry(
|
||||
height_m: float,
|
||||
length_m: float,
|
||||
@@ -617,6 +767,15 @@ def stone_masonry(
|
||||
DESTINATION["돌쌓기"],
|
||||
f"정면적 × √(1+{slope_ratio:g}²) — 비탈면적 · {slope_basis}",
|
||||
),
|
||||
# 입적 — 정본 계산표 좌측 열의 이름 그대로다(확정 ⑦). 값을 새로 내는 것이 아니라
|
||||
# 이미 쓰고 있던 밑수를 화면에 드러내는 줄이다.
|
||||
Component(
|
||||
"입적",
|
||||
"㎥",
|
||||
volume,
|
||||
DESTINATION["입적"],
|
||||
f"정면적 × 평균두께 {thickness:.2f} · {thickness_basis}",
|
||||
),
|
||||
]
|
||||
# ⚠ 고임돌 계수가 **원문에서 「-」**인 칸이 있다(견치돌 25·30 · 야면석 75 · 깬돌 25).
|
||||
# 그 규격에 그 돌을 안 쓴다는 뜻이라 **0 줄을 만들지 않는다** — 0 은 「없음」과
|
||||
@@ -650,7 +809,8 @@ def stone_masonry(
|
||||
"ton",
|
||||
masonry_area * stone_ton,
|
||||
DESTINATION["야면석"],
|
||||
f"돌쌓기 × {stone_ton} ton/㎡ (뒷길이 {back_cm}㎝)",
|
||||
f"돌쌓기 × {stone_ton} ton/㎡ (뒷길이 {back_cm}㎝) · {STONE_WEIGHT_BASIS}",
|
||||
source=STONE_WEIGHT_SOURCE,
|
||||
)
|
||||
)
|
||||
|
||||
@@ -672,13 +832,16 @@ def stone_masonry(
|
||||
)
|
||||
|
||||
if wet:
|
||||
mpa, mpa_basis = fill_concrete_mpa(options)
|
||||
components.append(
|
||||
Component(
|
||||
"채움콘크리트",
|
||||
"㎥",
|
||||
masonry_area * _num(table["fill_concrete_m3_per_m2"]),
|
||||
DESTINATION["채움콘크리트"],
|
||||
f"돌쌓기 × {table['fill_concrete_m3_per_m2']} ㎥/㎡ (뒷길이 {back_cm}㎝)",
|
||||
f"돌쌓기 × {table['fill_concrete_m3_per_m2']} ㎥/㎡ (뒷길이 {back_cm}㎝)"
|
||||
f" · {mpa_basis}",
|
||||
spec=f"{mpa}",
|
||||
)
|
||||
)
|
||||
components.append(
|
||||
@@ -732,32 +895,22 @@ def stone_masonry(
|
||||
)
|
||||
|
||||
# 버림 콘크리트 — 기초 바닥에 까는 얇은 층. 빼려면 저장 제원에서 「안 넣음」으로 둔다.
|
||||
base_width = thickness + constants["excavation_extra_m"]
|
||||
blinding = _blinding_component(base_width, length_m, options)
|
||||
# 잡석다짐 폭 = **하단 길이**(확정 ⑪) — 벽에서는 하부 두께다. 버림도 같은 폭을 쓴다.
|
||||
base_width = bottom_thickness
|
||||
blinding = _blinding_component(
|
||||
base_width,
|
||||
length_m,
|
||||
options,
|
||||
f"하단 길이(하부 두께) {bottom_thickness:.2f}m — 확정 ⑪ 「기준 구조물에서 유도」",
|
||||
)
|
||||
if blinding is not None:
|
||||
components.append(blinding)
|
||||
|
||||
notes.append(RUBBLE_BASE_BLOCKED.format(width=base_width))
|
||||
|
||||
# 터파기·되메우기·잔토 — 토공으로 합산되는 값이다(내역 줄이 아니다).
|
||||
excavation = height_m * (thickness + constants["excavation_extra_m"]) * length_m
|
||||
backfill = height_m * constants["backfill_thickness_m"] * length_m
|
||||
components.extend(
|
||||
[
|
||||
Component(
|
||||
"터파기",
|
||||
"㎥",
|
||||
excavation,
|
||||
DESTINATION["터파기"],
|
||||
f"높이 × (평균두께 {thickness:.2f}+0.2) × 연장 · {thickness_basis}",
|
||||
),
|
||||
Component("되메우기", "㎥", backfill, DESTINATION["되메우기"], "높이 × 0.2 × 연장"),
|
||||
Component(
|
||||
"잔토처리",
|
||||
"㎥",
|
||||
excavation - backfill,
|
||||
DESTINATION["잔토처리"],
|
||||
"터파기 − 되메우기",
|
||||
),
|
||||
]
|
||||
_trench_components(height_m, length_m, thickness, options, notes, thickness_basis)
|
||||
)
|
||||
return components, notes
|
||||
|
||||
@@ -1020,6 +1173,7 @@ def build_table(
|
||||
"basis": component.basis,
|
||||
"basis_kind": component.basis_kind,
|
||||
"source": component.source,
|
||||
"spec": component.spec,
|
||||
}
|
||||
for component in item.components
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user