- logic/B06_Section_Station_Swap: 묶음 측점(PipelineStation[]) → 새 상세 객체 · 같은 측점(열쇠 · 없으면 같은 자리 같은 종류)은 앞 횡단 이어 받음(설계 · 구조물 제원 · 이름) · 자리 · 지반 표본만 새것 · 새 측점 = 지반 표본 + 기본 설계 · 빠진 측점 뺌 · formatStation(파이썬 format_station 짝) - Section_Store swapSectionStations: 같은 목록이면 그대로 · 바뀌면 캐시 · 세션 상세 갈아끼움 · 옛 열쇠 = 세워 둔 목록(옮긴 관도 옛 id) · 새 열쇠 = 묶음이 정한 것 · 노선 모양이 바뀐 차례면 세션 고침 넘김(사라진 측점 = 「노선 밖 고침 N 건」) · 듣는 쪽 subscribeSectionDetail - 횡단 보기 followSwaps(가게 stations 따라감): 조정창 값(반폭 · 기슭막이 · 유입 · 집수정 · 추가 벽)을 옮긴 자리로 · 암 경계 · 암 경사 다시 읽음 · 보일 때 카드 · 종단도 다시 · 떠난 보기의 옛 맵은 지금 값을 안 덮음 - 카드 통째 그리기 = 보이는 줄 + 한 줄만 바로 · 나머지는 같은 id 빈 자리 → 쉬는 틈에 진짜 카드 - 시험: 셋 늘고 둘 빠진 목록(카드 8) · 관 45.054 → 47 m 고침 이어 받음 · 노선 밖 고침 버림 · 조정창 옮김 · 같은 목록 안 갈아끼움 · 보이는 카드 수 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QfHKQs7J3hQELKMWQMUJEy
32 lines
1.8 KiB
TypeScript
32 lines
1.8 KiB
TypeScript
/* =============================================================================
|
|
* B06_Section_UI_Page_Station_Swap.ts
|
|
* 횡단 보기가 계산 묶음 측점을 따라감(PLAN 346-2 4파) — 가게 `stations` 가 측점 목록을 바꾸면(늘고 줄면)
|
|
* 상세 객체를 갈아끼우고(`swapSectionStations`) 조정창 값 · 암 경계 · 암 경사를 새 자리로 옮긴 뒤 보일 때 카드 ·
|
|
* 종단도를 다시(카드는 보이는 것 먼저 · 다시 셈은 그 길이 맡음 · 안 보이면 다시 보일 때 그림).
|
|
* ========================================================================== */
|
|
|
|
import { useDesignStore } from "../A00_Common/design/design_store";
|
|
import { swapSectionStations } from "./B06_Section_Section_Store";
|
|
import { moveSessionMaps } from "./B06_Section_UI_Page_Link_Session";
|
|
import { reloadKeyedStores } from "./B06_Section_UI_Page_Persist";
|
|
|
|
/** 묶음 측점을 따라감 — 돌려준 함수로 끊음. `redraw` = 캐시에서 상세를 다시 읽어 카드 · 그림 다시. */
|
|
export function followSwaps(
|
|
projectId: string | null,
|
|
routeId: () => number | null,
|
|
host: { visible: () => boolean },
|
|
redraw: () => Promise<void>,
|
|
): () => void {
|
|
if (!projectId) return () => undefined;
|
|
return useDesignStore(projectId, null).subscribe("stations", (stations) => {
|
|
const route = routeId();
|
|
if (route === null || !stations?.length) return;
|
|
void swapSectionStations(projectId, route, stations).then((swap) => {
|
|
if (!swap) return; // 같은 목록 — 제자리 갱신 길이 맡음
|
|
moveSessionMaps(swap.moves); // 조정창 값(반폭 · 기슭막이 · 유입 · 집수정 · 추가 벽)
|
|
reloadKeyedStores(); // 암 경계 · 암 경사 = 측점 열쇠 세션 → 새 목록 누가거리로
|
|
if (host.visible()) void redraw();
|
|
});
|
|
});
|
|
}
|