Files
Aislo/B07_DesignDetail/B07_DesignDetail_Schema.py
T
eomsangdonandClaude Opus 5 8cd0b003e5 feat(B07): 표준도 2단계 — 돌쌓기 단면 그림 + 제원 조합마다 한 장
실무 탭이 「위 치수조서 + 아래 수량산출서」인데 1단계에서 아래 표가 섰고 이번이 위 그림.
그림이 붙으면서 한 면에 넉 장을 쌓을 수 없게 돼 **장 나눔(㉢)도 같이** 했음.

장 나눔 — 계획평면도가 쓰는 본 그대로
  `standard_sheet` / `standard_sheet_2` … 제원 조합 하나가 한 장.
  좌측 목록은 `idPrefix` 묶음(계획평면도와 같은 짜임)이고 kind 는 새로 `standard`.
  구조물이 없어도 한 장은 남김 — 단추가 사라지면 「없어진 것」처럼 보이고 사유를 읽을
  자리도 없어짐.

그림 — `B07_DesignDetail_Engine_Cad_StandardFigure.py`
  ⚠ **기울기를 값으로 받음. 0.3 을 그림에 박지 않았음.** `face_slope_ratio` 가 오면 그
  값으로 기울고, 비어 있으면 교본 7-3 기본 0.3 으로 그리되 **「자동 판정 전」이라고 그림에
  적음**. 자동 판정이 붙는 대로 그림이 따라감.
  ⚠ 치수는 수량이 쓰는 그 상수(`STONE_MASONRY`)를 직접 읽음 — 여기서 다시 적으면 그림과
  표가 갈림. 상부 0.45+0.10H · 하부 0.45+0.40H · 터파기 폭 평균두께+0.2 · 되메우기 0.2.
  ⓘ 그 상수는 **뒷면이 수직인 1:0.3 벽**을 뜻함(하부−상부 = 0.30H = 전면이 기우는 양).
    기울기가 0.3 이 아니면 그 차이만큼 뒷면이 기욺 — 상수에서 따라 나오는 결과라 그대로 그림.
  ⚠ 치수가 없는 것은 그리되 치수를 안 적음 — 막자갈은 「입적 − 몸통 − 고임돌」이라 폭·높이로
    정의된 도형이 아님. 자리만 보이고 값은 표를 가리킴.

죽은 길 걷어냄 — `BLANK_DRAWINGS` 가 「표준도」 하나뿐이었는데 그것이 내용 있는 장이 되어
빈 도각 경로가 통째로 안 쓰이게 됨. 상수·목록 루프·분기·import 를 지움(700줄 제한도 걸렸음).

자체검증 — 회귀 573 통과 · 0 실패, `tsc --noEmit` 0.
⚠ 병합 뒤 깨진 시험 둘을 고침(내 폴더 `tmp/tests`, 랩탑 메인 `11394d40` 의 여파)
  · `stone_supply='채집'` 기본값을 확정 ② 근거와 함께 허용 목록에 등록
  · 바닥막이 「모든 옵션이 b05」 단정 → 조달이 detail 로 들어와 B05 셋만 보게 좁힘

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 19:58:15 +09:00

144 lines
4.2 KiB
Python

"""B07 상세 설계 도면 목록·단건 응답 모델."""
from typing import Any, Literal
from pydantic import BaseModel, Field
class DesignDrawingItem(BaseModel):
"""B06 확정 산출물에서 노출하는 도면 메타데이터."""
id: str
# blank: 아직 내용을 만들지 않은 도면 — 도각만 실어 연다(2026-09-01 사용자 지시).
kind: Literal[
"cover",
"longitudinal",
"cross",
"mass_haul",
"watershed",
"plan",
"landuse",
"plan_lidar",
"cross_standard",
# standard: 표준도(구조물도) — 제원 조합 하나가 한 장.
"standard",
"blank",
]
label: str
chainage_m: float | None = None
confirmed: bool = False
class DesignDrawingListResponse(BaseModel):
"""B07 진입 시 캐시할 경량 도면 목록."""
status: str = "success"
project_id: str
route_id: int
drawings: list[DesignDrawingItem]
class DesignDrawingResponse(BaseModel):
"""openwebcad 브리지로 전달할 단일 CAD 도면."""
status: str = "success"
project_id: str
route_id: int
id: str
# blank: 아직 내용을 만들지 않은 도면 — 도각만 실어 연다(2026-09-01 사용자 지시).
kind: Literal[
"cover",
"longitudinal",
"cross",
"mass_haul",
"watershed",
"plan",
"landuse",
"plan_lidar",
"cross_standard",
# standard: 표준도(구조물도) — 제원 조합 하나가 한 장.
"standard",
"blank",
]
label: str
drawing: dict[str, Any]
confirmed: bool = False
# 횡단도 편집용 수량 산출표 값 (미산정 항목은 null). 종단도는 None.
quantity_table: dict[str, float | None] | None = None
# B06에서 지정한 잠정 설계(지반유형·단면유형·절성토 단면적). 횡단도만, 없으면 None.
design: dict[str, Any] | None = None
class DesignDrawingConfirmRequest(BaseModel):
"""CAD 앱에서 직렬화한 현재 편집 도면."""
drawing: dict[str, Any]
# 사용자가 편집한 수량 산출표 값 (횡단도 확정 시 영구 저장).
quantity_table: dict[str, Any] | None = None
class DesignDrawingConfirmResponse(BaseModel):
"""도면별 확정 및 B07 전체 완료 상태."""
status: str = "success"
project_id: str
id: str
confirmed: bool
all_confirmed: bool
# 횡단도 확정 시 재계산된 확정 설계(status=confirmed). 종단도·재계산 불가 시 None.
design: dict[str, Any] | None = None
class DesignDrawingInvalidateResponse(BaseModel):
"""확정 도면 변경에 따른 상태 롤백 결과."""
status: str = "success"
project_id: str
id: str
confirmed: bool = False
class FrameTemplateResponse(BaseModel):
"""도각 편집 화면이 실을 도각 한 장(실치수 1:1, 잠금 없는 도면층)."""
status: str = "success"
project_id: str
drawing: dict[str, Any]
# 회사가 고친 도각을 쓰고 있으면 True, 프로그램 기본 도각이면 False.
customized: bool = False
# 자리표에 **보여 줄** 실제 값 (2026-09-06 사용자 지시) — 편집 화면 전용이고
# 저장값은 `{{키}}` 토큰 그대로다. 값이 없는 자리는 담기지 않는다.
fields: dict[str, str] = {}
class FrameTemplateImportResponse(BaseModel):
"""외부 도각 파일(DXF·DWG)을 읽어 편집 화면에 실을 도면으로 바꾼 결과."""
status: str = "success"
project_id: str
drawing: dict[str, Any]
entity_count: int
class DrawingExportRequest(BaseModel):
"""캐드 화면의 도면을 DXF·DWG 파일로 내보내는 요청 (2026-09-06 사용자 지시)."""
drawing: dict[str, Any]
file_format: str = Field(default="dxf", pattern="^(dxf|dwg)$")
# 내려받을 파일 이름(확장자 제외). 비우면 도면 id 를 쓴다.
name: str | None = Field(default=None, max_length=120)
class FrameTemplateSaveRequest(BaseModel):
"""도각 편집 화면이 [완료]에서 넘기는 도각."""
drawing: dict[str, Any]
class FrameTemplateSaveResponse(BaseModel):
"""회사 도각 저장 결과."""
status: str = "success"
project_id: str
customized: bool = True