- 표가 읽는데 등록부에 없어 영영 안 서던 칸 — 옛 저장본은 안 깨지고 비면 사유(어디서 적는지) - 개거(점 배치) length_m · 물넘이포장 thickness_cm·length_m(detail · 구조물 집계표에서도 고침) - B05 시설 칸에 물넘이 두께·길이 입력 — 시설 저장이 칸을 통째로 갈아 끼워 집계표로 적은 값이 지워지던 길을 막음 - 700줄 한계로 유입구 형식 목록을 _Fields 로 옮김(부르는 쪽 그대로) - 사유 문구: 「open_ditch 연장」 키 노출 · 「연장·면적이 0」 → 무엇을 적으면 서는지 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VBGFXB9AbJBwXP19z75Qq
91 lines
4.5 KiB
Python
91 lines
4.5 KiB
Python
"""사용자에게 뜨는 문구 — **키 이름을 화면에 내보내지 않는다** (B08 ㉑).
|
|
|
|
왜 있나
|
|
「`back_len_cm` 가 저장돼 있지 않아 갈래를 못 고름」처럼 **개발자 키 이름이 그대로**
|
|
화면에 뜨던 자리가 있었다. 사용자는 그 이름을 모르고, 무엇을 해야 하는지도 알 수 없다.
|
|
(반영률 라벨이 서버 키로 뜨던 그 자리와 같은 병이다.)
|
|
|
|
⚠ 「없다」만 말하지 않는다 — **어디서 채우면 풀리는지**를 함께 적는다
|
|
「원단위 미확보」로 끝나면 사용자는 손쓸 데를 모른다. **무엇이 채워지면 값이 서는지**가
|
|
같이 있어야 그 말이 쓸모 있다. 오늘 「표에 있는 규격을 함께 알린」 그 방식이다.
|
|
|
|
⚠ 여기서 값을 바꾸지 않는다
|
|
문구만 다듬는 자리다. 판정·계산은 각 엔진이 하고, 이 모듈은 **그 결과를 사람 말로** 옮긴다.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
#: 구조물 종류의 사람 이름. 레지스트리 이름이 정본이고 여기는 **화면 문구가 필요할 때만** 쓴다.
|
|
#: ⚠ 레지스트리에 없는 이름을 지어내지 않는다 — 못 찾으면 원래 값을 그대로 보인다.
|
|
TYPE_LABELS = {
|
|
"masonry_wet": "돌쌓기(찰)",
|
|
"masonry_dry": "돌쌓기(메)",
|
|
"boulder_masonry": "큰돌쌓기",
|
|
"retaining_wall": "옹벽",
|
|
"soil_guard": "흙막이",
|
|
"pipe": "배수관",
|
|
"pipe_inlet_basin": "배수관 유입부 집수정",
|
|
"ford_pavement": "물넘이포장",
|
|
"open_ditch": "개거(겉도랑)",
|
|
"ford_bridge": "세월교",
|
|
"box_culvert": "BOX암거",
|
|
# 사방 시설 — 레지스트리 이름 그대로 옮긴 것(2026-09-08 확인). 지어낸 이름 아님.
|
|
"erosion_check": "골막이",
|
|
"bed_sill": "바닥막이",
|
|
"check_dam_small": "소형사방댐(복합형)",
|
|
"revetment": "기슭막이",
|
|
}
|
|
|
|
#: 저장 제원 칸의 사람 이름 + **어디서 채우는지**. 키 이름을 화면에 내보내지 않기 위한 표.
|
|
OPTION_LABELS = {
|
|
"back_len_cm": ("돌 뒷길이(㎝)", "구조물 상세 입력"),
|
|
"stone_cm": ("돌 직경(㎝)", "구조물 상세 입력"),
|
|
"form": ("옹벽 형식", "구조물 상세 입력"),
|
|
"height_m": ("높이(m)", "구조물 배치"),
|
|
"length_m": ("연장(m)", "구조물 배치"),
|
|
# 물넘이포장(관 지점 시설) — B05 시설 칸 · 구조물 집계표에서 적음(2026-09-14 A3).
|
|
"thickness_cm": ("포장 두께(㎝)", "구조물 배치 물넘이포장 칸 · 구조물 집계표"),
|
|
# 2026-09-09 칸이 생겼음(`ebdf2988`) — 「아직 칸이 없음」이 거짓이 되어 고침.
|
|
# ⚠ 비워 두면 품셈 표준경사표로 자동 판정된다(확정 ⑨).
|
|
"face_slope_ratio": ("전면 기울기", "구조물 상세 입력 — 비우면 품셈 표준경사로 자동"),
|
|
}
|
|
|
|
|
|
def type_label(type_id: str, names: dict[str, str] | None = None) -> str:
|
|
"""구조물 이름 — 레지스트리 이름이 있으면 그것을 먼저 쓴다."""
|
|
stored = (names or {}).get(type_id)
|
|
return stored or TYPE_LABELS.get(type_id, type_id)
|
|
|
|
|
|
def option_missing(option_key: str, type_id: str = "", names: dict[str, str] | None = None) -> str:
|
|
"""「무엇이 없고 어디서 채우면 되는지」 한 줄.
|
|
|
|
⚠ 모르는 키면 **지어내지 않고** 키를 그대로 보인다 — 잘못된 안내가 없는 안내보다 나쁘다.
|
|
"""
|
|
label, where = OPTION_LABELS.get(option_key, (option_key, ""))
|
|
subject = f"{type_label(type_id, names)} " if type_id else ""
|
|
tail = f" — {where}에서 입력하면 값이 섭니다" if where else ""
|
|
return f"{subject}{label}이(가) 아직 입력되지 않았습니다{tail}"
|
|
|
|
|
|
def spec_missing(
|
|
type_id: str, known: list[dict[str, Any]], names: dict[str, str] | None = None
|
|
) -> str:
|
|
"""규격이 표에 없을 때 — **표에 있는 규격을 함께** 보인다."""
|
|
name = type_label(type_id, names)
|
|
if not known:
|
|
return f"{name}의 표준 물량 자료가 아직 없습니다 — 설계 표준도 확보가 필요합니다"
|
|
readable = " / ".join(_spec_text(spec) for spec in known)
|
|
return f"{name}의 이 규격은 자료에 없습니다 — 자료에 있는 규격: {readable}"
|
|
|
|
|
|
def _spec_text(spec: dict[str, Any]) -> str:
|
|
"""규격 한 벌을 사람 말로. 키 이름 대신 라벨을 쓴다."""
|
|
parts = []
|
|
for key, value in spec.items():
|
|
label = OPTION_LABELS.get(key, (key, ""))[0]
|
|
parts.append(f"{label} {value}")
|
|
return " · ".join(parts)
|