diff --git a/docs/raw/조사/2026-10-06_54-21_일원화_제안.md b/docs/raw/조사/2026-10-06_54-21_일원화_제안.md new file mode 100644 index 000000000..461dc81fc --- /dev/null +++ b/docs/raw/조사/2026-10-06_54-21_일원화_제안.md @@ -0,0 +1,224 @@ +# 54-21 B05 · B06 자료 일원화 제안 (조사 · 제안만) + +- 기준 `976c9b281` · 바탕: 54-16(`docs/raw/조사/2026-10-06_54-16_자료_한곳.md`) · 54-5 · 이번 전수 조사 셋(좌측 패널 모든 칸 · 저장 줄기와 서버 파일 · 옛 B08 칸) +- 코드 안 고침 · 커밋 없음 + +## 요약 + +- 지금: 같은 자료가 세션 키 · 패널 메모리 · 보기 지역 변수 · 서버 다시 읽기에 여러 벌. 가게(`design_store`)는 이름뿐(구독자 0 · 빈 칸 셋). 쓰기 입구가 좌측 패널 · 카드 단추 · 종단도 ▲▼ · 알약 끌기 · 보기 onShow 로 흩어짐. [저장]은 보기마다 다른 함수가 돌고 관 지점 쓰기가 최대 세 번. +- 목표: **자료 하나 = 가게 칸 하나 = 세션 키 하나**. 좌측 패널(+ 종단 · 횡단 직접 조작)은 가게에만 씀 · 두 보기는 가게를 읽어 그림 · 알림 한 길 · 보기 넘김에 서버로 안 덮음 · [저장] = 가게 → 서버 한 줄기 → 서버 정본 재계산. +- 가게 칸 10 · 삭제 · 재정의 후보 16 묶음 · 단계 8(0~7). + +## ① 지금 자료 지도 + +### 1-1 자료마다 쥔 곳 (두 벌 이상 굵게) + +| 자료 | 세션 키 | 메모리 · 지역 변수 | 서버 정본 | 쓰는 입구 | 읽는 곳 | +|---|---|---|---|---|---| +| 구조물 목록 · 옵션 · 잇기(`summary_item` · `group_items`) | `draft:structures` P | **종단 다리 `ownStructures` · 횡단 패널 `structures` · 한 벌 폼 `structures` · 한 벌 종단도 `structures`** · 가게 칸 `structures`(빈 칸) | `B05_Profile/route/structures.json` (`revision` · `definition_version` · `migrated_legacy`) | 폼 commit(`B05_Profile_UI_Structures_Panel_Commit.ts:216-219`) · 알약 끌기 · 횡단 패널(`B06_Section_UI_Page_Structures_Panel.ts:177`) | 종단 알약 · 벽 그림(`B06_Section_Engine_Structures_Wall.py`) · 3D(`B05_Profile_UI_Corridor_Structures_Hash.ts`) · M02(`M02_Table_Fill.py:119-168`) | +| 관 지점 · 관 옵션 · 컨테이너 · 잇기 | `draft:pipes` P · **`culvertopt` R(관 옵션 사본)** | **배수유역도 `pipeEditor` + `facilityStore` · `shared.lastPipes` · 종단 보기 `lastPipes` · 횡단 `pipeFacilities` · 폼 `pipeFacilities` · 종단 다리 `pipeStations`** | `B04_PreProcess//edits/pipe_points.json` (판번호 없음 · `route_signature`) | 폼(B05 `B05_Profile_UI_Drainage_Panel.ts:593-600` · B06 `B06_..._Structures_Panel.ts:262-284`) · 구간 · 세월교 · BOX 조정(`Span_Control.ts` · `Ford_Controls.ts`) | 카드(`B06_Section_UI_Page_Pipe_Options.ts`) · 서버 `Engine_Culvert.py` · 3D · 최소토피 · M02 | +| 흙막이 높이 · 단 수 · 구간 · 유입 형태 | **관 `options` 와 `revetx.h` · `extrawall` · `extraspan` · `inletstruct` 두 벌** | 조정창 Map | 관 옵션 + DB `cross_sections.data.design`(`revet_adjust` · `extra_walls` · `extra_spans` · `inlet_structure`) | 폼 · 카드 조정 줄 | 그림은 ss 쪽만 봄(B06 을 거쳐야 반영) · M02 단 수는 DB `extra_walls` | +| 종단 계획선 | `draft:alignment-draft` R | EditState Map(`B05_Profile_UI_Profile_Edit.ts:143`) · 종단도 `store`/`base` | 종단 JSON `profile_alignment` + `design_profiles` · DB grade_summary | ▲▼ · 직선화 · 쉬프트 | 종단도 · 횡단 재계산 · 3D | +| 상단측 | `draft:uphill` P | 종단 Map | 종단 JSON `stations.uphill_side` + design `ditch_side` | 종단 3D | 측구측 | +| 횡단 설계 patch | **`crossdesign` · `rockb` · `cutslope` · `crossw` · `revetx` · `revetlink` · `basinadjust` · `fordadjust` · `boxadjust` · `berm` R — 열 개로 쪼개짐** | 조정창 Map · 상세 캐시 제자리 고침 | DB `cross_sections.data.design` | 카드 조정 줄 · [전체 측점 반영] | 카드 · 3D · B07 결과값 | +| 표준 횡단면 | `draft:std-cross` P · `result:std-cross-default` | — | `longitudinal_sections.data.options.standard_cross_section` | 표준 패널(B06 만 보임) | **B05 계산도 씀**(`B05_Profile_UI_Profile_Preview.ts:50`) · 서버 · B07 | +| 페이지 설정(시작 측점 · 설계속도 · 지형 · 최소고 강제 · 등고선 간격) | `result:profile-enforce-min-cover` 하나뿐 | **DOM · 메모리** | stage 2 params · stage 1 `contour_interval_m` | 종단 패널(B05 만) | 종단도 위반 · 편집 막기 · 서버 replan | +| 횡단 보기 반폭 | `draft:cross-display` R | — | DB `design.display_half_width_m` | 횡단 패널 | 카드 · B05 편집 창 미리보기 | +| 선택 | `draft:structure-pick` P · **`draft:selection`(빈 칸)** | 횡단 `appliedPick` | — | 목록 · 알약 · 카드 | 두 보기 | +| 보기 상태 | `pref:*` localStorage(+ 계정 ui-prefs) | 3D 토글 메모리 | `user_ui_prefs` | 손잡이 · 토글 | 각 패널 | +| 종횡단 상세(서버 결과) | `result:section-detail` R(**고침 안 받는 옛 사본**) | **`Section_Store` 캐시(공유) · 종단 `currentSectionDetail` · 횡단 `sectionDetail`** | DB `cross_sections` | 서버 · 재계산 제자리 고침 | 카드 · 3D · 유토곡선 | +| 사토 | 없음(구조물 목록 안 사토장) | — | 횡단 design `spoil_fill_*` | 저장 때 서버만(`B06_Section_Server_Calc_Prebuild.py:197`) | 카드(저장분 폭) | + +### 1-2 저장 줄기 (지금) + +| 차례 | 꺼내는 자리 | 창구 | 문제 | +|---|---|---|---| +| pipes ① | ss `pipes` | PUT pipe-points | — | +| pipes ② | **배수유역도 메모리** | 같은 PUT | 늦은 메모리가 ①을 덮음(54-16 재현) | +| structures | 종단 섰으면 다리 · 아니면 ss | PUT structures | — | +| alignment | 종단도 메모리 | PUT profile-alignment | 서버 재계산 함 | +| culvertOptions | ss `culvertopt` | **GET pipe-points 뒤 합쳐 PUT** | 관 쓰기 셋째 · 관 옵션을 또 덮음 | +| uphill | 종단 섰으면 메모리 · 아니면 ss | POST confirm | 저장 뒤 안 비움 | +| cross | **횡단 섰으면 ss 조정 키 전부 · 아니면 캐시 메모리만** | POST sections/save | 종단 보기 [저장]은 횡단 초안 · 표준값 빠짐(`B06_Section_Section_Store.ts:259,264`) · `berm` 은 서버 스키마에 칸 없어 버려짐 | + +- 저장 뒤 비우는 키 넷뿐(`pipes` · `structures` · `alignment-draft` · `culvertopt`) · 나머지 횡단 초안 13개 · `uphill` 은 남아 다음 저장에 또 실림 +- [저장] 밖 서버 쓰기: 등고선 [재적용] PUT · [3D 업데이트] · 종단 onHide 코리도 PUT · 반폭 [적용]이 `/regenerate`(DB 행 다시 넣음) · 종단 진입 `structures/migrate` + +### 1-3 보기 넘김 + +| 보기 | 다시 받는 것 | 문제 | +|---|---|---| +| 종단 onShow | 구조물(서버 + ss) | 상세 · uphill 안 다시 읽음 · `applyPipes(lastPipes)` 가 메모리 옛 목록을 폼에 실음 | +| 종단 onHide | — | 코리도 PUT | +| 횡단 onShow | 구조물 · 관(서버 + ss) · 상세 · `reconcileStaleDesigns` | 매번 1.2초 멈춤(54-5 S2) · 관 옵션 초안 다시 얹기는 마운트 때만 | + +### 1-4 한 보기에만 보이는데 두 보기가 쓰는 칸 + +- B06 만 보임: `phase:"detail"` 정의 칸 전부(C군 `form` · `foundation` · `face_role` · `face_slope_ratio` 등) · 표준 횡단면 전부(B05 계산이 씀) · 횡단 조정 줄 전부(3D 가 씀) +- B05 만 보임: 최소고 강제(횡단 종단도 편집 막기가 씀) · 시작 측점(메모리 · 새로고침하면 0) +- 칸은 없는데 계속 읽히는 키: `revet_foundation` · `pipe_kind` · 날개벽 치수 · BOX `wall/slab_thickness_m` · 물넘이 `ford_width/height/slope_pct` · 독립 기슭막이 `tiers` · `face_*` · `joint_spacing_m` + +## ② 목표 모양 + +``` +좌측 패널 칸 ─┐ +종단도 ▲▼ · 알약 끌기 ─┼─▶ 가게.write(칸, 값) ─▶ 세션 키 하나 ─▶ 가게.notify(칸) +카드 조정 줄 ─┘ │ + 종단 보기 · 횡단 보기 · 3D · 좌측 패널 ◀┘ (읽어 그림) +[저장] ─▶ 가게 칸마다 수집 ─▶ 서버 한 줄기 ─▶ 서버 정본 재계산 ─▶ 성공한 칸 비움 · 상세 다시 받음 +``` + +규칙 + +1. 가게 칸 = 자료 하나 · 세션 키 하나 · 칸마다 「저장 창구 · 저장 뒤 비움/남김」을 등록표 한 줄에 적음(`A00_Common/b_page_state.ts` 등록표 확장) +2. 쓰기는 `가게.write` 만 — 패널 · 카드 · 종단도 · 3D 모두. 날 `sessionStorage` · `readByKey` · `createSessionMap` 자리 없앰 +3. 읽기는 가게만 — 보기 지역 변수 · 패널 배열은 가게를 읽는 계산값으로만(들고 있지 않음) +4. 알림 한 길 — `가게.subscribe(칸, 함수)` · 숨은 보기는 「더러움」 표시만 · 보일 때 한 번 그림(54-5 S2 의 매번 1.2초 대신) +5. 보기 넘김 = 그리기만 — 서버 재조회는 가게 칸이 비었을 때(처음 · 저장 뒤)만 +6. 서버 결과(종횡단 상세)는 `Section_Store` 캐시 한 벌 · 두 보기 읽기만 · 세션 사본은 「불러온 원본」 용도로만(고침은 초안 칸이 들고 얹을 때 합침) +7. [저장] = 가게 칸 차례대로 한 번씩 · 보기 갈래 없음 · 관 쓰기 한 번 · 서버가 정본 재계산 · 성공 뒤 그 칸 비우고 상세 다시 받음 +8. 계산 자리는 5장 그대로 — 조작 중 브라우저가 같은 코드로 즉시 · [저장] 은 서버 재계산(브라우저 값 받아 적지 않음) + +가게 칸 (10) + +| # | 칸 | 세션 키(새) | 범위 | 저장 창구 | 저장 뒤 | +|---|---|---|---|---|---| +| 1 | 구조물 | `draft:structures` (그대로) | P | PUT structures | 비움 | +| 2 | 관 지점 시설 | `draft:pipes` (그대로 · `culvertopt` 흡수 · 흙막이 높이 · 단 수 · 구간 · 유입 형태 흡수) | P | PUT pipe-points 한 번 | 비움 | +| 3 | 계획선 | `draft:alignment-draft` (그대로) | R | PUT profile-alignment | 비움 | +| 4 | 상단측 | `draft:uphill` (그대로) | P | POST confirm | **비움(지금 안 비움)** | +| 5 | 횡단 patch | `draft:cross-patch` R — `{측점: {ground_type · section_mode · ditch_* · paved · two_stage_slope · rock_boundary_offset_m · cut_slope_ratio_user · crossw · revet_nudge(x,d,m) · revet_link · basin · ford_wall · box_body}}` | R | POST sections/save | 비움 | +| 6 | 표준 횡단면 | `draft:std-cross` (그대로) | P | sections/save 본문 | 비움(서버 값으로 다시 씨앗) | +| 7 | 페이지 설정 | `draft:profile-settings` (새) — 시작 측점 · 설계속도 · 지형 · 최소고 강제 · 등고선 간격 · 횡단 보기 반폭 | P | 새 PUT 또는 confirm 본문 | 비움 | +| 8 | 선택 | `draft:structure-pick` (그대로) | P | 저장 안 함 | 남김 | +| 9 | 보기 상태 | `pref:*` localStorage (그대로) | 계정 | ui-prefs | — | +| 10 | 종횡단 상세(결과) | `result:section-detail` (그대로 · 읽기 전용 원본) | R | — | 저장 뒤 다시 받음 | + +- 사토는 칸 없음 — 구조물(사토장) + 상세에서 나오는 파생 값 +- 소단(`berm`)은 칸 없음 — 구조물(소단)에서 파생 · 서버도 구조물에서 직접 만듦(지금 서버가 버리는 흠 해소) + +좌측 패널이 종횡단을 함께 제어 + +- 한 벌 폼이 두 보기에서 **같은 칸 묶음**을 보임 — `phase:"detail"` 칸 · 표준 횡단면 · 「횡단 조정」 줄을 B05 에서도 접힌 상자로(공간 문제는 접힘으로) +- 종단 전용(페이지 설정 · 계획노선)도 B06 에서 접힌 상자로 — 최소고 강제가 횡단 쪽 종단도 편집을 막는데 B06 에서 안 보이는 흠 해소 +- 카드 조정 줄 · 종단도 ▲▼ · 알약 끌기는 그대로 두되 가게 칸 5 · 3 · 1 에 씀 → 좌측 패널 칸이 같은 값을 즉시 보임 + +## ③ 칸마다 판정 + +### 3-1 남김 · 합침 + +| 칸 | 판정 | 근거 | +|---|---|---| +| 구조물군 · 종류 · 측점 · 잇기(`summary_item` · `group_items`) | 남김 | 종단 알약 · 벽 · M02(`M02_Table_Fill.py:119-164`) | +| C군 높이 · 설치 측 · 단 수 · 올림 · 이동 · `form` · `foundation` · `face_role` · `face_slope_ratio` | 남김 · **두 보기 다 보임** | 벽 그림 · 터파기 · 3D | +| 관경 · 유입/유출 구조 · 흙막이 형태 · 길이 · 전 · 후 · 집수정 높이 | 남김 | `Engine_Culvert.py` · 카드 · 3D · B07 | +| 흙막이 높이 = 관 `options` + `revetx.h` | **합침 → 관 `options`** | 지금 그림은 `revetx.h` 만 봄 · B05 에서 고친 값이 B06 을 거쳐야 감 | +| 추가 흙막이 단 수 = `soil_add_{n}` 개수 + `extrawall` | **합침 → 관 `options` 의 `soil_add_{n}`** | 서버는 `extrawall` 만 · M02 는 DB `extra_walls` 단 수 | +| 단별 구간 = `soil_add_{n}_length/before/after` + `extraspan` | **합침 → 관 `options`** | 같은 값 두 자리 | +| 유입 형태 = `inlet_structure` + `inletstruct` | **합침 → 관 `options.inlet_structure`** | 옵션 키는 아무도 안 읽고 ss 만 그림에 감 | +| `culvertopt`(구간 · 세월교 · BOX 스펙) | **합침 → 칸 2(관 지점 시설)** | 지금 GET 뒤 다시 PUT · 새로고침 뒤 화면에 안 얹힘 | +| 돌쌓기 위치 조정 `revetx` x · d · m · 집수정 위치 · 세월교 측벽 · BOX 구체 · 잇기 해제 | 남김 → 칸 5(횡단 patch) | 카드에서 낳은 값 = 횡단 patch 주인 | +| `crossdesign` · `rockb` · `cutslope` · `crossw` | **합침 → 칸 5** | 지금 넷이 따로 · 재계산 때만 얹힘 | +| 표준 횡단면 9칸 | 남김 · **두 보기 다 보임** | B05 · B06 · 서버 · B07 | +| 표준 `cross_slope_pct.max` | **재정의** | 계산은 min 만 · B07 도면만 max 를 먼저 씀 → 도면 5% 대 계산 3% | +| 시작 측점 · 설계속도 · 지형 · 최소고 강제 · 등고선 간격 · 횡단 반폭 | 남김 → 칸 7 · [저장] 경유 | 지금 메모리 · result 통 · 즉시 PUT 으로 흩어짐 | +| 소단 길이 · 폭 · 간격 · 기울기 | 남김(구조물 옵션) · `berm` 키 없앰 | 서버가 구조물에서 직접 | +| 사토장 `capacity_m3` | 남김 | `B06_Section_Engine_SpoilFill.py:118` | +| 기타 `name` | 남김 | 목록 이름 | +| 구조물 메모 | 사용자 결정 | 읽는 곳 없음 · 사용자 메모 성격 | + +### 3-2 삭제 · 재정의 후보 (16) + +A. 지금 아무도 안 읽는 화면 칸 + +| # | 칸 | 근거 | +|---|---|---| +| A1 | 그룹 형상 `{gid}__{length,height,before,after}_m` | 주석 「계산 안 함」(`B05_Profile_UI_Structures_Groups.ts:13-14`) · 바인딩 0 | +| A2 | 물넘이 `ford_slope_deg` | 폼 · 병합만 | +| A3 | 콘크리트 포장 `pave_spec` · 포장 `height_m` | 서버는 측점만 읽음 | +| A4 | 토취장 `capacity_m3` · 맹암거 `culvert_height_m` · `culvert_slope_pct` · 측구 `depth_cm` · 비탈면 녹화 7칸 | 읽는 곳 0 | +| A5 | 숨은 solve 전용 — 종단 · 횡단 샘플 간격 · 기준값 4칸 · 경로 계산 설정 전부 · 선택 포인트 칸 | [최적 경로 계산] 숨김 · inert | +| A6 | 「지난 정의 값」 상자(늘 숨김) | 54-1 에서 숨김 · 코드만 남음 | + +B. 옛 B08 수량산출로 넘기던 칸 — 지금 B08 · B09 는 빈 화면 · 읽는 곳 0 + +| # | 칸 | 생기는 곳 → 가던 곳 | +|---|---|---| +| B1 | 쌓기류 상세 — `stone_supply` · `stone_coeff_basis` · `stone_kind` · `back_len_cm` · `fill_concrete_mpa` · `thickness_top_m` · `thickness_bottom_m` · `weep_hole_diameter_mm` · `weep_hole_area_m2` · `blinding_concrete` (C군 · 흙막이 · 큰돌쌓기 · 돌기슭막이 · 골막이 · 바닥막이) | 구조물 정의 `phase=detail` → `structures.json options` → 옛 B08 품셈 열(정의에 「B08 `wants_blinding`」 그대로) | +| B2 | 골막이 `spillway` · `top_length_m` · `bottom_length_m` · 바닥막이 `area_m2` | 같음 | +| B3 | BOX `trench_depth_m` · `haunch_m` · `blinding_thickness_m` · `length_m` | 정의 「토공집계로 감」 · 칸 없음 | +| B4 | 포장 `separation_sheet` · `wire_mesh` | 화면에서 이미 뺌 | +| B5 | 화면에서 뺐는데 M02 바인딩이 읽는 칸 — `pipe_kind` · `wing_wall_type` · `inlet_basin_form` · 포장 `thickness_cm` · `width_m` · `widening_area_m2` · `joint_spacing_m` · 물넘이 `ford_width_m` · `ford_height_m` · `length_m` | **재정의** — 새 칸 이름으로 바인딩 다시 매김(25-3a 와 함께) | + +C. 서버 결과에 남은 옛 B08 칸 + +| # | 칸 | 근거 | +|---|---|---| +| C1 | `wall_fill_overlap` · 벽마다 `fill_overlap_m2` | B08 「두 번 셈」 사유용 · 읽는 곳 0 | +| C2 | `extra_walls` 안 높이 · 형태 · 구간 | M02 는 단 수만 → 단 수 하나로 | +| C3 | 토적 저장 묶음 합계 · `transfers` · 거르지 않은 `haul_plan` | 그림판 `haul_plan_drawing` 만 B07 이 씀 · B07 대신 읽기 먼저 정리 | +| C4 | 채집석 · 구조물 잔토 통로(`collected_stone_*` · `structure_spoil_*`) | `Prebuild.py:72-84` 가 늘 빈 값 | +| C5 | `cut_slope_segments` | 저장도 안 함 · 주석 「읽는 곳 없음」 | + +D. 키 · 코드 + +| # | 대상 | 근거 | +|---|---|---| +| D1 | 죽은 키 — `draft:selection` · `culvertmove` · `pref:section-panel-collapsed/-height` · 배수유역 `COLLAPSED_KEY` · ss `b05:pipes`(아무도 안 비움) · 가게 빈 칸 셋 · `hasDrafts` · `setActive` · `resetRoutePlan` · POST `cross-design`(54-5 H8) · `common_util_structure_lengths.py` · `common_util_storage.py:20` `B08_Quantity/quantities` · `common_util_node_bundle.py:23` B08 감시 | 쓰는 곳 · 부르는 곳 0 | + +- 삭제는 「정의 · 화면에서 숨김」 먼저 → 저장값은 `options` 에 그대로(데이터 안 잃음) → 새 B08 방향(25-3a) 정해진 뒤 걷음 +- 칸은 없는데 그림이 읽는 키(`revet_foundation` · BOX 두께 · 독립 기슭막이 `tiers` · `face_*` · 날개벽 치수 · 물넘이 폭)는 삭제 아님 — 칸을 되살리거나 고정 기본값으로 정하는 사용자 결정 몫(⑥) + +## ④ 옮김 (데이터 잃지 않음) + +브라우저 세션 키 + +| 옛 키 | 새 자리 | 방법 | +|---|---|---| +| `culvertopt` R | 칸 2 `draft:pipes` 의 그 시설 `options` | 등록표 `legacy` 함수 — 처음 읽을 때 합치고 옛 키 지움 | +| `revetx.h` · `extrawall` · `extraspan` · `inletstruct` R | 칸 2 관 `options`(`*_revet_height_m` · `soil_add_{n}_*` · `inlet_structure`) | 같음 | +| `revetx` x · d · m · `revetlink` · `basinadjust` · `fordadjust` · `boxadjust` · `crossdesign` · `rockb` · `cutslope` · `crossw` R | 칸 5 `draft:cross-patch` | 같음 · 키 열 개 → 하나 | +| `berm` R | 없앰(구조물에서 파생) | 읽고 버림 | +| `draft:cross-display` · `result:profile-enforce-min-cover` | 칸 7 `draft:profile-settings` | 같음 | +| 되돌리기 스냅샷 접두어(`B05_Profile_UI_Profile_History.ts:16`) | 새 키 이름 | 같이 고침 | + +- 선행: 날 `sessionStorage` · `readByKey` · `createSessionMap`(`B06_Section_UI_Page_Link_Session.ts:31-55`) · `Api_Culvert_Options.ts` · `Ford_Controls.ts` · `Persist.ts` rock/cutslope 자리를 `readState`/`writeState` 로 먼저 바꿔야 `legacy` 가 돎(지금 `migrate()` 는 `readState` 때만) + +서버 파일 · DB + +| 옛 자리 | 새 자리 | 방법 | +|---|---|---| +| DB `cross_sections.data.design` 의 `revet_adjust.h` · `extra_walls` 단 수 · `extra_spans` · `inlet_structure` | `pipe_points.json` 그 시설 `options` | **읽을 때 옮김** — 관 `options` 에 없으면 상세에서 채움(`common_util_drainage_pipes.py` `_migrate_protection:305` 꼴) · DB 칸은 한 주기 남겨 둠 | +| `pipe_points.json` `culvertopt` 로 덮이던 옵션 | 그대로(같은 파일) | 이관 없음 | +| 페이지 설정(stage 2 params · stage 1 `contour_interval_m`) | 그대로 읽고 [저장] 때만 씀 | 이관 없음 | +| 삭제 후보 B1~B4 옵션 값 | `options` 에 그대로 | 정의에서 숨기기만 · `_DROPPED_KEYS`(`B05_Profile_Structures_Repository.py:42,90`)에 넣는 것은 새 B08 정한 뒤 | +| 결과 칸 C1~C5 | 새로 저장할 때 안 씀 | 옛 행은 그대로 · 읽는 쪽 없음 확인 뒤 | + +- `pipe_points.json` 에 판번호가 없음 → 옮김 시작 때 `schema_version` 칸 하나 더함(옛 파일 = 1 로 읽음) + +## ⑤ 단계 차례 (8) + +| 단계 | 할 일 | 끝난 뒤 화면 | 크기 | 위험 | 흡수 | 54-22 겹침 | +|---|---|---|---|---|---|---| +| 0 | 등록표 한 곳 — 칸마다 「키 · 범위 · 저장 창구 · 저장 뒤 비움」 한 줄 · 날 ss 자리를 `readState`/`writeState` 로 · 죽은 키(D1) 걷음 | 같음(동작 그대로) | 중간 | 낮음 — 키 이름 그대로 | 54-16 D6 | 없음 | +| 1 | 저장 줄기 한 줄 — 관 PUT 한 번(배수유역도 메모리 PUT 뺌) · `culvertopt` 를 관 초안에 합쳐 같은 PUT · 저장 뒤 비우기를 등록표대로(`uphill` · 횡단 초안 포함) · 조작 중 `detail-basins` 서버 왕복을 저장 때로 | 관경 바로 저장 옛 값 사라짐 | 작음~중간 | 중간 — 관 시설 되붙이기 응답 처리 | 54-16 갈래 1 · 7 일부 · 54-5 S4 | 없음 | +| 2 | 횡단 patch 한 칸 `draft:cross-patch` · 상세를 불러올 때 한 번 얹음 · [저장]은 보기와 무관하게 칸 5 · 6 을 보냄 · `berm` 은 서버가 구조물에서 · `rock_boundary_offset_m` 을 `USER_TOUCHED_KEYS` 에 · `result:section-detail` 사본은 원본 전용 | 새로고침 · B05 [저장] 뒤에도 L형 등 그대로 | 중간 | 중간 — 키 열 개 옮김 | 54-16 갈래 2 · 3 · 4 | 없음 | +| 3 | 상세 한 벌 — 두 보기는 `Section_Store` 캐시만 읽음 · 종단 `currentSectionDetail` · 횡단 `sectionDetail` 걷음 · 구조물 · 관 바꿈 → 벽 · 면적 다시 얹기 공용 한 길 · 횡단 onShow 서버 재조회 · 전 측점 재계산은 더러울 때만 | 두 보기 누가토량 같음 · 보기 넘김 멈춤 사라짐 | 중간 | 중간 — 카드 · 3D 갱신 시점 | 54-16 갈래 5 · 54-5 S2 | **있음** — `design_profile.ts` · `B06_Section_UI_Section_View.ts` · `B06_Section_UI_Section_View_Profile.ts`(S1 디바운스 · 두 번 그리기) → 54-22 끝난 뒤 | +| 4 | 가게 실체화 — 칸마다 `write` · `subscribe` · 패널 배열 · 보기 지역 변수를 가게 읽기로 · 알약 끌기 · ▲▼ · 카드 단추도 `write` · 좌측 목록 · 폼은 바뀐 칸만 다시 그림 | 어느 보기에서 고쳐도 다른 보기 · 3D 즉시 | 큼 | 높음 — 흩어진 입구 전부 | 54-16 갈래 6 · 8 · 54-5 S6 | **있음** — `design_profile.ts`(▲▼ 입구) | +| 5 | 두 벌 칸 합침 — 흙막이 높이 · 단 수 · 구간 · 유입 형태를 관 `options` 로 · 카드 조정 줄은 같은 값을 읽고 씀 · 서버 `Engine_Culvert.py` 가 관 `options` 에서 · 읽을 때 옮김 | B05 에서 흙막이 바꿔도 카드 · 3D 바로 | 중간~큼 | 중간 — 서버 · 카드 · M02 단 수 | 54-16 갈래 7 | 없음 | +| 6 | 좌측 패널 한 벌 — `phase:"detail"` 칸 · 표준 횡단면 · 「횡단 조정」을 B05 에도(접힌 상자) · 페이지 설정 · 최소고 강제를 B06 에도 · 페이지 설정 칸 7 · 등고선 [재적용] · [3D 업데이트] · 반폭 [적용]을 [저장] 경유로 · 종단 onHide 코리도 PUT 없앰 | 두 보기 같은 패널 · [저장] 밖 쓰기 0 | 중간 | 중간 — 패널 높이 · 접힘 | 54-5 H9 | 없음 | +| 7 | 삭제 · 재정의 — A1~A6 · B1~B4 정의에서 숨김 · B5 바인딩 다시 매김 · C1~C5 새로 안 씀 · 표준 `cross_slope_pct.max` 정리 | 화면 칸 줄어듦 · M02 집계 그대로 | 중간 | 낮음(값 보존) · 바인딩은 25-3a 결정 필요 | — | **있음** — `B05_Profile_Structures_Schema.py`(H1) · `M02_Item_Snapshot.py`(H1) → 54-22 끝난 뒤 | + +- 단계마다 끝에 고친 대상 시험 + 54-16 재현 표(관경 바로 저장 · L형 새로고침 · B05 [저장] · 누가토량 두 값) 다시 잼 +- 0 → 1 → 2 는 서로 독립 · 바로 갈 수 있음 · 3 · 4 · 7 은 54-22 뒤 + +## ⑥ 사용자가 정할 것 + +1. 옛 B08 칸(B1~B4) — 지움 / 새 B08 면적산출 시트 입력으로 옮김 / 숨겨 둠 +2. 숨은 경로 계산 설정 · 샘플 간격 · 기준값 4칸 · 선택 포인트(A5) — 지움 / 남김 +3. 좌측 패널에서 B05 에도 「상세 칸 · 표준 횡단면 · 횡단 조정」, B06 에도 「페이지 설정」을 접힌 상자로 보이게 — 좋음 / 일부만 +4. 칸은 없는데 그림이 읽는 값(기슭막이 기초 · BOX 두께 · 날개벽 치수 · 물넘이 폭 · 독립 기슭막이 단 · 기울기) — 칸 되살림 / 고정 기본값 +5. BOX · 세월교 유입/유출 「흙막이」(골라도 아무것도 안 섬) — 그림 추가 / 선택지 뺌 +6. 등고선 [재적용] · [3D 업데이트] · 반폭 [적용] — [저장] 경유로 바꿔도 됨 / 지금처럼 즉시 +7. 사토 반영 — 저장 뒤만(지금) / 조작 중 즉시(브라우저 계산 추가) +8. 구조물 메모 — 남김 / 지움