feat(측점열쇠): 346-2 덧 2 열쇠 한 벌 — 구간형 :start · :end · 묶음 측점 종류(grid · end) · 같은 열쇠 둘째 규칙 공용
- common_util_station_key(ts · py 짝): role 덧붙임(구간형 시작 · 끝 = structure:<id>:start · :end · 기준은 structure:<id> 그대로) · grid(원래 격자 번호) · end(BP/EP) 종류 · dedupeStationKeys(같은 열쇠 둘째부터 at:<누가거리>) - B06 stationKeysOf 가 같은 규칙(측점 계획 · 구조물 목록의 시작 · 끝 자리 · 공용 dedupe) - 거울 시험에 새 갈래(구간형 · grid · end · dedupe) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QfHKQs7J3hQELKMWQMUJEy
This commit is contained in:
@@ -2,6 +2,8 @@
|
||||
|
||||
일반 = ``grid:k``(누가거리 ÷ 측점 간격 반올림) · 관 = ``pipe:<id>`` · 구조물 = ``structure:<id>`` ·
|
||||
시종점 = ``end:BP`` · ``end:EP`` · id 를 모르는 구조물 측점 = ``at:<누가거리 0.01 m>``.
|
||||
구간형 구조물 시작 · 끝 측점 = ``structure:<id>:start`` · ``:end``(기준 측점은 ``structure:<id>``).
|
||||
한 목록에 같은 열쇠가 둘이면 둘째부터 ``at:<누가거리>``(``dedupe_station_keys``).
|
||||
|
||||
⚠ 파이썬·TS 짝 — ``common_util_station_key.ts`` ``stationKey`` ↔ ``station_key``.
|
||||
한쪽을 고치면 다른 쪽도 고치고 거울 시험 ``resources/tester/test_344_3_station_key_mirror.py``.
|
||||
@@ -31,19 +33,43 @@ def station_key(
|
||||
interval_m: float | None,
|
||||
station_id: str | None = None,
|
||||
id_kind: str = "structure",
|
||||
role: str = "anchor",
|
||||
) -> str:
|
||||
"""측점 열쇠 — irregular 는 id 가 있으면 pipe: · structure:(``id_kind``) · 없으면 at:."""
|
||||
"""측점 열쇠 — irregular 는 id 가 있으면 pipe: · structure:(``id_kind``) · 없으면 at:.
|
||||
|
||||
구간형 시작 · 끝은 ``role`` 로 ``:start`` · ``:end``. ``grid`` · ``end`` 는 ``station_id`` 에
|
||||
원래 격자 번호 · BP/EP(없으면 누가거리 ÷ 간격 반올림 · 0 이면 BP).
|
||||
"""
|
||||
loose = f"at:{chainage_key(chainage_m)}"
|
||||
suffix = "" if role == "anchor" else f":{role}"
|
||||
if kind == "bp":
|
||||
return "end:BP"
|
||||
if kind == "ep":
|
||||
return "end:EP"
|
||||
if kind == "end":
|
||||
return (
|
||||
f"end:{station_id if station_id is not None else ('BP' if chainage_m <= 0 else 'EP')}"
|
||||
)
|
||||
if kind in ("pipe", "structure"):
|
||||
return f"{kind}:{station_id}" if station_id else f"at:{chainage_key(chainage_m)}"
|
||||
return f"{kind}:{station_id}{suffix}" if station_id else loose
|
||||
if kind == "irregular":
|
||||
return f"{id_kind}:{station_id}" if station_id else f"at:{chainage_key(chainage_m)}"
|
||||
return f"{id_kind}:{station_id}{suffix}" if station_id else loose
|
||||
if kind == "grid" and station_id is not None:
|
||||
return f"grid:{station_id}"
|
||||
if interval_m and interval_m > 0:
|
||||
return f"grid:{_half_up(chainage_m / interval_m)}"
|
||||
return f"at:{chainage_key(chainage_m)}"
|
||||
return loose
|
||||
|
||||
|
||||
def dedupe_station_keys(keys: list[str], chainages: list[float]) -> list[str]:
|
||||
"""한 목록에 같은 열쇠가 둘이면 둘째부터 ``at:<누가거리>`` — 열쇠마다 측점 하나."""
|
||||
seen: set[str] = set()
|
||||
out: list[str] = []
|
||||
for key, chainage in zip(keys, chainages, strict=True):
|
||||
unique = f"at:{chainage_key(chainage)}" if key in seen else key
|
||||
seen.add(unique)
|
||||
out.append(unique)
|
||||
return out
|
||||
|
||||
|
||||
def loose_chainage(key: str) -> float | None:
|
||||
|
||||
Reference in New Issue
Block a user