- M02 종류별 탭 [종류 더하기] = 본보기(구조물 정본 원본) 복사 — 키 자동 · 이름 「본보기 2」 · 옵션 · 표시 · 그룹 · 배치 · 규칙 · 종류 덧칸 · 반영 그대로 · 종류.{새}.본보기 · 관 지점 종류 · 복사본은 본보기 밖
- 구조물 표 = 본보기 처음값 이어받음(resolveCatalog · resolve_catalog 짝 · 줄 칸 base) · baseType/base_type · specFor(명세) · 덧단 · 길이 전후 풀기 · 옹벽 추가 단 콘크리트
- 검사(화면 = 서버 짝) — 본보기 = 원본 · 같은 군 · 자리꼴 · 정본 · 만든 뒤 고정 · 복사본은 본보기가 숨긴 칸 이어받음 · 서버 덧칸 본보기 받음
- 특수 동작 = 동작 이름 — 바로 안 놓기 · 포장 나누기 = 포장_물넘이_겹침 · 월류 높이 기다림 = 월류단면
- 정본 목록 = 표 — 파이썬 관 지점 종류 = catalog owner · B05 시설 서브폼 = 표 형상 · 안 쓰는 손 목록 걷음
- drawing_views — 스키마에서 빼고 읽을 때 버림 · M02 [저장] 때 빠짐(코드는 마스터 안 고침)
- 이관 = 지난 판 이름 대신 측점 계획 자리(planted)로 가름 · all_type_names 걷음
- 허용 거리 = common_util_structure_station.py 한 곳(SAME_STATION_M · EDGE_TOLERANCE_M · PIPE_MATCH_M) · TS 표는 station.ts 머리
- 시험: test_323_7_new_type(템플릿 · 일곱 갈래 · 그림 · 검사 짝 · 서버 읽기) · 322-0 유령 시험 = 자리 · 옛 도움 파일 동작 · 표 길 · 기대 글 고침
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ji4nuyLVHcxrXWHTdb5nRD
124 lines
5.1 KiB
TypeScript
124 lines
5.1 KiB
TypeScript
/* =============================================================================
|
|
* design_structure_pipe.ts
|
|
* 횡단배수 › 배관 명세 — 사용자 구조물 표 01(`docs/raw/구조물정의_표/01_횡단배수_배관.md`) 그대로.
|
|
*
|
|
* 컨테이너 다섯: 관(필수) · 관 보호공(유입)(필수) · 관 보호공(유출)(필수) · 흙막이(선택 · 개수 = 유출
|
|
* 「추가 기슭막이(단)」 · 54-1) · 도수로/돌붙임(선택 · 여러 개). 집수정 = 길이 · 전 · 후 없음(54-1).
|
|
* 구조 · 정본 = 이 명세 · 이름만 정의(M02)에서 바꿈.
|
|
* 저장 키 = pipe_points.json 옛 키 그대로(B06 횡단 · B07 · B08 이 읽는 자리) — 흙막이 값은 옛 「기슭막이」
|
|
* (`inlet_type` · `*_revet_*`)에 둠. 새 키 = 집수정 높이 · 선택 컨테이너(`soil_add_{n}_*` · `chute_add_{n}_*`).
|
|
* 정함(PLAN 52): 유출 형태 = 흙막이 6가지 · 도수로/돌붙임 = 구조만 · 길이 = 전 + 후 맞물림.
|
|
* 계산(관 길이 · 높이 안내)은 `design_structure_pipe_calc`.
|
|
* import = 같은 폴더 명세뿐 — 시험이 이 폴더 파일만 옮겨 돌림.
|
|
* ========================================================================== */
|
|
|
|
import type { SpecChoice, SpecItem, StructureSpec } from "./design_structure_spec";
|
|
import { CHUTE_ADD, guardItems, revetKeys, SOIL_ADD, SOIL_FORMS } from "./design_structure_guard";
|
|
import { BOX_SPEC } from "./design_structure_box";
|
|
import { FORD_SPEC } from "./design_structure_ford";
|
|
import { FORD_PAVEMENT_SPEC } from "./design_structure_ford_pavement";
|
|
import { ETC_SPEC, PAVEMENT_SPEC } from "./design_structure_road";
|
|
import { baseType } from "../../common_util/common_util_structure_catalog";
|
|
|
|
const SOIL = "기슭막이"; // 저장 값(옛 키 그대로) — 화면 이름은 흙막이
|
|
const BASIN = "집수정";
|
|
const BASIN_FORMS: SpecChoice[] = [
|
|
{ value: "I", label: "I형" },
|
|
{ value: "L", label: "L형" },
|
|
{ value: "U", label: "ㄷ형" },
|
|
];
|
|
/** 보호공 형태 · 길이 · 높이 · 전 · 후 — 구조 갈래마다 옛 키(흙막이 양식 = `design_structure_guard`). */
|
|
const protectItems = (keys: Record<string, Record<string, string>>): SpecItem[] =>
|
|
guardItems(keys, { [BASIN]: BASIN_FORMS, [SOIL]: SOIL_FORMS });
|
|
|
|
export const PIPE_SPEC: StructureSpec = {
|
|
typeId: "pipe",
|
|
containers: [
|
|
{
|
|
id: "pipe",
|
|
title: "관",
|
|
required: true,
|
|
link: "grv6lny", // 정의 그룹 「관」(46장) — 집계표 잇기 자리 그대로
|
|
items: [
|
|
{
|
|
id: "diameter",
|
|
label: "관경",
|
|
kind: "select",
|
|
key: "pipe_diameter_mm",
|
|
asNumber: true,
|
|
choices: ["800", "1000", "1200", "1500"].map((v) => ({ value: v, label: v })),
|
|
},
|
|
{ id: "length", label: "관 길이 (m)", kind: "auto" },
|
|
],
|
|
},
|
|
{
|
|
id: "inlet",
|
|
title: "관 보호공 (유입)",
|
|
required: true,
|
|
link: "gnbf9m9",
|
|
items: [
|
|
{
|
|
id: "structure",
|
|
label: "구조",
|
|
kind: "select",
|
|
key: "inlet_type",
|
|
choices: [
|
|
{ value: BASIN, label: "집수정" },
|
|
{ value: SOIL, label: "흙막이", also: { inlet_structure: "revet" } },
|
|
],
|
|
},
|
|
...protectItems({
|
|
[BASIN]: { form: "inlet_structure", height: "inlet_basin_height_m" },
|
|
[SOIL]: revetKeys("inlet"),
|
|
}),
|
|
// 집수정만 · 유 / 무 = 저장 "true" / "false" · 빈 값 = 유(필수 상자 기본 채움 · 177-2) · 저장만(B07 · B08 안 읽음)
|
|
{
|
|
id: "animal",
|
|
label: "동물이동형",
|
|
kind: "select",
|
|
choices: [
|
|
{ value: "true", label: "유" },
|
|
{ value: "false", label: "무" },
|
|
],
|
|
default: "true",
|
|
by: { item: "structure", map: { [BASIN]: { key: "inlet_basin_animal" } } },
|
|
},
|
|
],
|
|
},
|
|
{
|
|
id: "outlet",
|
|
title: "관 보호공 (유출)",
|
|
required: true,
|
|
link: "g9lq9uk",
|
|
items: [
|
|
{
|
|
id: "structure",
|
|
label: "구조",
|
|
kind: "select",
|
|
key: "outlet_type",
|
|
choices: [{ value: SOIL, label: "흙막이" }],
|
|
},
|
|
...protectItems({ [SOIL]: revetKeys("outlet") }),
|
|
],
|
|
},
|
|
SOIL_ADD, // 개수 = 유출 「추가 기슭막이(단)」(54-1)
|
|
CHUTE_ADD,
|
|
],
|
|
// 표 01 에 없는 옛 칸 — 화면에서 빼고 값은 남김(지난 정의 값)
|
|
retired: ["pipe_kind", "wing_wall_type", "inlet_basin_form", "inlet_basin_material"],
|
|
};
|
|
|
|
/** 명세로 그리는 종류 — 종류 키 → 명세(표가 오는 대로 더함). */
|
|
export const STRUCTURE_SPECS: Readonly<Record<string, StructureSpec>> = {
|
|
pipe: PIPE_SPEC,
|
|
box_culvert: BOX_SPEC,
|
|
ford_bridge: FORD_SPEC,
|
|
ford_pavement: FORD_PAVEMENT_SPEC,
|
|
pavement_concrete: PAVEMENT_SPEC,
|
|
etc: ETC_SPEC,
|
|
};
|
|
|
|
/** 그 종류의 명세 — 복사한 종류는 본보기 명세(323-7 · `baseType`). 화면은 이것으로 고름(종류 키 직접 안 씀). */
|
|
export const specFor = (typeId: string): StructureSpec | undefined =>
|
|
STRUCTURE_SPECS[baseType(typeId)];
|