Files
Aislo/common_util/common_util_structure_face_role.py
T

77 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""구조물이 선 자리가 **성토면인가 절토면인가** — 판정 한 벌.
왜 있나(2026-09-09) — 품셈 표준경사 표가 **높이 × 메/찰 × 성토/절토** 셋으로 갈리는데,
앞 둘은 구조물 제원에 있고 **성절토만 없었다**. 그 값은 횡단 설계가 아는 것이라 B06 이
내주기로 했고, **새 입력을 만들지 않고** 이미 저장되는 두 값으로 가린다:
design.section_mode left_cut · right_cut · both_cut · both_fill
구조물 options.side "자동(성토 쪽)" · "좌" · "우"
판정이 두 곳에 두 벌로 짜이면 `both_cut` + 「자동」의 예외에서 갈린다 — 그래서 여기 하나만
둔다(CLAUDE.md 5장 「코드는 한 벌」). **파이썬 단독**이다: 읽는 쪽이 B08 수량뿐이고 브라우저는
이 판정을 쓰지 않는다. 화면이 쓰게 되면 그때 TS 짝을 만들고 거울 시험을 붙일 것.
⚠ **못 가르면 `None` 을 돌려준다.** 성토로 눅여 돌려주지 않는다 — 받는 쪽이 「근거가 없다」는
사실을 알아야 임의값이 금액으로 굳지 않는다(측구 토사/암 분리와 같은 태도).
"""
from __future__ import annotations
FILL = "성토"
CUT = "절토"
#: 단면유형 → (좌측 역할, 우측 역할). 좌 = +offset, 우 = offset (B06 규약).
_MODE_ROLES: dict[str, tuple[str, str]] = {
"left_cut": (CUT, FILL),
"right_cut": (FILL, CUT),
"both_cut": (CUT, CUT),
"both_fill": (FILL, FILL),
}
#: 설치 측 표기 — 레지스트리 선택지와 옛 저장분(영문)을 함께 받는다.
_LEFT = {"좌", "left", "L"}
_RIGHT = {"우", "right", "R"}
_AUTO = {"자동(성토 쪽)", "자동", "auto", ""}
def structure_face_role(section_mode: str | None, side: str | None) -> tuple[str | None, str]:
"""(`"성토"` | `"절토"` | `None`, 까닭 문구)를 돌려준다.
까닭 문구는 화면 근거 줄에 그대로 실을 수 있는 한 줄이다
(예: `right_cut · 좌측 → 성토면`).
"""
mode = (section_mode or "").strip()
roles = _MODE_ROLES.get(mode)
if roles is None:
return None, f"단면유형을 알 수 없음({section_mode!r}) — 성절토를 가를 근거 없음"
left_role, right_role = roles
picked = (side or "").strip()
if picked in _LEFT:
return left_role, f"{mode} · 좌측 → {left_role}면"
if picked in _RIGHT:
return right_role, f"{mode} · 우측 → {right_role}면"
if picked in _AUTO:
# 「자동(성토 쪽)」은 성토면에 세운다는 뜻이다 — 그런데 양쪽이 다 절토면
# 세울 성토면이 없어 어느 쪽인지 정할 근거가 없다. 임의로 몰지 않는다.
if left_role == CUT and right_role == CUT:
return None, f"{mode} · 자동(성토 쪽)인데 성토면이 없음 — 가를 근거 없음"
return FILL, f"{mode} · 자동(성토 쪽) → 성토면"
return None, f"설치 측을 알 수 없음({side!r}) — 성절토를 가를 근거 없음"
#: 성토/절토를 **사용자가 고르는 칸** — 비우면 위 판정(계산이지 기본값이 아님 · 2026-09-14 브레인 판정 ㉲).
FACE_ROLE_KEY = "face_role"
def structure_face_role_of(
section_mode: str | None, options: dict | None
) -> tuple[str | None, str]:
"""칸 `face_role`(성토·절토)을 골랐으면 그 값, 비었으면 단면유형 + 설치 측 판정."""
values = options or {}
picked = str(values.get(FACE_ROLE_KEY) or "").strip()
if picked in (FILL, CUT):
return picked, f"사용자 지정 {picked}면(성토/절토 칸)"
return structure_face_role(section_mode, values.get("side"))