fix(365-5): 들어온 화면 무관 같은 횡단 값 — 저장 기준 · 설계 칸 · 시설 제원 한 벌

- 화면 검증 원인 셋: ① 초안 첫 계획선 꼭짓점이 보기가 심은 측점(초안 자리 관)으로 흔들린 저장 기준을 씀 → 서버 저장 종단 꼭짓점(storedPvi) ② 묶음 cross 설계 칸이 다시 셈이 고쳐 쓴 화면 상세(옛 측구 결과 → 선택)를 읽음 → 세션 저장 상세 + 옛 측구 결과(ditch_enabled)도 실음 ③ 초안 자리로 미리 뜬 관 측점 제원이 누가거리 짝에서 빠짐 → 남은 저장 시설 측점과 차례 짝(349-0d 규칙)
- 저장 노선 기준이 바뀌면(보기가 늦게 심은 측점 · 초안 · 되돌린 뒤 빼고) 처음부터 · 제원 지문을 cross 입력에 · 보기 첫 마운트 뒤도 고리
- placed → common_util_route_follow placedOnLine(700줄)
- ORCA 검증_sub7: B05 끌기 길 · B06 먼저 새로고침 · B05 먼저 새로고침 = 67 측점 계획고 · 절토 · 성토 같음 · 열 때 1바퀴
- 시험 test_365(설계 칸 = 저장 상세 · 차례 짝 · 제원 지문 · 초안 계획선 = 저장 종단)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TteK8mfYZetk5P3bEZkyVZ
This commit is contained in:
2026-10-17 14:22:51 +09:00
co-authored by Claude Opus 5.5
parent 201ff9eb94
commit 0652812153
8 changed files with 165 additions and 26 deletions
@@ -465,8 +465,75 @@ async function run() {
depthAfter: bermAfter.find((row) => row[0] === inside[0])[3],
runs: runs().length - mark,
};
const draftCtx = {
inputs: { route: bPipe.input("route") },
out: { ground: bPipe.output("ground"), route: bPipe.output("route") },
};
pageMod.disposePagePipeline(B);
page.clearDrafts(B);
// ⑫ 들어온 화면 무관(365-5) — 설계 칸 = 세션 저장 상세 · 초안 자리로 미리 뜬 시설 측점 = 차례 짝 · 제원 지문 ·
// 옛 측구 결과(ditch_enabled)도 실음 · 초안 첫 계획선 꼭짓점 = 서버 저장 종단
const crossMod = load("A00_Common", "design", "design_pipeline_cross.ts");
const C = "proj-365d";
const sec = (chainage_m, kind, design, extra = {}) => ({ chainage_m, kind, design, ...extra });
page.writeState(
"section-detail",
{
longitudinal: {},
cross_sections: [
sec(0, "bp", { ground_type: "soil" }),
sec(20, "regular", { ground_type: "soil", ditch_choice: null, ditch_enabled: false }),
sec(28, "irregular", { ground_type: "soil" }),
sec(40, "ep", { ground_type: "soil" }),
],
},
C,
7,
);
const screen = {
longitudinal: {},
cross_sections: [
sec(0, "bp", { ground_type: "soil" }),
// 다시 셈이 옛 측구 결과를 선택으로 굳힌 화면 상세 — 설계 칸은 세션 저장 상세가 이김
sec(20, "regular", { ground_type: "soil", ditch_choice: false, ditch_enabled: true }),
sec(27, "irregular", { ground_type: "soil" }, { culvert: { type: "pipe", diameter_m: 0.8 } }),
sec(40, "ep", { ground_type: "soil" }),
],
};
const st = (key, chainageM, kind) => ({ key, chainageM, kind });
const savedList = [
st("end:BP", 0, "end"),
st("grid:1", 20, "grid"),
st("pipe:p28", 28, "pipe"),
st("end:EP", 40, "end"),
];
const source = crossMod.pipelineCrossSource(C, screen, savedList, 7);
const bare = crossMod.pipelineCrossSource(
C,
{ ...screen, cross_sections: screen.cross_sections.filter((x) => x.chainage_m !== 27) },
savedList,
7,
);
// 보기가 심은 측점으로 흔들린 저장 기준(꼭짓점 +5 m) 대 서버 저장 종단 — 초안 첫 계획선은 저장 종단 쪽
const shaken = {
...savedBase,
basePvi: savedBase.basePvi.map((node) => ({ ...node, elevation_m: node.elevation_m + 5 })),
};
const planlineOf = (storedPvi) =>
grade.createPlanlineStage({ savedBase: () => shaken, savedLine: () => job.line, storedPvi })(
draftCtx,
);
const firstPvi = (base) => r3(base.basePvi[0].elevation_m);
const viewFree = {
grid20: source.input.byKey["grid:1"],
pipeSpec: source.specs.get("pipe:p28") ?? null,
specsDiffer: source.input.specsKey !== bare.input.specsKey,
firstStored: firstPvi(planlineOf(() => savedBase.basePvi)),
firstShaken: firstPvi(planlineOf(undefined)),
savedFirst: firstPvi(savedBase),
};
page.clearDrafts(C);
return {
kept,
b05,
@@ -479,6 +546,7 @@ async function run() {
shiftRuns,
sameAfterReload,
berm,
viewFree,
};
}
@@ -14,6 +14,10 @@
- 저장 노선 ▲▼ 한 번 = 횡단 한 벌 — 묶음 cross 가 다시 셈 창구(상세 설계) 한 번 · 종단도 예약 끔.
- 중심점 좌우 = 노선 차례는 cross 전에 밀림 → cross 한 번(계획고 맞춤 차례만).
- B06 다시 그림 = 겹친 신호(갈아끼움 · 묶음 cross · 초안) 한 번 · profile 차례는 안 그림.
못박는 것(365-5)
- 들어온 화면 무관 — 설계 칸 = 세션 저장 상세 · 초안 자리 시설 = 차례 짝 · 제원 지문 ·
초안 계획선 = 저장 종단.
- 초안 소단 = 지금 구조물 구간 · 쪽 깊이 = 세션 고침.
짝: `helper_365_page_pipeline.cjs`(진짜 TS · 서버 창구만 가짜 · 틀 = 346-2 시험) ·
`helper_365_swap_entry.ts` + `helper_365_swap.mjs`(진짜 상세 가게 · vite ssr).
@@ -161,6 +165,18 @@ def test_365_5_초안_소단_고침(r):
assert b["depthBefore"] is None and b["depthAfter"] == 2.5 and b["runs"] == 1
def test_365_5_들어온_화면_무관(r):
v = r["viewFree"]
g = v["grid20"]
# 설계 칸 = 세션 저장 상세(화면 상세가 굳힌 선택 false 대신 저장값) · 옛 측구 결과도 실음
assert g["ditchChoice"] is None and g["ditchEnabled"] is False
assert v["pipeSpec"] == {
"culvert": {"type": "pipe", "diameter_m": 0.8}
} # 초안 자리 관 = 차례 짝
assert v["specsDiffer"] # 제원이 바뀌면 입력 지문도 바뀜(고리가 다시 셈)
assert v["firstStored"] == v["savedFirst"] and v["firstShaken"] != v["savedFirst"]
def test_365_4_다시_그림_한_번():
swap = (ROOT / "B06_Section/B06_Section_UI_Page_Station_Swap.ts").read_text(encoding="utf-8")
view = (ROOT / "A00_Common/design/design_view_cross.ts").read_text(encoding="utf-8")