fix(472-5 남음): 암선 · 암 경사 · B05 상단측 메모리 맵 걷음 · 노선 저장 뒤 옛 노선 칸 · hold 비움

- 암 경계 · 암 절토 경사 저장소(`B06_Section_UI_Page_Persist`) = 세션 칸이 주인 — 읽을 때마다 측점 열쇠 칸(`readCells`) · 고칠 때 지금 칸을 읽어 그 측점만 바꿔 씀(`putCell`) · 메모리 맵 · load · 갈아끼움 다시 읽기(keyedStores · reloadKeyedStores) 걷음 · ↶ 뒤 다음 조작이 되돌림을 덮던 흠(N5) 고침
- 저장 재료 = `offsets()` · `ratios()`(새 Map) · ↶ ↷ 가 rockb · cutslope 칸을 바꾸면 조정창과 같은 onRestore 로 카드 · 면적 다시
- B05 상단측 메모리 맵(uphillOverrides · load/saveUphillOverrides) 걷음 — 읽는 곳 없이 저장 뒤 비우기만 하던 사본 · 값 주인 = 세션 칸 `uphill` · 상단측 차례 = 기본 조각 그대로
- 노선 바뀐 [저장] 성공 뒤(페이지 다시 세운 뒤) 옛 노선 번호의 노선 범위 초안(`clearRouteDrafts`) · `route-draft-hold` 비움 · 넘김 규칙 그대로 · 같은 번호면 노선 칸 안 지움 · 실패면 그대로
- 시험 test_472_5r_rock_owner 7(옛 코드 빨강 5) · 옛 단언 고침(176_3 · 271 · 443 상단측 조각 · 344_3 저장소 load)
- 위키 암선 · 암 경사 · ↶ ↷ 규칙 · 노선 저장 뒤 정리 줄

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-19 15:13:30 +09:00
co-authored by Claude Opus 5.5
parent 1e2e798974
commit cfdcf0aed7
21 changed files with 438 additions and 164 deletions
+1 -12
View File
@@ -26,9 +26,6 @@ export interface PageActionContext {
panel: () => ReturnType<typeof createRoutePanel>;
profilePanel: () => ReturnType<typeof createRouteProfilePanel>;
bridge: () => ReturnType<typeof createStructuresBridge>;
/** 상단측(측구 방향) 사용자 변경분 — 키는 누가거리 문자열. */
uphillOverrides: Map<string, "left" | "right">;
persistUphillOverrides: () => void;
loadLatest: (forceFresh?: boolean) => Promise<RouteLatestResponse>;
renderLatest: (next: RouteLatestResponse) => void;
restoreSections: (routeId: number) => Promise<void>;
@@ -44,15 +41,7 @@ export function profileSaveParts(ctx: PageActionContext): DesignViewSave {
parts: {
// 구조물 — 보낼 것 = 세션 초안 ?? 이 보기 목록 · 저장 뒤 서버 목록(새 식별자)으로 화면을 맞춘다(472-6).
structures: () => ctx.bridge().structuresSavePart(),
// 상단측 + 비정규 측점 횡단 맞춤 — 기본 조각 본문 그대로(463) · 저장 뒤 세션(기본) · 메모리 값도 비움.
uphill: (base) =>
base && {
body: base.body,
after: async (response) => {
await base.after?.(response);
ctx.uphillOverrides.clear();
},
},
// 상단측 + 비정규 측점 횡단 맞춤 = 기본 조각 그대로(463 · 값 주인 = 세션 칸 `uphill` · 메모리 사본 없음 · 472-5)
},
// 횡단 본문은 늘 횡단 보기 몫 — [저장]이 숨긴 채라도 세움(386-6 · 옛 캐시 패치 길 지움)
// 공유 캐시는 한 벌(`design_shared`)이 저장 끝에 한 번 비움 — 여기서는 새 자료를 다시 읽어 종단 ·
@@ -7,7 +7,6 @@
* 전부 상태를 갖지 않는 변환 함수라 화면 흐름과 독립적이다.
* ========================================================================== */
import { readState, writeState } from "../A00_Common/b_page_state";
import type { RoutePanelValues } from "./B05_Profile_UI_Panel";
import type {
ModelBounds,
@@ -224,33 +223,3 @@ export function interpolateIrregularStations(
};
});
}
/* ── 측점 상단측(=측구 방향) 사용자 변경분 세션 보관 ─────────────────────
* 3D 램프 클릭으로 바꾼 값. 경로 확정 때 uphill_overrides로 백엔드에 병합한다.
* 화면 본체가 700줄에 닿아 읽기·쓰기만 여기로 뺐다(2026-09-04, 동작 불변). */
/** 세션에 남은 상단측 변경분을 읽는다. 손상된 값은 무시하고 빈 것으로 시작한다. */
export function loadUphillOverrides(projectId: string): Map<string, "left" | "right"> {
const overrides = new Map<string, "left" | "right">();
try {
const stored = readState<Record<string, "left" | "right">>("uphill", projectId);
if (!stored) return overrides;
Object.entries(stored).forEach(([chainage, side]) => {
if (side === "left" || side === "right") overrides.set(chainage, side);
});
} catch {
/* 손상된 세션 값은 무시 — 자동 판정값으로 재시작. */
}
return overrides;
}
/** 상단측 변경분을 세션에 적는다. 저장 실패는 무시한다(값은 메모리에 남는다). */
export function saveUphillOverrides(
projectId: string,
overrides: ReadonlyMap<string, "left" | "right">,
): void {
try {
writeState("uphill", Object.fromEntries(overrides), projectId);
} catch {
/* 세션 저장 실패는 무시 — 값은 메모리에 유지된다. */
}
}