feat(393-2): B05 우측 「횡단」 · 「이전 횡단」 판 = B06 횡단 카드 읽기 전용 — 구조물 · 포장 · 면적 · 축 · 단면 사본(B06 고름 · 줌 기억 안 건드림) · 정본만 읽는 제어기 export

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XWh5wNNycMkbwMpACz1rte
This commit is contained in:
2026-10-17 17:30:03 +09:00
co-authored by Claude Opus 5.5
parent dec208f11a
commit a3dd0a1cf1
8 changed files with 244 additions and 13 deletions
@@ -181,6 +181,11 @@ const store = load("A00_Common", "design", "design_store.ts");
STUBS["b_svg_zoom_pan"] = { attachSvgZoomPan: () => undefined };
STUBS["B05_Profile_UI_RouteEdit_Cross_Draw"] = { CROSS_PLOT_PAD: {}, summarizeCross: () => "" };
STUBS["B05_Profile_UI_RouteEdit_Chrome"] = { sidePanelsOf: new WeakMap() }; // 판 양식(382-1) — 화면 밖
// B06 카드 그림(393-2) — 화면 밖 · 판 값 고르기는 진짜
STUBS["B05_Profile_UI_RouteEdit_Cross_Card"] = {
routeCrossSource: () => null,
routeCrossCard: () => null,
};
const pane = load("B05_Profile", "B05_Profile_UI_RouteEdit_Cross.ts");
const r3 = (value) => (typeof value === "number" ? Math.round(value * 1000) / 1000 : null);
@@ -67,7 +67,14 @@ let stations = [
let footprint = null;
let route = { v: 1 };
// 접힌 판 펴기 — 몸(side)에 묶인 패널 묶음 흉내
const panels = { now: null, current: () => panels.now, open: (id) => (panels.now = id) };
// 393-1 — 측점 눈금이 연 판은 기억 안 함(remember 거짓)
const panels = {
now: null,
current: () => panels.now,
open: (id, remember = true) => ((panels.now = id), (panels.remember = remember)),
};
// 393-2 — 판 그림 = B06 카드(가짜) · 그린 단면 id 를 적음
const cards = [];
const side = { append() {} };
const STUBS = {
@@ -79,6 +86,12 @@ const STUBS = {
summarizeCross: () => "",
},
"./B05_Profile_UI_RouteEdit_Chrome": { sidePanelsOf: new WeakMap([[side, panels]]) },
"./B05_Profile_UI_RouteEdit_Cross_Card": {
routeCrossSource: (projectId, pipe, chainageM, pane) => ({
section: { station_id: `b05-${pane}-s${chainageM}` },
}),
routeCrossCard: (source) => (cards.push(source.section.station_id), fakeEl()),
},
"../A00_Common/design/design_pipeline_page": {
pagePipeline: () => ({
output: (name) => (name === "ground" ? { stations } : null),
@@ -171,8 +184,10 @@ async function run() {
];
footprint = { records: [record("grid:5", 102, 9, -4, false, true)] };
route = { v: 2 };
cards.length = 0;
await cross.refresh();
out.afterEdit = cross.watched();
out.cardsAfterEdit = cards.slice();
// 평면 눈금 클릭 = 공용 고름에 적음 · 판이 접혀 있으면 폄
const heard = [];
@@ -185,6 +200,7 @@ async function run() {
selection: pick.readSelection("p-1"),
heard: heard.slice(),
panel: panels.now,
remember: panels.remember,
watched: cross.watched(),
};
@@ -92,3 +92,13 @@ def test_관_구조물_고름은_마름모만(results):
def test_고름을_풀면_법선도_없다(results):
assert results["cleared"] == {"watched": None, "redrawn": True}
def test_393_판_그림은_B06_카드_사본_노선_고치면_전후(results):
# 노선 고친 차례 — 아래 판 = 고치기 전 측점(이전 사본 id) · 위 판 = 새 측점 · B06 카드 id 와 안 겹침
assert results["cardsAfterEdit"] == ["b05-prev-s100", "b05-cur-s102"]
def test_393_1_눈금이_연_판은_기억_안_함(results):
assert results["planClick"]["panel"] == "cross"
assert results["planClick"]["remember"] is False