- 열쇠 규칙 한 벌 = common_util_station_key(ts · py 짝 · 거울 시험) — 일반 grid:k · 관 pipe:<id> · 구조물 structure:<id> · 시종점 end:BP/EP · id 모름 at:<0.01 m> - 세션 칸 다섯(카드 선택 · 노견 확장 · 소단 깊이 · 암 경계 · 암 경사) = 측점 열쇠로 담음 · 부르는 쪽은 그대로 누가거리로 읽고 씀 · 칸마다 쓴 때 자리를 함께 담아 구조물 id 를 아직 모를 때도 그 측점 고침을 읽음 - 옛 초안(누가거리 열쇠)은 읽을 때 측점 열쇠로 옮김 · 지금 측점에 없는 고침은 지우지 않고 남김 - 측점 목록 = 상세가 초안 측점을 얹을 때 · 다시 셈 때 세움(관 id = 관 장부 · 구조물 id = 측점 계획 · 구조물 목록) - 노선 바뀜 넘김 carryStationDrafts — 카드 선택 넷(지반 유형 · 측구 종류 · 측구 선택 · 2단 경사) · 암 경계 · 암 경사만 · 단면 유형 · 측구 방향은 새 지형이 정함 · 사라진 측점 = 「노선 밖 고침 N 건」 한 줄(부르는 자리 = 3파) - 옛 시험 셋 새 창구로 맞춤 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QfHKQs7J3hQELKMWQMUJEy
44 lines
2.2 KiB
TypeScript
44 lines
2.2 KiB
TypeScript
/* =============================================================================
|
|
* common_util_station_key.ts
|
|
* 측점 열쇠 한 규칙(PLAN 344-3) — 노선이 바뀌어도 같은 측점을 같은 이름으로 부름.
|
|
* 일반 = `grid:k`(누가거리 ÷ 측점 간격 반올림) · 관 = `pipe:<id>` · 구조물 = `structure:<id>` ·
|
|
* 시종점 = `end:BP` · `end:EP` · id 를 모르는 구조물 측점 = `at:<누가거리 0.01 m>`(옛 초안 열쇠와 같은 몫).
|
|
*
|
|
* ⚠ 파이썬·TS 짝 — `common_util_station_key.py` `station_key` ↔ `stationKey`. 한쪽을 고치면 다른 쪽도
|
|
* 고치고 거울 시험 `resources/tester/test_344_3_station_key_mirror.py`.
|
|
* ========================================================================== */
|
|
|
|
/** 측점 종류 — 서버 측점 `kind`(bp · ep · regular · irregular) 그대로 받음. */
|
|
export type StationKeyKind = "bp" | "ep" | "regular" | "irregular" | "pipe" | "structure";
|
|
|
|
/** 누가거리 0.01 m — 옛 초안 열쇠(`toFixed(2)`)와 같은 자릿수. */
|
|
export const chainageKey = (chainageM: number): string =>
|
|
(Math.round(chainageM * 100) / 100).toFixed(2);
|
|
|
|
/**
|
|
* 측점 열쇠. irregular 는 id 가 있으면 `pipe:` · `structure:`(종류는 `idKind`) · 없으면 `at:`.
|
|
* 간격이 없거나 0 이하면 일반 측점도 `at:`.
|
|
*/
|
|
export function stationKey(
|
|
kind: StationKeyKind,
|
|
chainageM: number,
|
|
intervalM: number | null,
|
|
id: string | null = null,
|
|
idKind: "pipe" | "structure" = "structure",
|
|
): string {
|
|
if (kind === "bp") return "end:BP";
|
|
if (kind === "ep") return "end:EP";
|
|
if (kind === "pipe" || kind === "structure")
|
|
return id ? `${kind}:${id}` : `at:${chainageKey(chainageM)}`;
|
|
if (kind === "irregular") return id ? `${idKind}:${id}` : `at:${chainageKey(chainageM)}`;
|
|
if (intervalM && intervalM > 0) return `grid:${Math.round(chainageM / intervalM)}`;
|
|
return `at:${chainageKey(chainageM)}`;
|
|
}
|
|
|
|
/** 옛 초안 열쇠(누가거리 글 `"85.05"`) · `at:` 열쇠의 누가거리 — 측점 열쇠면 null. */
|
|
export function looseChainage(key: string): number | null {
|
|
const text = key.startsWith("at:") ? key.slice(3) : key;
|
|
if (!/^-?\d+(\.\d+)?$/.test(text)) return null;
|
|
return Number(text);
|
|
}
|