From 9afa4e303ffc0642bfbd77cfb90a54af6a6d34b3 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 19 Oct 2026 08:46:56 +0900 Subject: [PATCH] =?UTF-8?q?refactor(472-2=202-C=20=EA=B3=B5=EC=9A=A9=20?= =?UTF-8?q?=EA=B1=B7=EC=96=B4=EB=82=B4=EA=B8=B0):=20=EB=B6=80=EB=A6=84=200?= =?UTF-8?q?=20=EC=9D=B8=20DESIGN=5FVIEW=5FROUTES=20=C2=B7=20ALIGNMENT=5FDR?= =?UTF-8?q?AFT=5FKEY=5FPREFIX=20=C2=B7=20structureStatus=20=C2=B7=20bermSp?= =?UTF-8?q?ec=20=C2=B7=20MASS=5FHAUL=5FHEIGHT=20=C2=B7=20createMassHaulSum?= =?UTF-8?q?mary=20=C2=B7=20=EC=84=B8=EC=85=98=20=EC=97=B4=EC=87=A0=20culve?= =?UTF-8?q?rtmove=20=EC=A7=80=EC=9B=80=20=C2=B7=20std-cross=20=EB=82=A1?= =?UTF-8?q?=EC=9D=80=20=EC=A3=BC=EC=84=9D(context=20=EA=B0=80=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=EB=B6=84=20=EB=82=B4=EB=A6=BC)=20=C2=B7=20=EA=B3=B5?= =?UTF-8?q?=EC=9A=A9=20=EB=A8=B8=EB=A6=AC=20=EC=8B=9C=ED=97=98=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20tmp/tests=20=E2=86=92=20resources/tester=20=C2=B7?= =?UTF-8?q?=20=EC=9C=84=ED=82=A4=20=EC=84=B8=EC=85=98=20=EC=97=B4=EC=87=A0?= =?UTF-8?q?=20=ED=91=9C=20=ED=95=9C=20=EC=A4=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- A00_Common/b_page_state.ts | 12 +-- A00_Common/design/design_page.ts | 7 +- A00_Common/design/design_store.ts | 5 +- A00_Common/design/design_structure_status.ts | 13 +--- .../logic/B05_Profile_UI_RouteEdit_Curve.ts | 4 +- common_util/common_util_cross_berm.ts | 9 --- common_util/common_util_cross_design.ts | 2 +- common_util/common_util_cross_design_areas.ts | 2 +- common_util/common_util_culvert_sets.ts | 2 +- common_util/common_util_excavation.py | 2 +- common_util/common_util_excavation.ts | 2 +- common_util/common_util_mass_haul_legend.ts | 78 +------------------ common_util/common_util_mass_haul_view.ts | 4 +- .../wiki/concepts/design_page/session_keys.md | 1 - 14 files changed, 17 insertions(+), 126 deletions(-) diff --git a/A00_Common/b_page_state.ts b/A00_Common/b_page_state.ts index d315b7d3e..f3df0b73c 100644 --- a/A00_Common/b_page_state.ts +++ b/A00_Common/b_page_state.ts @@ -152,8 +152,6 @@ export const STATE_REGISTRY = { kindreset: { bucket: "draft", scope: "project" }, /** 배수관·암거 조정창에서 예약한 옵션 값. */ culvertopt: { bucket: "draft", scope: "route", legacy: (p, r) => `b06:culvertopt:${p}:${r}` }, - /** 배수관 이동(측점 옮김) 예약. */ - culvertmove: { bucket: "draft", scope: "route", legacy: (p, r) => `b06:culvertmove:${p}:${r}` }, /** 암 경계선 오프셋(측점별). */ rockb: { bucket: "draft", scope: "route", legacy: (p, r) => `b06:rockb:${p}:${r}` }, /** 측점별 암 절토 경사비(1:n 의 n) — 카드에서 넣은 사용자 값(2026-09-07). @@ -166,12 +164,10 @@ export const STATE_REGISTRY = { berm: { bucket: "draft", scope: "route" }, /** 표준 횡단면 설정 패널의 편집값. * - * ⚠ **[저장]·[확정] 뒤에도 지우지 않는다**(2026-09-07 확인). 다른 초안과 달리 이 값은 - * 브라우저가 가진 **유일한** 사용자 표준단면이다 — `sections/context` 가 주는 - * `standard_cross_section` 은 저장분이 아니라 **config 기본값**이고(`B06_Section_Router.py:132`), - * 저장분(`stored_standard_cross_section`)은 서버 안에서만 쓰인다. 그래서 비우면 브라우저 - * 횡단 계산이 그 순간 config 기본값으로 되돌아간다. [초기화]에서만 버린다 - * (`clearStandardCrossSession`). */ + * 칸이 비었으면 `sections/context` 의 저장분(`stored_standard_cross_section`)으로 채운다 + * (`B06_Section_Api_Fetch` seedStandardCross) — 같은 응답의 `standard_cross_section` 은 + * config 기본값. 고침으로 안 본다 — [폐기]에도 안 지움(`design_leave` NOT_EDITS). + * [초기화] · 추천 노선 [적용]에서 버린다. */ "std-cross": { bucket: "draft", scope: "project", legacy: (p) => `b06:std-cross:${p}` }, /** 표시 반폭 — 사용자가 고른 값이라 초안이되, 바꾸면 횡단 재생성(③)을 함께 부른다. */ "cross-display": { diff --git a/A00_Common/design/design_page.ts b/A00_Common/design/design_page.ts index ca861aca7..1d54d57e2 100644 --- a/A00_Common/design/design_page.ts +++ b/A00_Common/design/design_page.ts @@ -45,12 +45,7 @@ import "./design_page.css"; export type { DesignPageShared } from "./design_shared"; -/** 보기 ↔ 주소. */ -export const DESIGN_VIEW_ROUTES: Record = { - profile: ROUTES.B05_PROFILE, - cross: ROUTES.B06_SECTION, -}; - +/** 주소 → 보기. */ export function designViewOf(route: RoutePath): DesignView | null { if (route === ROUTES.B05_PROFILE) return "profile"; if (route === ROUTES.B06_SECTION) return "cross"; diff --git a/A00_Common/design/design_store.ts b/A00_Common/design/design_store.ts index 706312767..210e9ae2d 100644 --- a/A00_Common/design/design_store.ts +++ b/A00_Common/design/design_store.ts @@ -11,7 +11,7 @@ * (다만 그 자리는 듣는 쪽을 못 부른다 — 쓰는 길은 가게로 옮길 것). * * `alignmentDraft` 는 등록부 `alignment-draft`(노선 칸)다 — 옛 키(`b05-profile-alignment-draft:{노선}`) - * 값은 처음 읽을 때 옮겨 받는다. B05 되돌리기(`_Profile_History`)도 이 칸을 사진 찍는다(24-2c). + * 값은 안 받는다(387-1). B05 되돌리기(`_Profile_History`)도 이 칸을 사진 찍는다(24-2c). * 부르는 쪽이 프로젝트를 모르면(`null`) 지금 연 프로젝트 칸을 쓴다. * * 계산 묶음 칸(344-4 · 모양 = `design_pipeline_types.ts`) — `routeDraft` 는 초안(세션 즉시) · @@ -73,9 +73,6 @@ export interface DesignStore { ): () => void; } -/** 옛 계획고 초안 키 — 위 머리 주석 참조(남은 옛 값을 쓸어 낼 때만 쓴다). */ -export const ALIGNMENT_DRAFT_KEY_PREFIX = "b05-profile-alignment-draft"; - /** 이 탭 페이지가 연 프로젝트(388-3) — 다른 탭이 현재 프로젝트를 바꿔도 이 탭 초안이 안 섞임. */ let openedProjectId: string | null = null; export function pinDraftProject(projectId: string | null): void { diff --git a/A00_Common/design/design_structure_status.ts b/A00_Common/design/design_structure_status.ts index a656bc223..67b16f8a7 100644 --- a/A00_Common/design/design_structure_status.ts +++ b/A00_Common/design/design_structure_status.ts @@ -1,8 +1,7 @@ /* ============================================================================= * A00_Common/design/design_structure_status.ts - * 구조물 현황 한 벌(322-3) — 저장분 둘(관 `pipe_points.json` · 구조물 `structures.json`) + 초안 둘(세션) - * → 한 목록(초안이 있으면 초안 · 없으면 저장분 · 종류마다 따로) · 측점 계획 한 벌(`planStations`) → - * 종단 측점 목록(B05 종단 · 3D 막대 · B06 종단 띠가 같은 꼴). + * 구조물 현황 한 벌(322-3) — 측점 계획 한 벌(`planStations`) → 종단 측점 목록(B05 종단 · 3D 막대 · + * B06 종단 띠가 같은 꼴) · 관 · 구조물 · 추가 측점 초안 바뀜 신호. * * 구조물 id = 구조물은 structure_id · 관은 세션 id(`design_pipe_ids` · 323-5 · 파일 모양 그대로 · 저장 안 함). * ========================================================================== */ @@ -11,14 +10,6 @@ import type { IrregularStation } from "../../B05_Profile/B05_Profile_UI_Irregula import type { PlannedStation } from "../../common_util/common_util_structure_station"; import { useDesignStore, type DesignStoreValues } from "./design_store"; -/** 현황 — 종류마다 초안이 앞섬(초안 null = 만진 적 없음 · 빈 목록 = 다 지움). */ -export function structureStatus( - saved: readonly [ReadonlyArray

, ReadonlyArray], - drafts: readonly [ReadonlyArray

| null, ReadonlyArray | null], -): { pipes: P[]; structures: S[] } { - return { pipes: [...(drafts[0] ?? saved[0])], structures: [...(drafts[1] ?? saved[1])] }; -} - /** * 측점 계획 → 종단 측점(측점번호 · 잔여거리 = 간격 기준) — 기준 측점 id = 첫 주인 id(관 = `pipe-…` · * 구조물 = structure_id) · 시작 · 끝 = `{id}:{역할}`(옮겨도 계획고 편집이 따라감 · 272) · 관 기준 측점 = diff --git a/B05_Profile/logic/B05_Profile_UI_RouteEdit_Curve.ts b/B05_Profile/logic/B05_Profile_UI_RouteEdit_Curve.ts index 4ca9fc86e..20fe1dcae 100644 --- a/B05_Profile/logic/B05_Profile_UI_RouteEdit_Curve.ts +++ b/B05_Profile/logic/B05_Profile_UI_RouteEdit_Curve.ts @@ -7,12 +7,12 @@ * * ① **손잡이 → 교각점·반지름**(`dragHandleTo`) — 서버 셈의 **반대 방향**이다. 서버는 * 교각점·R 에서 접선점을 내고, 여기서는 끈 접선점에서 교각점·R 을 낸다. - * 왕복이 제자리인지는 `tmp/tests/test_route_polyline_handle_drag.py` 가 지킨다. + * 왕복이 제자리인지는 `resources/tester/test_route_polyline_handle_drag.py` 가 지킨다. * * ② **노드 → 폴리라인**(`buildEditedPolyline`) — ⚠⚠ **짝**: * `common_util/common_util_route_polyline.py` 의 `build_planned_polyline` 중 * **편집 갈래**(`simplify=False` + `curve_flags`/`radii`)와 같은 값을 내야 한다. - * 거울 시험: `tmp/tests/test_route_polyline_browser_mirror.py`. + * 거울 시험: `resources/tester/test_route_polyline_browser_mirror.py`. * * 왜 브라우저에도 두나(2026-09-07 사용자 지적 ①②) — 곡선을 서버만 그리면 노드를 잡는 * 순간 그려 둔 선을 통째로 버려야 해서 **곡선이 전부 사라진 것처럼 보인다**. 값은 남아 diff --git a/common_util/common_util_cross_berm.ts b/common_util/common_util_cross_berm.ts index eb0ec8f14..36f916acc 100644 --- a/common_util/common_util_cross_berm.ts +++ b/common_util/common_util_cross_berm.ts @@ -51,15 +51,6 @@ export function sideBerm(berm: BermSpec | null, side: string): BermSpec | null { return own === undefined || own === null ? berm : { ...berm, depthM: Math.max(own, 0) }; } -export function bermSpec( - widthM = BERM_DEFAULT_WIDTH_M, - intervalM = BERM_DEFAULT_INTERVAL_M, - slopeDeg = BERM_DEFAULT_SLOPE_DEG, - depthM = BERM_DEFAULT_DEPTH_M, -): BermSpec { - return { widthM, intervalM, slopeDeg, depthM }; -} - /** * 짝: `cut_profile_points`. 절토 사면 꼭짓점 `[[거리, 표고], ...]` — 시작에서 바깥으로. * diff --git a/common_util/common_util_cross_design.ts b/common_util/common_util_cross_design.ts index 2020408af..f05e1f8ba 100644 --- a/common_util/common_util_cross_design.ts +++ b/common_util/common_util_cross_design.ts @@ -6,7 +6,7 @@ * 짝: `B06_Section/B06_Section_Engine_Design.py` (`compute_cross_design`) * 면적 적분은 `common_util_cross_design_areas.ts` ↔ `B06_Section_Engine_Areas.py`. * 회귀 테스트가 두 구현을 같은 입력으로 실제 비교한다: - * `tmp/tests/test_b06_cross_design_mirror.py` — 어느 쪽을 고치든 반드시 같이 돌릴 것. + * `resources/tester/test_b06_cross_design_mirror.py` — 어느 쪽을 고치든 반드시 같이 돌릴 것. * * ── 왜 같은 계산이 두 벌인가 (2026-09-03 사용자 확정) ──────────────── * 사용자가 계획선을 만지는 동안의 계산은 **브라우저 안에서 끝나야 한다**. 조작은 세션 diff --git a/common_util/common_util_cross_design_areas.ts b/common_util/common_util_cross_design_areas.ts index dfb411847..09088288b 100644 --- a/common_util/common_util_cross_design_areas.ts +++ b/common_util/common_util_cross_design_areas.ts @@ -5,7 +5,7 @@ * ⚠⚠ 파이썬 짝 파일과 **한 벌**이다 — 한쪽만 고치면 두 화면 값이 갈린다 ⚠⚠ * 짝: `B06_Section/B06_Section_Engine_Areas.py` * 같은 입력에 같은 값을 내야 한다. 회귀 테스트가 두 구현을 실제로 비교한다: - * `tmp/tests/test_b06_cross_design_mirror.py` — 고칠 때 반드시 같이 돌릴 것. + * `resources/tester/test_b06_cross_design_mirror.py` — 고칠 때 반드시 같이 돌릴 것. * 왜 두 벌인가: 사용자 조작 중 계산은 브라우저 안에서 끝나야 하고(2026-09-03 사용자 * 확정), 저장·확정·도면 산출은 서버가 정본으로 다시 계산하기 때문이다. * diff --git a/common_util/common_util_culvert_sets.ts b/common_util/common_util_culvert_sets.ts index 62cd85168..65b792b79 100644 --- a/common_util/common_util_culvert_sets.ts +++ b/common_util/common_util_culvert_sets.ts @@ -3,7 +3,7 @@ * 배수관 세트(배관·기슭막이·보호공·세월교·BOX암거·물넘이포장) 제원 — **브라우저 몫**. * * ⚠ 파이썬 `B06_Section/B06_Section_Engine_Culvert.py` 와 **한 벌**이다(2026-09-06). - * 한쪽만 고치면 화면과 저장본이 갈린다. 거울 테스트: `tmp/tests/test_b06_culvert_sets_mirror.py` + * 한쪽만 고치면 화면과 저장본이 갈린다. 거울 테스트: `resources/tester/test_b06_culvert_sets_mirror.py` * * 왜 짝으로 두나(CLAUDE.md 5장 「계산 자리」) — 이 계산은 종횡단 **상세를 읽을 때마다** * 서버에서 돈다. 매 요청 도는 자리라 Node 왕복(코리도·구조물 면적 방식)이 비싸다. diff --git a/common_util/common_util_excavation.py b/common_util/common_util_excavation.py index 78f4cbf39..61cfffe2c 100644 --- a/common_util/common_util_excavation.py +++ b/common_util/common_util_excavation.py @@ -1,7 +1,7 @@ """터파기 단면 — 관·벽 두 갈래. **근거의 급이 다르므로 갈라 둔다.** ⚠⚠ TS 짝 파일과 **한 벌**이다 — `common_util/common_util_excavation.ts`. - 거울 시험: `tmp/tests/test_excavation_mirror.py` (고칠 때 같이 돌릴 것). + 거울 시험: `resources/tester/test_excavation_mirror.py` (고칠 때 같이 돌릴 것). 화면(B06 횡단도)이 그리고 서버(B08 수량)가 세는 값이라 두 쪽에 같은 수가 있어야 한다. ① 관 — **법정 시방서에 표가 있다** diff --git a/common_util/common_util_excavation.ts b/common_util/common_util_excavation.ts index 5452b7b52..bdd181175 100644 --- a/common_util/common_util_excavation.ts +++ b/common_util/common_util_excavation.ts @@ -3,7 +3,7 @@ * 터파기 단면 — 관·벽 두 갈래. **근거의 급이 다르므로 갈라 둔다.** * * ⚠⚠ 파이썬 짝과 **한 벌**이다 — `common_util/common_util_excavation.py`. - * 거울 시험: `tmp/tests/test_excavation_mirror.py`. 어느 쪽을 고치든 같이 돌릴 것. + * 거울 시험: `resources/tester/test_excavation_mirror.py`. 어느 쪽을 고치든 같이 돌릴 것. * 화면(B06 횡단도)이 그리고 서버(B08 수량)가 세는 값이라 두 쪽 수가 같아야 한다. * * ① 관 — 법정 시방서에 표가 있다: `KCS 44 40 10 배수관(23.01) §3.2(4) 그림 3.2-1`. diff --git a/common_util/common_util_mass_haul_legend.ts b/common_util/common_util_mass_haul_legend.ts index d9359b0dc..224db92e8 100644 --- a/common_util/common_util_mass_haul_legend.ts +++ b/common_util/common_util_mass_haul_legend.ts @@ -1,14 +1,11 @@ /* ============================================================================= * common_util_mass_haul_legend.ts - * 유토곡선 곡선 이름 · 범례 줄 · 총괄 요약 줄(`common_util_mass_haul_view` 에서 나눔). + * 유토곡선 곡선 이름 · 범례 줄(`common_util_mass_haul_view` 에서 나눔). * ========================================================================== */ import type { MassHaulBasis, MassHaulSeries } from "./common_util_mass_haul"; -import type { HaulPlan } from "./common_util_mass_haul_balance"; import type { LocaleKey } from "@ui/ui_template_locale"; import { MASS_HAUL_BALANCE_KEY } from "./common_util_mass_haul"; -import { haulPlanChips } from "./common_util_mass_haul_balance_view"; -import { formatVolume } from "./common_util_mass_haul_callout"; import { L } from "./common_util_svg"; const BASIS_LABEL: Record = { @@ -81,76 +78,3 @@ export function createMassHaulLegend( } return legend; } - -/** - * 곡선 아래 총괄 요약 줄. 절토는 자연상태(내역 기준)와 환산 후(곡선 기준)를 함께 적는다. - * 곡선이 여러 개라 수치가 어느 곡선의 것인지 끝에 반드시 밝힌다. - */ -export function createMassHaulSummary( - series: MassHaulSeries, - haulPlan: HaulPlan | null, -): HTMLElement { - const result = series.result; - const row = document.createElement("div"); - row.className = "b06-masshaul__summary"; - const cut = result.cut_natural_m3; - const cutTotal = cut.soil + cut.ripping_rock + cut.blasting_rock; - /* 요약 줄이 12칩까지 늘어 한눈에 안 읽혔다(2026-08-19 사용자 지적). 판단에 쓰는 - * 값만 칩으로 남기고, 세부 내역은 그 칩의 툴팁으로 내린다. - * 절토(자연) — 토질 3종 내역은 툴팁 - * 성토(다짐) — 절토 다짐 환산은 툴팁(토량환산계수 f 적용 결과) - * 잉여 또는 부족 — 둘은 동시에 성립하지 않는다 - * 운반·검산 — 토량 분배를 켰을 때만(haulPlanChips) - * B05 종단 패널과 B06 횡단 화면이 같은 함수를 쓰므로 양쪽이 함께 바뀐다. */ - const chips: Array<[string, string, string?]> = [ - [ - L("B06_MassHaul_CutNatural"), - `${formatVolume(cutTotal)}㎥`, - [ - `${L("B06_Design_Ground_Soil")} ${formatVolume(cut.soil)}㎥`, - `${L("B06_Design_Ground_Ripping")} ${formatVolume(cut.ripping_rock)}㎥`, - `${L("B06_Design_Ground_Blasting")} ${formatVolume(cut.blasting_rock)}㎥`, - ].join(" · "), - ], - [ - L("B06_MassHaul_Fill"), - `${formatVolume(result.fill_compacted_m3)}㎥`, - `${L("B06_MassHaul_CutCompacted")} ${formatVolume(result.cut_compacted_m3)}㎥`, - ], - ]; - // 잉여와 부족은 동시에 성립하지 않으므로 해당하는 쪽만 보여 준다. - chips.push( - result.shortage_m3 > 0 - ? [L("B06_MassHaul_Shortage"), `${formatVolume(result.shortage_m3)}㎥`] - : [L("B06_MassHaul_Surplus"), `${formatVolume(result.surplus_m3)}㎥`], - ); - // 절·성토 균형 지표 — 판정·조정은 사용자 몫이고 프로그램은 값만 드러낸다(2026-09-03 - // 사용자 확정). 곡선이 0선을 넘지 않으면 평형선·운반 블록이 아예 생기지 않으므로, - // 벌룬이 없을 때 왜 없는지를 이 값 하나로 읽을 수 있어야 한다. - const finalCumulative = result.points.length - ? result.points[result.points.length - 1].cumulative_volume_m3 - : 0; - chips.push([ - L("B06_MassHaul_FinalCumulative"), - `${formatVolume(finalCumulative)}㎥`, - L("B06_MassHaul_FinalCumulative_Tip"), - ]); - // 토량 분배를 켜 두면 운반 총량·검산이 뒤에 붙는다(사토·토취는 발생 지점 기준 합계). - chips.push(...haulPlanChips(haulPlan)); - for (const [label, value, tip] of chips) { - const chip = document.createElement("span"); - chip.className = "b06-masshaul__chip"; - if (tip) chip.title = tip; - const name = document.createElement("em"); - name.textContent = label; - const amount = document.createElement("strong"); - amount.textContent = value; - chip.append(name, amount); - row.append(chip); - } - const basis = document.createElement("span"); - basis.className = seriesClass(series, "b06-masshaul__basis"); - basis.textContent = massHaulSeriesLabel(series); - row.append(basis); - return row; -} diff --git a/common_util/common_util_mass_haul_view.ts b/common_util/common_util_mass_haul_view.ts index b36b7003b..d4d2eab10 100644 --- a/common_util/common_util_mass_haul_view.ts +++ b/common_util/common_util_mass_haul_view.ts @@ -14,7 +14,7 @@ * (1공구 V=1:10,000 / 3공구 V=1:50,000) 고정 축척을 쓰면 안 된다. * 근거: docs/raw/2026-08-02_유토곡선_3공구_분석.md 3.2절 * - * 값 표기 · 말풍선 = `common_util_mass_haul_callout` · 곡선 이름 · 범례 · 요약 = `common_util_mass_haul_legend`. + * 값 표기 · 말풍선 = `common_util_mass_haul_callout` · 곡선 이름 · 범례 = `common_util_mass_haul_legend`. * ========================================================================== */ import type { MassHaulPoint, MassHaulSeries } from "./common_util_mass_haul"; @@ -113,8 +113,6 @@ const WINDOW_EASE = 0.2; /** 축 눈금이 읽히는 최소 높이. 이보다 낮아지면 그래프가 뭉개진다. */ export const MASS_HAUL_MIN_HEIGHT = 90; -/** 패널을 건드리지 않았을 때의 유토곡선 높이. */ -export const MASS_HAUL_HEIGHT = 190; /** * 유토곡선 전용 상하 여백. 좌우는 종단면도와 **반드시 같아야**(LONG_PAD) X축이 맞으므로 diff --git a/docs/wiki/concepts/design_page/session_keys.md b/docs/wiki/concepts/design_page/session_keys.md index 6bd79529c..e003563ef 100644 --- a/docs/wiki/concepts/design_page/session_keys.md +++ b/docs/wiki/concepts/design_page/session_keys.md @@ -30,7 +30,6 @@ source: ["docs/raw/조사/2026-10-19_470_B05B06_데이터흐름.md", "A00_Common | `berm` | `:166` | 시설 줄 `syncBerm` 만(구조물 파생) | 안 감 — 서버가 `structures.json` 에서 | | `cross-display` | `:177` | 전역 표시 반폭 | 안 감 | | `selection` · `structure-pick` · `pipe-ids` · `pipe-option-queue` · `structure-type-cache` | `:148` · `:138` · `:144` · `:146` · `:150` | 고름 · 관 id 장부 · 옵션 넘김 · 종류 캐시 | 안 감 · `structure-type-cache` 는 저장 뒤 비움 | -| `culvertmove` | `:156` | 부르는 곳 없음 | 안 감 | ## result