54 lines
3.1 KiB
TypeScript
54 lines
3.1 KiB
TypeScript
/* =============================================================================
|
||
* B05_Profile/logic/B05_Profile_Grade_Criteria.ts
|
||
* 종단 법정 기준표(설계속도 × 지형 → 종단기울기 상한 · 종단곡선 반경) · 종류별 설계속도 — 화면
|
||
* `B05_Profile_UI_Panel_Fields.ts` 에서 옮김(511-B B-3 · X5 · 순수 자료). 파이썬 표 =
|
||
* `config_system_design.FOREST_ROAD_PROFILE_CRITERIA`(추천 · 폴백 · 기본값 해석 몫) · 거울 시험 =
|
||
* resources/tester/test_442_2_grade_limit_mirror.py.
|
||
* ========================================================================== */
|
||
|
||
export type DesignSpeed = 20 | 30 | 40;
|
||
export type TerrainType = "normal" | "special";
|
||
|
||
/**
|
||
* 「임도설치 및 관리 등에 관한 규정」[별표 1-2] 기준값.
|
||
* 등급을 바꾸면 이 값이 계획선 폼의 placeholder(미입력 시 서버 기본값)로 반영된다.
|
||
* 실제 기본값 결정은 서버 config가 단일 소스이며 여기서는 안내만 한다.
|
||
*/
|
||
/* 종단기울기·종단곡선 반경 — 지식DB `설계제원_총괄 §6·§7`(간선·산불진화 공통,
|
||
* 설계속도 40/30/20 → 7·10 / 8·12 / 9·14 %, 반경 450/250/100 m) 값과 일치한다
|
||
* (2026-08-19 재점검). 서버 `legal_grade_limit_pct`가 같은 표를 쓰므로 화면 안내와
|
||
* 실제 적용값이 어긋나지 않는다.
|
||
*
|
||
* ⚠ 미해결(사용자 협의 필요, 2026-08-19 재점검에서 확인):
|
||
* ① 등급 선택지가 간선·지선·작업인데 현행 규칙은 **지선 폐지**, 3종은 간선·
|
||
* 산불진화·작업이다(설계제원_총괄 §1 [구현] 지침).
|
||
* ② 지식DB의 40/30/20 표는 **설계속도**별이고 간선·산불진화 공통이다. 지금은
|
||
* 등급에 속도를 고정 매핑(trunk=40·branch=30·work=20)했는데, 작업임도는
|
||
* 설계속도 20 이하 + 종단기울기 최대 20% 범위 조정이라는 별도 규정이다.
|
||
* ③ "최소 곡선반경" 입력 칸의 안내값이 **종단**곡선 반경(450/250/100)이다.
|
||
* 평면 최소곡선반지름은 일반지형 60/30/15 (설계제원_총괄 §4).
|
||
* 값을 임의로 바꾸지 않고 남긴다 — 기본값 확정은 사용자 협의 영역이다. */
|
||
export const PROFILE_CRITERIA: Record<
|
||
DesignSpeed,
|
||
{ grade: Record<TerrainType, number>; radius: number }
|
||
> = {
|
||
40: { grade: { normal: 7, special: 10 }, radius: 450 },
|
||
30: { grade: { normal: 8, special: 12 }, radius: 250 },
|
||
20: { grade: { normal: 9, special: 14 }, radius: 100 },
|
||
};
|
||
|
||
/** 적용 종단기울기 상한(%) — 넣은 값(> 0)이면 그 값 · 비웠으면 설계속도 · 지형 법정 기준(좌측 패널 · 페이지 설정 한 칸 463). */
|
||
export const gradeLimitOf = (
|
||
speed: DesignSpeed,
|
||
terrain: TerrainType,
|
||
typed: number | null,
|
||
): number => (typed != null && typed > 0 ? typed : PROFILE_CRITERIA[speed].grade[terrain]);
|
||
|
||
/** 종류별로 고를 수 있는 설계속도 — 작업임도는 20 이하라 20만 둔다(별표2 Ⅰ.3). */
|
||
export const SPEED_CHOICES: Record<string, Array<DesignSpeed>> = {
|
||
trunk: [20, 30, 40],
|
||
fire: [20, 30, 40],
|
||
work: [20],
|
||
branch: [20],
|
||
};
|