fix(평면): 새 구조물 측점 놓는 즉시 평면 비탈 끝 · 면적 = 저장 뒤 — 튐 없음 · 옮김 계획고 (PLAN 583-1 · 요구 441)

- 원인: 구조물을 새 측점에 놓으면 측점 갈아끼움(비동기)이 끝나기 전 묶음 cross 단계가 옛 상세를 봐 엔진 길로 빠짐 — 구조물 얹기 없는 한 차례(벽 측점 비탈 끝 35 · 55 m · 기존 벽 측점 18.96 m)가 약 80 ms 평면에 튐 · 다음 차례(0.25 s)에 저장 값
- design_shared savedCross = 도는 갈아끼움(swapInFlight)을 기다려 그 상세로 다시 셈 · 상세 가게 swapInFlight 새로
- 종단도 listed() 옛 측점 = 저장 정본 상세 — 갈아끼운 상세로 셈해 옮긴 구조물 옛 측점 꼭짓점이 안 옮겨져 계획고 최대 2.4 cm 갈리던 것(옮김 면적 차 0.17 → 0.0175 ㎡)
- 시험: test_272_swap_keeps_canon 에 도는 갈아끼움 기다림 · test_473_lane_ready 글 대조를 새 호출 꼴로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-29 15:05:16 +09:00
co-authored by Claude Opus 5.5
parent c4b37023c7
commit f4a7b183b0
7 changed files with 60 additions and 8 deletions
+8 -2
View File
@@ -24,6 +24,7 @@ import {
} from "../../B05_Profile/logic/B05_Profile_UI_Profile_Data";
import { showToast } from "@ui/ui_template_elements";
import { hasStaleDesigns } from "../../B06_Section/B06_Section_UI_Section_Common";
import { savedSectionDetail } from "../../B06_Section/B06_Section_Section_Canon";
import {
blocksMinCover,
findMinCoverViolations,
@@ -295,9 +296,14 @@ export function createDesignProfile(ctx: DesignProfileContext) {
return true;
}
/** 계획선 측점 줄 = 측점 한 벌 — 셈은 `design_profile_base` 몫(계산 묶음 planline 도 같은 기준). */
/** 계획선 측점 줄 = 측점 한 벌 — 셈은 `design_profile_base` 몫(계산 묶음 planline 도 같은 기준). 옛 측점 =
* 저장 정본 상세 — 갈아끼운 상세(새 측점 목록)면 옮긴 구조물 옛 측점 꼭짓점이 안 옮겨져 계획고가 갈림(583). */
const listed = (): AlignmentBase | null =>
listedBase(storedBase, detail, planted ? irregularStations : null);
listedBase(
storedBase,
(routeId !== null && savedSectionDetail(projectId, routeId)) || detail,
planted ? irregularStations : null,
);
/** 계획고 [저장] 조각(472-6) — 저장 뒤 서버 선형으로 기준을 갈아 다시 그림. */
const alignmentSave = createProfileSave({
+8 -3
View File
@@ -53,6 +53,7 @@ import {
holdSectionDetail,
invalidateSectionDetail,
restoreSectionDetail,
swapInFlight,
swapSectionStations,
} from "../../B06_Section/B06_Section_Section_Store";
import {
@@ -256,15 +257,19 @@ function startPagePipeline(shared: DesignPageShared, profile: DesignProfile): vo
onUnstable: () => showToast(L("Design_Pipeline_Unstable"), "warning"),
// 저장 노선 횡단 = 다시 셈 창구 한 벌(365-4) — 카드 · 유토곡선 · [저장] 패치가 보는 상세 설계를 늘 고치고 그
// 값을 묶음 출력으로(발자국 · 평면 횡단 판) · 측점이 상세와 다르면(갈아끼움 전) 묶음 엔진(439)
savedCross: (detail, routeId, stations) =>
refreshSavedCross(
// 새 측점(관 · 구조물 놓음) = 도는 측점 갈아끼움을 기다려 그 상세로 — 안 기다리면 엔진 길로 빠져 구조물
// 얹기(평면 비탈 끝 · 폐회로 면적) 없는 한 차례가 화면에 튐(583)
savedCross: async (saved, routeId, stations) => {
const detail = (await swapInFlight(projectId, routeId))?.detail ?? saved;
return refreshSavedCross(
{ projectId, routeId, detail, edits: profile.pipelineSource().edits },
stations,
(updated) => {
if (updated.length) crossDesignsUpdated(shared, updated);
profile.redraw();
},
),
);
},
plantedBase, // 저장 노선 종단 기준 = 입력이 심는 측점(386-3 · 보기 심기 무관)
// 저장 상세 측점마다 등록 열쇠 — 초안 자리로 뜬 시설 측점의 입력 짝(주인 id · 457)
stationKeys: (routeId, detail) =>