Merge remote-tracking branch 'origin/dev' into sub_laptop_1

This commit is contained in:
2026-10-19 07:22:34 +09:00
2 changed files with 43 additions and 23 deletions
+3 -23
View File
@@ -21,7 +21,8 @@
* [저장](sub5)이 서버 정본 — 노선을 먼저 보내고 `pendingAlignment(DRAFT_ROUTE_ID)` 를 새 노선에 보냄.
* ========================================================================== */
import { createDesignPipeline, publishToStore, type DesignPipeline } from "./logic/design_pipeline";
import { createDesignPipeline, type DesignPipeline } from "./logic/design_pipeline";
import { publishPagePipeline } from "./design_pipeline_page_publish";
import { SOURCE_INPUT } from "./logic/design_pipeline_types";
export { pipelineWork } from "./logic/design_pipeline";
import { pipelineCrossSource, type PipelineCrossSource } from "./design_pipeline_cross";
@@ -30,7 +31,6 @@ import type {
ChangeSource,
FollowPatch,
PipelineInputs,
PipelineOutputs,
PipelineRunRecord,
PipelineStation,
RangePart,
@@ -380,27 +380,7 @@ function createPagePipeline(
},
},
});
const publish = publishToStore(store);
/** 상세가 맞춘 측점 목록(열쇠 · 자리) — 열 때 · 되돌린 차례 측점 · 마지막으로 낸 측점. 같은 목록이면 가게에
* 다시 안 냄(되돌린 상세 측점이 묶음 측점과 달라도 · 관 · 구조물 메아리가 상세를 갈아끼우지 않게 · 349-0q). */
let stationsShown: string | null = null;
pipe.subscribe((event) => {
const saved = event.kind === "stage" && (event.stage === "ground" || event.stage === "profile");
const quiet = saved && event.generation === quietGeneration;
if (event.kind === "stage" && event.stage === "ground") {
const list = JSON.stringify(
(event.value as PipelineOutputs["ground"] | null)?.stations.map((station) => [
station.key,
station.chainageM,
station.x,
station.y,
]) ?? null,
);
if (!quiet && list === stationsShown) return;
stationsShown = list;
}
if (!quiet) publish(event);
}, "가게");
publishPagePipeline(pipe, store, () => quietGeneration);
/** 노선 초안을 버린 차례 끝 — 초안 전 상세로 되돌림(열 때와 같은 상태 · 측점이 달라도 · 다른 자리는
* 기록에) · 그 상세가 저장 정본(다시 하기도 같은 기준). 차례 끝에서 판정 — ground 를 건너뛰어도 · 사진첩
* 되돌리기가 가게 초안을 먼저 비워도(349-0m). */
@@ -0,0 +1,40 @@
/* =============================================================================
* A00_Common/design/design_pipeline_page_publish.ts
* 페이지 계산 묶음 → 가게(stations · profile · footprint · generation) 잇기(`design_pipeline_page` 700줄 쪼갬 · 466).
*
* 조용한 차례(열 때 · 노선 초안을 버린 차례)는 측점 · 종단을 안 냄(상세 = 저장 정본 · 초안 전 상세 그대로) ·
* 그 목록을 「보인 측점」으로 적어 뒤 같은 목록 차례도 안 냄(관 · 구조물 메아리가 상세를 갈아끼우지 않게 · 349-0q).
* ========================================================================== */
import { publishToStore, type DesignPipeline } from "./logic/design_pipeline";
import type { PipelineOutputs } from "./logic/design_pipeline_types";
import type { DesignStore } from "./design_store";
/** 묶음 출력을 가게에 냄 — `quietGeneration` = 측점 · 종단을 안 내는 차례 번호(부를 때마다 읽음). */
export function publishPagePipeline(
pipe: DesignPipeline,
store: DesignStore,
quietGeneration: () => number,
): void {
const publish = publishToStore(store);
/** 상세가 맞춘 측점 목록(열쇠 · 자리) — 열 때 · 되돌린 차례 측점 · 마지막으로 낸 측점. 같은 목록이면 가게에
* 다시 안 냄(되돌린 상세 측점이 묶음 측점과 달라도 · 관 · 구조물 메아리가 상세를 갈아끼우지 않게 · 349-0q). */
let stationsShown: string | null = null;
pipe.subscribe((event) => {
const saved = event.kind === "stage" && (event.stage === "ground" || event.stage === "profile");
const quiet = saved && event.generation === quietGeneration();
if (event.kind === "stage" && event.stage === "ground") {
const list = JSON.stringify(
(event.value as PipelineOutputs["ground"] | null)?.stations.map((station) => [
station.key,
station.chainageM,
station.x,
station.y,
]) ?? null,
);
if (!quiet && list === stationsShown) return;
stationsShown = list;
}
if (!quiet) publish(event);
}, "가게");
}