From 54954a05e5647fcec15ac22fac2144ece95c9433 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sat, 8 Aug 2026 10:03:11 +0900 Subject: [PATCH] =?UTF-8?q?refactor(B05,B06):=20B05=5Fwf2=5FRoute=20->=20B?= =?UTF-8?q?05=5FProfile,=20B06=5Fwf3=5FProfileCross=20->=20B06=5FSection?= =?UTF-8?q?=20=EB=8F=99=EC=8B=9C=20=EA=B0=9C=EB=AA=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 한몸으로 동작하는 두 페이지라 한 커밋으로 처리 (상호 참조 다수) - B05 37파일 + B06 20파일 접두사 개명 (git mv, 이력 보존) - 참조 치환 91파일: import 경로, 라우트 슬러그(b05-profile/b06-section), 라우트 키(B05_PROFILE/B06_SECTION), B03 자동 체인, storage 상수, pyproject 제외 경로 - 로직 변경 없음. typecheck·백엔드 import 검증 통과 Co-Authored-By: Claude Fable 5 --- .tmp_pdf_page2.png | Bin 0 -> 11868 bytes A00_Common/b_workflow_nav.ts | 4 +- A00_Common/main.ts | 4 +- A00_Common/router.ts | 12 +++--- B03_FileInput/B03_FileInput_Service_Chain.py | 20 ++++----- B03_FileInput/B03_FileInput_UI_Page.ts | 2 +- .../B04_PreProcess_Router_Inflow.py | 2 +- .../B04_PreProcess_Router_Watershed.py | 2 +- B04_PreProcess/B04_PreProcess_UI_Page.ts | 6 +-- .../B05_Profile_Api_Fetch.ts | 4 +- .../B05_Profile_Debug.py | 0 .../B05_Profile_Engine.py | 8 ++-- .../B05_Profile_Engine_Geometry.py | 0 .../B05_Profile_Engine_Grade.py | 2 +- .../B05_Profile_Engine_Grade_Alignment.py | 4 +- .../B05_Profile_Engine_Grade_Profile.py | 12 +++--- .../B05_Profile_Engine_Grade_Solver.py | 2 +- .../B05_Profile_Engine_RidgeValley.py | 6 +-- .../B05_Profile_Engine_Sections.py | 8 ++-- .../B05_Profile_Engine_Sections_Core.py | 0 .../B05_Profile_Engine_Skeleton.py | 4 +- .../B05_Profile_Engine_Solver.py | 4 +- .../B05_Profile_Repository.py | 2 +- .../B05_Profile_Router.py | 20 ++++----- .../B05_Profile_Router_Confirm.py | 18 ++++---- .../B05_Profile_Schema.py | 0 .../B05_Profile_UI_Drainage_Panel.ts | 8 ++-- .../B05_Profile_UI_Drainage_Parts.ts | 4 +- .../B05_Profile_UI_Drainage_Pipes.ts | 0 .../B05_Profile_UI_Drainage_Render.ts | 4 +- .../B05_Profile_UI_IrregularStations.ts | 2 +- .../B05_Profile_UI_Markers.ts | 0 .../B05_Profile_UI_Page.ts | 20 ++++----- .../B05_Profile_UI_Panel.ts | 4 +- .../B05_Profile_UI_Profile_Alignment.ts | 4 +- .../B05_Profile_UI_Profile_Data.ts | 4 +- .../B05_Profile_UI_Profile_Edit.ts | 6 +-- .../B05_Profile_UI_Profile_MassHaul.ts | 4 +- .../B05_Profile_UI_Profile_Panel.ts | 40 +++++++++--------- .../B05_Profile_UI_Profile_Structures.ts | 2 +- .../B05_Profile_UI_Profile_Table.ts | 8 ++-- .../B05_Profile_UI_Profile_TableOverlay.ts | 2 +- .../B05_Profile_UI_Selection.ts | 2 +- .../B05_Profile_UI_Style.css | 2 +- .../B05_Profile_UI_Style_MassHaul.css | 2 +- .../B05_Profile_UI_Viewer.ts | 2 +- .../B06_Section_Api_Fetch.ts | 6 +-- .../B06_Section_Engine_Areas.py | 0 .../B06_Section_Engine_Design.py | 2 +- .../B06_Section_Repository.py | 2 +- .../B06_Section_Router.py | 14 +++--- .../B06_Section_Router_Confirm.py | 8 ++-- .../B06_Section_Schema.py | 0 .../B06_Section_Section_Store.ts | 6 +-- .../B06_Section_UI_Cross_Areas.ts | 8 ++-- .../B06_Section_UI_Cross_Design.ts | 4 +- .../B06_Section_UI_Cross_View.ts | 10 ++--- .../B06_Section_UI_Longitudinal.ts | 6 +-- .../B06_Section_UI_Page.ts | 20 ++++----- .../B06_Section_UI_Section_Common.ts | 6 +-- .../B06_Section_UI_Section_View.ts | 16 +++---- .../B06_Section_UI_Standard_Diagram.ts | 2 +- .../B06_Section_UI_Standard_Panel.ts | 6 +-- .../B06_Section_UI_Style.css | 2 +- .../B06_Section_UI_Style_Cross.css | 2 +- .../B06_Section_UI_Style_Cross_Areas.css | 2 +- .../B07_wf4_DesignDetail_Router.py | 6 +-- common_util/common_util_drainage_context.py | 4 +- common_util/common_util_mass_haul.css | 2 +- common_util/common_util_mass_haul.ts | 2 +- common_util/common_util_storage.py | 6 +-- config/config_frontend.ts | 8 ++-- config/config_system.py | 8 ++-- db_management/001_create_schema.sql | 6 +-- main.py | 6 +-- pyproject.toml | 2 +- ui_template/ui_template_locale_b2.ts | 8 ++-- 77 files changed, 223 insertions(+), 223 deletions(-) create mode 100644 .tmp_pdf_page2.png rename B05_wf2_Route/B05_wf2_Route_Api_Fetch.ts => B05_Profile/B05_Profile_Api_Fetch.ts (99%) rename B05_wf2_Route/B05_wf2_Route_Debug.py => B05_Profile/B05_Profile_Debug.py (100%) rename B05_wf2_Route/B05_wf2_Route_Engine.py => B05_Profile/B05_Profile_Engine.py (95%) rename B05_wf2_Route/B05_wf2_Route_Engine_Geometry.py => B05_Profile/B05_Profile_Engine_Geometry.py (100%) rename B05_wf2_Route/B05_wf2_Route_Engine_Grade.py => B05_Profile/B05_Profile_Engine_Grade.py (99%) rename B05_wf2_Route/B05_wf2_Route_Engine_Grade_Alignment.py => B05_Profile/B05_Profile_Engine_Grade_Alignment.py (99%) rename B05_wf2_Route/B05_wf2_Route_Engine_Grade_Profile.py => B05_Profile/B05_Profile_Engine_Grade_Profile.py (97%) rename B05_wf2_Route/B05_wf2_Route_Engine_Grade_Solver.py => B05_Profile/B05_Profile_Engine_Grade_Solver.py (99%) rename B05_wf2_Route/B05_wf2_Route_Engine_RidgeValley.py => B05_Profile/B05_Profile_Engine_RidgeValley.py (99%) rename B05_wf2_Route/B05_wf2_Route_Engine_Sections.py => B05_Profile/B05_Profile_Engine_Sections.py (98%) rename B05_wf2_Route/B05_wf2_Route_Engine_Sections_Core.py => B05_Profile/B05_Profile_Engine_Sections_Core.py (100%) rename B05_wf2_Route/B05_wf2_Route_Engine_Skeleton.py => B05_Profile/B05_Profile_Engine_Skeleton.py (99%) rename B05_wf2_Route/B05_wf2_Route_Engine_Solver.py => B05_Profile/B05_Profile_Engine_Solver.py (99%) rename B05_wf2_Route/B05_wf2_Route_Repository.py => B05_Profile/B05_Profile_Repository.py (99%) rename B05_wf2_Route/B05_wf2_Route_Router.py => B05_Profile/B05_Profile_Router.py (97%) rename B05_wf2_Route/B05_wf2_Route_Router_Confirm.py => B05_Profile/B05_Profile_Router_Confirm.py (92%) rename B05_wf2_Route/B05_wf2_Route_Schema.py => B05_Profile/B05_Profile_Schema.py (100%) rename B05_wf2_Route/B05_wf2_Route_UI_Drainage_Panel.ts => B05_Profile/B05_Profile_UI_Drainage_Panel.ts (99%) rename B05_wf2_Route/B05_wf2_Route_UI_Drainage_Parts.ts => B05_Profile/B05_Profile_UI_Drainage_Parts.ts (99%) rename B05_wf2_Route/B05_wf2_Route_UI_Drainage_Pipes.ts => B05_Profile/B05_Profile_UI_Drainage_Pipes.ts (100%) rename B05_wf2_Route/B05_wf2_Route_UI_Drainage_Render.ts => B05_Profile/B05_Profile_UI_Drainage_Render.ts (98%) rename B05_wf2_Route/B05_wf2_Route_UI_IrregularStations.ts => B05_Profile/B05_Profile_UI_IrregularStations.ts (99%) rename B05_wf2_Route/B05_wf2_Route_UI_Markers.ts => B05_Profile/B05_Profile_UI_Markers.ts (100%) rename B05_wf2_Route/B05_wf2_Route_UI_Page.ts => B05_Profile/B05_Profile_UI_Page.ts (98%) rename B05_wf2_Route/B05_wf2_Route_UI_Panel.ts => B05_Profile/B05_Profile_UI_Panel.ts (99%) rename B05_wf2_Route/B05_wf2_Route_UI_Profile_Alignment.ts => B05_Profile/B05_Profile_UI_Profile_Alignment.ts (99%) rename B05_wf2_Route/B05_wf2_Route_UI_Profile_Data.ts => B05_Profile/B05_Profile_UI_Profile_Data.ts (95%) rename B05_wf2_Route/B05_wf2_Route_UI_Profile_Edit.ts => B05_Profile/B05_Profile_UI_Profile_Edit.ts (98%) rename B05_wf2_Route/B05_wf2_Route_UI_Profile_MassHaul.ts => B05_Profile/B05_Profile_UI_Profile_MassHaul.ts (99%) rename B05_wf2_Route/B05_wf2_Route_UI_Profile_Panel.ts => B05_Profile/B05_Profile_UI_Profile_Panel.ts (97%) rename B05_wf2_Route/B05_wf2_Route_UI_Profile_Structures.ts => B05_Profile/B05_Profile_UI_Profile_Structures.ts (97%) rename B05_wf2_Route/B05_wf2_Route_UI_Profile_Table.ts => B05_Profile/B05_Profile_UI_Profile_Table.ts (99%) rename B05_wf2_Route/B05_wf2_Route_UI_Profile_TableOverlay.ts => B05_Profile/B05_Profile_UI_Profile_TableOverlay.ts (99%) rename B05_wf2_Route/B05_wf2_Route_UI_Selection.ts => B05_Profile/B05_Profile_UI_Selection.ts (98%) rename B05_wf2_Route/B05_wf2_Route_UI_Style.css => B05_Profile/B05_Profile_UI_Style.css (99%) rename B05_wf2_Route/B05_wf2_Route_UI_Style_MassHaul.css => B05_Profile/B05_Profile_UI_Style_MassHaul.css (99%) rename B05_wf2_Route/B05_wf2_Route_UI_Viewer.ts => B05_Profile/B05_Profile_UI_Viewer.ts (99%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch.ts => B06_Section/B06_Section_Api_Fetch.ts (99%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_Engine_Areas.py => B06_Section/B06_Section_Engine_Areas.py (100%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_Engine_Design.py => B06_Section/B06_Section_Engine_Design.py (99%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_Repository.py => B06_Section/B06_Section_Repository.py (99%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_Router.py => B06_Section/B06_Section_Router.py (98%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_Router_Confirm.py => B06_Section/B06_Section_Router_Confirm.py (96%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_Schema.py => B06_Section/B06_Section_Schema.py (100%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_Section_Store.ts => B06_Section/B06_Section_Section_Store.ts (94%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Cross_Areas.ts => B06_Section/B06_Section_UI_Cross_Areas.ts (98%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Cross_Design.ts => B06_Section/B06_Section_UI_Cross_Design.ts (99%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Cross_View.ts => B06_Section/B06_Section_UI_Cross_View.ts (99%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Longitudinal.ts => B06_Section/B06_Section_UI_Longitudinal.ts (98%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Page.ts => B06_Section/B06_Section_UI_Page.ts (97%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_Common.ts => B06_Section/B06_Section_UI_Section_Common.ts (97%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_View.ts => B06_Section/B06_Section_UI_Section_View.ts (98%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Standard_Diagram.ts => B06_Section/B06_Section_UI_Standard_Diagram.ts (99%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Standard_Panel.ts => B06_Section/B06_Section_UI_Standard_Panel.ts (98%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style.css => B06_Section/B06_Section_UI_Style.css (99%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style_Cross.css => B06_Section/B06_Section_UI_Style_Cross.css (99%) rename B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style_Cross_Areas.css => B06_Section/B06_Section_UI_Style_Cross_Areas.css (99%) diff --git a/.tmp_pdf_page2.png b/.tmp_pdf_page2.png new file mode 100644 index 0000000000000000000000000000000000000000..64f0f1671d7e89ab1d5441966c6032079e34c0e7 GIT binary patch literal 11868 zcmeAS@N?(olHy`uVBq!ia0y~yV9jG-V2|Zs0*chDhb1#G=qY=;IEGZrd3(!H@PGjW z^Tus|ESHOXYBtX_YqH<}d=5KM<%4tOJDGv>1R)^Na7>#KNO3G-0g?(3AqOuYn}JDl zRD#$b0f%0~;nAQRO+*Y0quFP);2^f(7%gN+>m6VvJX&Oo78#>O#%MMeZE}w`AV+J1 z(MHi|qiD2IG_nR@AT40CJ>W5^(dIDKn!}?bQ&bB|rO^>Gnshuyi`UWO zb+mXLEnY{9*U{n?>v|l>0%_j$LwADq`91#H(}LR-E&XJGB^`sOtDnm{r-UW|^I-_K literal 0 HcmV?d00001 diff --git a/A00_Common/b_workflow_nav.ts b/A00_Common/b_workflow_nav.ts index 168c61ac..e7c3d4d9 100644 --- a/A00_Common/b_workflow_nav.ts +++ b/A00_Common/b_workflow_nav.ts @@ -18,8 +18,8 @@ export interface WorkflowState { export const WORKFLOW_STEP_ROUTES: readonly RoutePath[] = [ ROUTES.B03_FILE_INPUT, ROUTES.B04_PREPROCESS, - ROUTES.B05_WF2_ROUTE, - ROUTES.B06_WF3_PROFILE_CROSS, + ROUTES.B05_PROFILE, + ROUTES.B06_SECTION, ROUTES.B07_WF4_DESIGN_DETAIL, ROUTES.B08_WF5_QUANTITY, ROUTES.B09_WF6_ESTIMATION, diff --git a/A00_Common/main.ts b/A00_Common/main.ts index f09898c7..e1124e1f 100644 --- a/A00_Common/main.ts +++ b/A00_Common/main.ts @@ -19,8 +19,8 @@ const FOOTERLESS_ROUTES: readonly RoutePath[] = [ ROUTES.B02_PROJ_REGISTER, ROUTES.B03_FILE_INPUT, ROUTES.B04_PREPROCESS, - ROUTES.B05_WF2_ROUTE, - ROUTES.B06_WF3_PROFILE_CROSS, + ROUTES.B05_PROFILE, + ROUTES.B06_SECTION, ROUTES.B07_WF4_DESIGN_DETAIL, ROUTES.B08_WF5_QUANTITY, ROUTES.B09_WF6_ESTIMATION, diff --git a/A00_Common/router.ts b/A00_Common/router.ts index de16010c..a4b354e4 100644 --- a/A00_Common/router.ts +++ b/A00_Common/router.ts @@ -41,10 +41,10 @@ const routeTable: Partial Promise>> = { (await import("../B03_FileInput/B03_FileInput_UI_Page")).renderB03FileInput, [ROUTES.B04_PREPROCESS]: async () => (await import("../B04_PreProcess/B04_PreProcess_UI_Page")).renderB04Surface, - [ROUTES.B05_WF2_ROUTE]: async () => - (await import("../B05_wf2_Route/B05_wf2_Route_UI_Page")).renderB05Route, - [ROUTES.B06_WF3_PROFILE_CROSS]: async () => - (await import("../B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Page")).renderB06ProfileCross, + [ROUTES.B05_PROFILE]: async () => + (await import("../B05_Profile/B05_Profile_UI_Page")).renderB05Route, + [ROUTES.B06_SECTION]: async () => + (await import("../B06_Section/B06_Section_UI_Page")).renderB06ProfileCross, [ROUTES.B07_WF4_DESIGN_DETAIL]: async () => (await import("../B07_wf4_DesignDetail/B07_wf4_DesignDetail_UI_Page")).renderB07DesignDetail, // B08_WF5_QUANTITY: 재작성 예정으로 기존 구현을 0_old_260726_codex.zip에 백업 후 제거. @@ -107,8 +107,8 @@ export async function renderCurrentRoute(outlet: HTMLElement): Promise { ROUTES.B02_PROJ_REGISTER, ROUTES.B03_FILE_INPUT, ROUTES.B04_PREPROCESS, - ROUTES.B05_WF2_ROUTE, - ROUTES.B06_WF3_PROFILE_CROSS, + ROUTES.B05_PROFILE, + ROUTES.B06_SECTION, ROUTES.B07_WF4_DESIGN_DETAIL, ROUTES.B08_WF5_QUANTITY, ROUTES.B09_WF6_ESTIMATION, diff --git a/B03_FileInput/B03_FileInput_Service_Chain.py b/B03_FileInput/B03_FileInput_Service_Chain.py index 99b70ab8..85b43cbe 100644 --- a/B03_FileInput/B03_FileInput_Service_Chain.py +++ b/B03_FileInput/B03_FileInput_Service_Chain.py @@ -59,10 +59,10 @@ async def run_auto_design_chain(project_id: UUID, surface_model_id: int | None = 예외를 밖으로 던지지 않는다 — 로그와 각 단계의 workflow 상태 기록으로 남긴다. """ from B03_FileInput.B03_FileInput_Repository import get_project_storage_relative_path - from B05_wf2_Route.B05_wf2_Route_Repository import get_latest_route - from B05_wf2_Route.B05_wf2_Route_Router import confirm_latest_route, solve_route - from B05_wf2_Route.B05_wf2_Route_Schema import RoutePoint, RouteSolveRequest - from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Router_Confirm import confirm_sections + from B05_Profile.B05_Profile_Repository import get_latest_route + from B05_Profile.B05_Profile_Router import confirm_latest_route, solve_route + from B05_Profile.B05_Profile_Schema import RoutePoint, RouteSolveRequest + from B06_Section.B06_Section_Router_Confirm import confirm_sections from common_util.common_util_storage import resolve_stored_project_path from common_util.common_util_surface_confirmation import surface_confirmation_defaults from config.config_db import get_db_pool @@ -167,16 +167,16 @@ async def run_redesign_chain( 경로가 아예 없으면 신규 자동 체인(계획노선 CSV 기본값)으로 되돌아간다. """ from B03_FileInput.B03_FileInput_Repository import get_project_storage_relative_path - from B05_wf2_Route.B05_wf2_Route_Repository import get_latest_route - from B05_wf2_Route.B05_wf2_Route_Router import confirm_latest_route, solve_route - from B05_wf2_Route.B05_wf2_Route_Schema import RouteSolveRequest - from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Repository import ( + from B05_Profile.B05_Profile_Repository import get_latest_route + from B05_Profile.B05_Profile_Router import confirm_latest_route, solve_route + from B05_Profile.B05_Profile_Schema import RouteSolveRequest + from B06_Section.B06_Section_Repository import ( get_cross_section_designs, get_longitudinal_section, update_cross_section_design, ) - from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Router_Confirm import confirm_sections - from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Schema import SectionConfirmRequest + from B06_Section.B06_Section_Router_Confirm import confirm_sections + from B06_Section.B06_Section_Schema import SectionConfirmRequest from common_util.common_util_workflow_state import get_workflow_state from config.config_db import get_db_pool diff --git a/B03_FileInput/B03_FileInput_UI_Page.ts b/B03_FileInput/B03_FileInput_UI_Page.ts index 1247f1d6..ff49b79d 100644 --- a/B03_FileInput/B03_FileInput_UI_Page.ts +++ b/B03_FileInput/B03_FileInput_UI_Page.ts @@ -54,7 +54,7 @@ function L(key: keyof typeof ui_locales): string { export async function renderB03FileInput(root: HTMLElement): Promise { const dashboardUser = await fetchDashboardMe(); const completionRoute = - dashboardUser.role === "SYSTEM_ADMIN" ? ROUTES.B04_PREPROCESS : ROUTES.B05_WF2_ROUTE; + dashboardUser.role === "SYSTEM_ADMIN" ? ROUTES.B04_PREPROCESS : ROUTES.B05_PROFILE; const slots = initializeSlots(); const cardMap = new Map(); const resultList = document.createElement("ul"); diff --git a/B04_PreProcess/B04_PreProcess_Router_Inflow.py b/B04_PreProcess/B04_PreProcess_Router_Inflow.py index f88ae43a..594e143a 100644 --- a/B04_PreProcess/B04_PreProcess_Router_Inflow.py +++ b/B04_PreProcess/B04_PreProcess_Router_Inflow.py @@ -24,7 +24,7 @@ from B03_FileInput.B03_FileInput_Repository import get_project_storage_relative_ from B04_PreProcess.B04_PreProcess_Engine_Watershed_Export import STAGES, drainage_dir from B04_PreProcess.B04_PreProcess_Engine_Watershed_Flow import polygonize_labels from B04_PreProcess.B04_PreProcess_Engine_Watershed_Grid import GridSpec -from B05_wf2_Route.B05_wf2_Route_Repository import get_surface_crs_epsg +from B05_Profile.B05_Profile_Repository import get_surface_crs_epsg from common_util.common_util_route_geometry import ( find_planned_route_file, read_planned_route_csv, diff --git a/B04_PreProcess/B04_PreProcess_Router_Watershed.py b/B04_PreProcess/B04_PreProcess_Router_Watershed.py index 378ecb28..206046f6 100644 --- a/B04_PreProcess/B04_PreProcess_Router_Watershed.py +++ b/B04_PreProcess/B04_PreProcess_Router_Watershed.py @@ -35,7 +35,7 @@ from B04_PreProcess.B04_PreProcess_Engine_Watershed_Grid import ( AZIMUTH_STEPS, mask_row_spans, ) -from B05_wf2_Route.B05_wf2_Route_Repository import get_surface_crs_epsg +from B05_Profile.B05_Profile_Repository import get_surface_crs_epsg from common_util.common_util_route_geometry import ( StructureCandidate, find_planned_route_file, diff --git a/B04_PreProcess/B04_PreProcess_UI_Page.ts b/B04_PreProcess/B04_PreProcess_UI_Page.ts index 746e84c2..bcd24d9e 100644 --- a/B04_PreProcess/B04_PreProcess_UI_Page.ts +++ b/B04_PreProcess/B04_PreProcess_UI_Page.ts @@ -10,7 +10,7 @@ import { import { createWorkflowLayout } from "@ui/ui_template_workflow_layout"; import { fetchDashboardMe } from "../B01_Dashboard/B01_Dashboard_Api_Fetch"; import { clearPreloadMark, purgeOtherProjects } from "../A00_Common/b_asset_cache"; -import { clearRouteLatestCache } from "../B05_wf2_Route/B05_wf2_Route_Api_Fetch"; +import { clearRouteLatestCache } from "../B05_Profile/B05_Profile_Api_Fetch"; import { workflowSteps } from "../A00_Common/b_page_scaffold"; import { fetchWorkflowState, @@ -39,7 +39,7 @@ const SOURCE_FILTERS = ["grid_min_z", "csf", "pmf"] as const; const MODEL_METHODS = ["tin", "dtm", "nurbs", "implicit", "meshfree"] as const; const DEFAULT_FILTER = "csf"; const DEFAULT_METHOD = "dtm"; -const ROUTE_STAGE = ROUTES.B05_WF2_ROUTE; +const ROUTE_STAGE = ROUTES.B05_PROFILE; function L(key: keyof typeof ui_locales): string { return ui_locales[key][currentLanguageIndex]; @@ -109,7 +109,7 @@ export async function renderB04Surface(root: HTMLElement): Promise { const surfaceStage = workflowState?.stages.find((stage) => stage.stage_no === 1); goToWorkflowStage( guardedProjectId, - surfaceStage?.state === "COMPLETE" ? ROUTES.B05_WF2_ROUTE : ROUTES.B03_FILE_INPUT, + surfaceStage?.state === "COMPLETE" ? ROUTES.B05_PROFILE : ROUTES.B03_FILE_INPUT, ); return; } diff --git a/B05_wf2_Route/B05_wf2_Route_Api_Fetch.ts b/B05_Profile/B05_Profile_Api_Fetch.ts similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_Api_Fetch.ts rename to B05_Profile/B05_Profile_Api_Fetch.ts index 427818da..7eb2751b 100644 --- a/B05_wf2_Route/B05_wf2_Route_Api_Fetch.ts +++ b/B05_Profile/B05_Profile_Api_Fetch.ts @@ -1,8 +1,8 @@ /* ============================================================================= - * B05_wf2_Route_Api_Fetch.ts + * B05_Profile_Api_Fetch.ts * 2차 워크플로우(경로 설계) API 클라이언트 * - * 백엔드 계약 (B05_wf2_Route_Router.py): + * 백엔드 계약 (B05_Profile_Router.py): * POST /api/projects/{project_id}/route/solve → 경로 탐색 + DB 기록 * POST /api/projects/{project_id}/route/confirm → 최신 경로 확정 * diff --git a/B05_wf2_Route/B05_wf2_Route_Debug.py b/B05_Profile/B05_Profile_Debug.py similarity index 100% rename from B05_wf2_Route/B05_wf2_Route_Debug.py rename to B05_Profile/B05_Profile_Debug.py diff --git a/B05_wf2_Route/B05_wf2_Route_Engine.py b/B05_Profile/B05_Profile_Engine.py similarity index 95% rename from B05_wf2_Route/B05_wf2_Route_Engine.py rename to B05_Profile/B05_Profile_Engine.py index 01c73135..eae556fd 100644 --- a/B05_wf2_Route/B05_wf2_Route_Engine.py +++ b/B05_Profile/B05_Profile_Engine.py @@ -9,12 +9,12 @@ import logging from pathlib import Path from typing import Any -from B05_wf2_Route.B05_wf2_Route_Debug import log_b05_debug -from B05_wf2_Route.B05_wf2_Route_Engine_RidgeValley import solve_ridge_valley_route -from B05_wf2_Route.B05_wf2_Route_Engine_Solver import solve_optimal_route +from B05_Profile.B05_Profile_Debug import log_b05_debug +from B05_Profile.B05_Profile_Engine_RidgeValley import solve_ridge_valley_route +from B05_Profile.B05_Profile_Engine_Solver import solve_optimal_route from common_util.common_util_json import atomic_write_json -_ROUTE_SUBDIR = Path("B05_wf2_Route") / "route" +_ROUTE_SUBDIR = Path("B05_Profile") / "route" # route_points 테이블에 저장할 렌더링 샘플 최대 개수 _MAX_RENDER_POINTS = 500 logger = logging.getLogger(__name__) diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_Geometry.py b/B05_Profile/B05_Profile_Engine_Geometry.py similarity index 100% rename from B05_wf2_Route/B05_wf2_Route_Engine_Geometry.py rename to B05_Profile/B05_Profile_Engine_Geometry.py diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_Grade.py b/B05_Profile/B05_Profile_Engine_Grade.py similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_Engine_Grade.py rename to B05_Profile/B05_Profile_Engine_Grade.py index 18270964..57394dab 100644 --- a/B05_wf2_Route/B05_wf2_Route_Engine_Grade.py +++ b/B05_Profile/B05_Profile_Engine_Grade.py @@ -17,7 +17,7 @@ from typing import Any import numpy as np -from B05_wf2_Route.B05_wf2_Route_Engine_Grade_Solver import ( +from B05_Profile.B05_Profile_Engine_Grade_Solver import ( balance_boundaries, build_vertical_curves, evaluate_profile, diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_Grade_Alignment.py b/B05_Profile/B05_Profile_Engine_Grade_Alignment.py similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_Engine_Grade_Alignment.py rename to B05_Profile/B05_Profile_Engine_Grade_Alignment.py index b1372155..349b76ec 100644 --- a/B05_wf2_Route/B05_wf2_Route_Engine_Grade_Alignment.py +++ b/B05_Profile/B05_Profile_Engine_Grade_Alignment.py @@ -10,8 +10,8 @@ - 종단곡선은 변화점 대칭 배치이며 좌우에 직선 구간이 반드시 남는다. - 곡선 기본 **반경** R = 측점간격 × `curve_radius_ratio`, 길이 L = R × |A| 로 파생. -수치 최적화(직선 분할 DP·표고 결정)는 [[B05_wf2_Route_Engine_Grade_Solver]]가, -기준 해석과 오케스트레이션은 [[B05_wf2_Route_Engine_Grade]]가 담당한다. 이 모듈은 +수치 최적화(직선 분할 DP·표고 결정)는 [[B05_Profile_Engine_Grade_Solver]]가, +기준 해석과 오케스트레이션은 [[B05_Profile_Engine_Grade]]가 담당한다. 이 모듈은 scipy에 의존하지 않는 순수 기하 계산만 두어 프론트엔드 구현과 1:1로 대응시킨다. """ diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_Grade_Profile.py b/B05_Profile/B05_Profile_Engine_Grade_Profile.py similarity index 97% rename from B05_wf2_Route/B05_wf2_Route_Engine_Grade_Profile.py rename to B05_Profile/B05_Profile_Engine_Grade_Profile.py index 0cd26186..662956d7 100644 --- a/B05_wf2_Route/B05_wf2_Route_Engine_Grade_Profile.py +++ b/B05_Profile/B05_Profile_Engine_Grade_Profile.py @@ -1,8 +1,8 @@ """B05 종단 계획선 선형 산출 오케스트레이터 (지반 추종 직선 분할 + 편집 재구성). -[[B05_wf2_Route_Engine_Grade]] 가 확정한 설계 기준과 -[[B05_wf2_Route_Engine_Grade_Solver]] 의 수치 계산, -[[B05_wf2_Route_Engine_Grade_Alignment]] 의 기하 파생을 묶어 +[[B05_Profile_Engine_Grade]] 가 확정한 설계 기준과 +[[B05_Profile_Engine_Grade_Solver]] 의 수치 계산, +[[B05_Profile_Engine_Grade_Alignment]] 의 기하 파생을 묶어 `design_profiles` 배열에 넣을 계획선 한 벌을 만든다. 세 진입점이 있다. @@ -22,12 +22,12 @@ from typing import Any import numpy as np -from B05_wf2_Route.B05_wf2_Route_Engine_Grade import ( +from B05_Profile.B05_Profile_Engine_Grade import ( GradeDesignOptions, detect_main_direction, ground_profile, ) -from B05_wf2_Route.B05_wf2_Route_Engine_Grade_Alignment import ( +from B05_Profile.B05_Profile_Engine_Grade_Alignment import ( ALIGNMENT_SCHEMA_VERSION, AlignmentPolicy, build_alignment, @@ -35,7 +35,7 @@ from B05_wf2_Route.B05_wf2_Route_Engine_Grade_Alignment import ( chainage_key, evaluate, ) -from B05_wf2_Route.B05_wf2_Route_Engine_Grade_Solver import ( +from B05_Profile.B05_Profile_Engine_Grade_Solver import ( grade_limits, integration_weights, solve_alignment_elevations, diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_Grade_Solver.py b/B05_Profile/B05_Profile_Engine_Grade_Solver.py similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_Engine_Grade_Solver.py rename to B05_Profile/B05_Profile_Engine_Grade_Solver.py index ae182cfb..231ae7d5 100644 --- a/B05_wf2_Route/B05_wf2_Route_Engine_Grade_Solver.py +++ b/B05_Profile/B05_Profile_Engine_Grade_Solver.py @@ -1,6 +1,6 @@ """B05 종단 계획선 산출의 수치 계산부 (적분 가중치·PVI 최적화·종단곡선 기하). -[[B05_wf2_Route_Engine_Grade]] 가 설계 기준을 확정한 뒤 이 모듈의 함수를 호출한다. +[[B05_Profile_Engine_Grade]] 가 설계 기준을 확정한 뒤 이 모듈의 함수를 호출한다. 설계 기준 객체에 의존하지 않고 스칼라 인자만 받아, 기준 해석과 수치 계산을 분리한다(700줄 제한에 따른 분할). """ diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_RidgeValley.py b/B05_Profile/B05_Profile_Engine_RidgeValley.py similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_Engine_RidgeValley.py rename to B05_Profile/B05_Profile_Engine_RidgeValley.py index cb7714a2..216d3848 100644 --- a/B05_wf2_Route/B05_wf2_Route_Engine_RidgeValley.py +++ b/B05_Profile/B05_Profile_Engine_RidgeValley.py @@ -13,14 +13,14 @@ from typing import Any import numpy as np -from B05_wf2_Route.B05_wf2_Route_Engine_Geometry import ( +from B05_Profile.B05_Profile_Engine_Geometry import ( circle_intrusions, circumradius_2d, point_to_polyline_dist_2d, resample_polyline_2d, ) -from B05_wf2_Route.B05_wf2_Route_Engine_Skeleton import load_or_build_skeleton -from B05_wf2_Route.B05_wf2_Route_Engine_Solver import ( +from B05_Profile.B05_Profile_Engine_Skeleton import load_or_build_skeleton +from B05_Profile.B05_Profile_Engine_Solver import ( _MODELS_SUBDIR, _load_or_build_cost_surface, ) diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_Sections.py b/B05_Profile/B05_Profile_Engine_Sections.py similarity index 98% rename from B05_wf2_Route/B05_wf2_Route_Engine_Sections.py rename to B05_Profile/B05_Profile_Engine_Sections.py index 28b0e2b7..7ed77a3f 100644 --- a/B05_wf2_Route/B05_wf2_Route_Engine_Sections.py +++ b/B05_Profile/B05_Profile_Engine_Sections.py @@ -11,12 +11,12 @@ import logging from pathlib import Path from typing import Any -from B05_wf2_Route.B05_wf2_Route_Engine_Grade import GradeDesignOptions, design_grade_line -from B05_wf2_Route.B05_wf2_Route_Engine_Grade_Profile import ( +from B05_Profile.B05_Profile_Engine_Grade import GradeDesignOptions, design_grade_line +from B05_Profile.B05_Profile_Engine_Grade_Profile import ( design_alignment_profile, design_pipe_anchored_profile, ) -from B05_wf2_Route.B05_wf2_Route_Engine_Sections_Core import ( +from B05_Profile.B05_Profile_Engine_Sections_Core import ( SectionGenerationOptions, generate_sections, ) @@ -33,7 +33,7 @@ from config.config_system import ( logger = logging.getLogger(__name__) -_STAGE_SUBDIR = Path("B06_wf3_ProfileCross") +_STAGE_SUBDIR = Path("B06_Section") _MODELS_SUBDIR = Path("B04_PreProcess") / "models" diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_Sections_Core.py b/B05_Profile/B05_Profile_Engine_Sections_Core.py similarity index 100% rename from B05_wf2_Route/B05_wf2_Route_Engine_Sections_Core.py rename to B05_Profile/B05_Profile_Engine_Sections_Core.py diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_Skeleton.py b/B05_Profile/B05_Profile_Engine_Skeleton.py similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_Engine_Skeleton.py rename to B05_Profile/B05_Profile_Engine_Skeleton.py index 5a14e77f..385e31a7 100644 --- a/B05_wf2_Route/B05_wf2_Route_Engine_Skeleton.py +++ b/B05_Profile/B05_Profile_Engine_Skeleton.py @@ -2,7 +2,7 @@ 수문학적 정의: D8 흐름누적이 임계값 이상인 셀=계곡, DEM 반전 시 능선. 누적값 크기의 2차 임계값으로 주/지를 나눈다. whitebox 우선, 실패 시 numpy -D8 폴백. 산출 polyline은 비용면과 동일 좌표계이며 B05_wf2_Route/route에 캐시된다. +D8 폴백. 산출 polyline은 비용면과 동일 좌표계이며 B05_Profile/route에 캐시된다. """ import json @@ -14,7 +14,7 @@ from typing import Any import numpy as np -from B05_wf2_Route.B05_wf2_Route_Engine_Solver import ( +from B05_Profile.B05_Profile_Engine_Solver import ( _MODELS_SUBDIR, _ROUTE_CACHE_SUBDIR, _cost_surface_signature, diff --git a/B05_wf2_Route/B05_wf2_Route_Engine_Solver.py b/B05_Profile/B05_Profile_Engine_Solver.py similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_Engine_Solver.py rename to B05_Profile/B05_Profile_Engine_Solver.py index 9b7e1dd5..032811de 100644 --- a/B05_wf2_Route/B05_wf2_Route_Engine_Solver.py +++ b/B05_Profile/B05_Profile_Engine_Solver.py @@ -11,7 +11,7 @@ from typing import Any import numpy as np -from B05_wf2_Route.B05_wf2_Route_Engine_Geometry import ( +from B05_Profile.B05_Profile_Engine_Geometry import ( circle_intrusions, circumradius_2d, compute_gradients, @@ -39,7 +39,7 @@ from config.config_system import ( # B04 지표면 모델 폴더명 (비용면의 표고 원본) _MODELS_SUBDIR = Path("B04_PreProcess") / "models" # B05 비용면 캐시 폴더명 -_ROUTE_CACHE_SUBDIR = Path("B05_wf2_Route") / "route" +_ROUTE_CACHE_SUBDIR = Path("B05_Profile") / "route" def _load_dtm_grid(models_dir: Path, filter_key: str, smooth: bool): diff --git a/B05_wf2_Route/B05_wf2_Route_Repository.py b/B05_Profile/B05_Profile_Repository.py similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_Repository.py rename to B05_Profile/B05_Profile_Repository.py index 061afea0..156c39dc 100644 --- a/B05_wf2_Route/B05_wf2_Route_Repository.py +++ b/B05_Profile/B05_Profile_Repository.py @@ -12,7 +12,7 @@ from uuid import UUID import aiomysql -_STAGE_ROOT = "B05_wf2_Route" +_STAGE_ROOT = "B05_Profile" def _validate_stage_path(relative_path: str) -> str: diff --git a/B05_wf2_Route/B05_wf2_Route_Router.py b/B05_Profile/B05_Profile_Router.py similarity index 97% rename from B05_wf2_Route/B05_wf2_Route_Router.py rename to B05_Profile/B05_Profile_Router.py index ca195d4e..e1a42985 100644 --- a/B05_wf2_Route/B05_wf2_Route_Router.py +++ b/B05_Profile/B05_Profile_Router.py @@ -12,13 +12,13 @@ from fastapi import APIRouter from fastapi.responses import JSONResponse from B03_FileInput.B03_FileInput_Repository import get_project_storage_relative_path -from B05_wf2_Route.B05_wf2_Route_Debug import log_b05_debug -from B05_wf2_Route.B05_wf2_Route_Engine import run_route_design -from B05_wf2_Route.B05_wf2_Route_Engine_Grade import GradeDesignOptions, resolve_grade_options -from B05_wf2_Route.B05_wf2_Route_Engine_Grade_Profile import rebuild_alignment_profile -from B05_wf2_Route.B05_wf2_Route_Engine_Sections import run_section_generation -from B05_wf2_Route.B05_wf2_Route_Engine_Sections_Core import SectionGenerationOptions -from B05_wf2_Route.B05_wf2_Route_Repository import ( +from B05_Profile.B05_Profile_Debug import log_b05_debug +from B05_Profile.B05_Profile_Engine import run_route_design +from B05_Profile.B05_Profile_Engine_Grade import GradeDesignOptions, resolve_grade_options +from B05_Profile.B05_Profile_Engine_Grade_Profile import rebuild_alignment_profile +from B05_Profile.B05_Profile_Engine_Sections import run_section_generation +from B05_Profile.B05_Profile_Engine_Sections_Core import SectionGenerationOptions +from B05_Profile.B05_Profile_Repository import ( confirm_route, create_route, create_route_statistics, @@ -28,12 +28,12 @@ from B05_wf2_Route.B05_wf2_Route_Repository import ( insert_route_points, update_longitudinal_grade_summary, ) -from B05_wf2_Route.B05_wf2_Route_Router_Confirm import ( +from B05_Profile.B05_Profile_Router_Confirm import ( _append_irregular_cross_sections, _merge_uphill_overrides_into_longitudinal, sync_uphill_overrides_into_designs, ) -from B05_wf2_Route.B05_wf2_Route_Schema import ( +from B05_Profile.B05_Profile_Schema import ( GRADE_PERCENT_FIELDS, ContourIntervalUpdateRequest, ContourIntervalUpdateResponse, @@ -46,7 +46,7 @@ from B05_wf2_Route.B05_wf2_Route_Schema import ( RouteSolveResponse, normalize_grade_percent, ) -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Repository import ( +from B06_Section.B06_Section_Repository import ( create_longitudinal_section, delete_sections_for_route, get_latest_grade_options, diff --git a/B05_wf2_Route/B05_wf2_Route_Router_Confirm.py b/B05_Profile/B05_Profile_Router_Confirm.py similarity index 92% rename from B05_wf2_Route/B05_wf2_Route_Router_Confirm.py rename to B05_Profile/B05_Profile_Router_Confirm.py index 1364db61..d324be50 100644 --- a/B05_wf2_Route/B05_wf2_Route_Router_Confirm.py +++ b/B05_Profile/B05_Profile_Router_Confirm.py @@ -1,6 +1,6 @@ """B05 경로 확정 시 종단 정본 파일에 비정규 측점·상단측 변경을 병합하는 헬퍼. -라우터(`B05_wf2_Route_Router.py`)의 confirm 엔드포인트가 호출한다. 파일 기반 병합이라 +라우터(`B05_Profile_Router.py`)의 confirm 엔드포인트가 호출한다. 파일 기반 병합이라 재확정해도 중복이 생기지 않으며, 모든 호출은 비치명적(실패해도 경로 확정은 진행)이다. """ @@ -13,11 +13,11 @@ from uuid import UUID import aiomysql from B03_FileInput.B03_FileInput_Repository import get_project_storage_relative_path -from B05_wf2_Route.B05_wf2_Route_Engine_Sections import generate_irregular_sections -from B05_wf2_Route.B05_wf2_Route_Engine_Sections_Core import SectionGenerationOptions -from B05_wf2_Route.B05_wf2_Route_Repository import get_surface_crs_epsg -from B05_wf2_Route.B05_wf2_Route_Schema import RouteConfirmRequest -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Repository import ( +from B05_Profile.B05_Profile_Engine_Sections import generate_irregular_sections +from B05_Profile.B05_Profile_Engine_Sections_Core import SectionGenerationOptions +from B05_Profile.B05_Profile_Repository import get_surface_crs_epsg +from B05_Profile.B05_Profile_Schema import RouteConfirmRequest +from B06_Section.B06_Section_Repository import ( get_latest_section_options, get_longitudinal_section, ) @@ -90,12 +90,12 @@ async def sync_uphill_overrides_into_designs( 양성(both_fill)은 측구가 없으므로 건드리지 않는다. """ # 지연 import — B06 라우터 모듈 로드는 이 함수가 실제 불릴 때만 필요하다. - from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Engine_Design import compute_cross_design - from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Repository import ( + from B06_Section.B06_Section_Engine_Design import compute_cross_design + from B06_Section.B06_Section_Repository import ( get_cross_section_designs, update_cross_section_design, ) - from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Router import _read_cross_design_inputs + from B06_Section.B06_Section_Router import _read_cross_design_inputs if not overrides: return diff --git a/B05_wf2_Route/B05_wf2_Route_Schema.py b/B05_Profile/B05_Profile_Schema.py similarity index 100% rename from B05_wf2_Route/B05_wf2_Route_Schema.py rename to B05_Profile/B05_Profile_Schema.py diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Drainage_Panel.ts b/B05_Profile/B05_Profile_UI_Drainage_Panel.ts similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_UI_Drainage_Panel.ts rename to B05_Profile/B05_Profile_UI_Drainage_Panel.ts index cd28024e..a4dadac1 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Drainage_Panel.ts +++ b/B05_Profile/B05_Profile_UI_Drainage_Panel.ts @@ -23,17 +23,17 @@ import { type PreparedLayer, type ViewState, } from "../B04_PreProcess/B04_PreProcess_UI_MapRender"; -import { type RoutePoint } from "./B05_wf2_Route_Api_Fetch"; +import { type RoutePoint } from "./B05_Profile_Api_Fetch"; import type { FlowArrow } from "../B04_PreProcess/B04_PreProcess_UI_FlowArrows"; import { buildStrengthArray, createFlowLegend, } from "../B04_PreProcess/B04_PreProcess_UI_FlowRamp"; import { resampleRoute } from "../B04_PreProcess/B04_PreProcess_UI_RouteSamples"; -import { createPipeEditor } from "./B05_wf2_Route_UI_Drainage_Pipes"; +import { createPipeEditor } from "./B05_Profile_UI_Drainage_Pipes"; import { createProgressCircle } from "@ui/ui_template_progress"; import { createMapContextMenu } from "@ui/ui_template_context_menu"; -import { drawDrainageScene } from "./B05_wf2_Route_UI_Drainage_Render"; +import { drawDrainageScene } from "./B05_Profile_UI_Drainage_Render"; import { mountDrainageToggles, DRAINAGE_LAYERS, @@ -54,7 +54,7 @@ import { reconcilePipes, WIDTH_KEY, type DrainageLayer, -} from "./B05_wf2_Route_UI_Drainage_Parts"; +} from "./B05_Profile_UI_Drainage_Parts"; /** 이만큼(px) 이하로 움직였다 뗐으면 클릭으로 본다 — 손떨림으로 선택이 안 되는 일을 막는다. */ const CLICK_SLOP_PX = 4; diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Drainage_Parts.ts b/B05_Profile/B05_Profile_UI_Drainage_Parts.ts similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_UI_Drainage_Parts.ts rename to B05_Profile/B05_Profile_UI_Drainage_Parts.ts index 61eecb1d..d24e3290 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Drainage_Parts.ts +++ b/B05_Profile/B05_Profile_UI_Drainage_Parts.ts @@ -2,7 +2,7 @@ * 배수유역도 패널 부품 (B05) * * 레이어 목록·색·보관 키 같은 상수와, 상태를 갖지 않는 DOM 조각(표시 토글 버튼, 유역 제원 - * 목록)을 모았다. 패널 본체(`B05_wf2_Route_UI_Drainage_Panel.ts`)가 700줄 한계에 닿아 + * 목록)을 모았다. 패널 본체(`B05_Profile_UI_Drainage_Panel.ts`)가 700줄 한계에 닿아 * 분리한 것으로, 여기 있는 것들은 패널의 내부 상태를 알지 못한다 — 전부 인자로 받는다. * ========================================================================== */ @@ -19,7 +19,7 @@ import { import { normalizeStrength, rampColor } from "../B04_PreProcess/B04_PreProcess_UI_FlowRamp"; import type { MapContextMenu } from "@ui/ui_template_context_menu"; import type { DetailBasin } from "../B04_PreProcess/B04_PreProcess_Api_Fetch"; -import type { PipeEditor, PipePoint } from "./B05_wf2_Route_UI_Drainage_Pipes"; +import type { PipeEditor, PipePoint } from "./B05_Profile_UI_Drainage_Pipes"; function L(key: keyof typeof ui_locales): string { return ui_locales[key][currentLanguageIndex]; diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Drainage_Pipes.ts b/B05_Profile/B05_Profile_UI_Drainage_Pipes.ts similarity index 100% rename from B05_wf2_Route/B05_wf2_Route_UI_Drainage_Pipes.ts rename to B05_Profile/B05_Profile_UI_Drainage_Pipes.ts diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Drainage_Render.ts b/B05_Profile/B05_Profile_UI_Drainage_Render.ts similarity index 98% rename from B05_wf2_Route/B05_wf2_Route_UI_Drainage_Render.ts rename to B05_Profile/B05_Profile_UI_Drainage_Render.ts index 1cef7c93..9df429ae 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Drainage_Render.ts +++ b/B05_Profile/B05_Profile_UI_Drainage_Render.ts @@ -36,8 +36,8 @@ import { DRAINAGE_LAYERS, layerColor, type DrainageLayer, -} from "./B05_wf2_Route_UI_Drainage_Parts"; -import type { PipeEditor } from "./B05_wf2_Route_UI_Drainage_Pipes"; +} from "./B05_Profile_UI_Drainage_Parts"; +import type { PipeEditor } from "./B05_Profile_UI_Drainage_Pipes"; export interface DrainageScene { meta: VWorldMeta | null; diff --git a/B05_wf2_Route/B05_wf2_Route_UI_IrregularStations.ts b/B05_Profile/B05_Profile_UI_IrregularStations.ts similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_UI_IrregularStations.ts rename to B05_Profile/B05_Profile_UI_IrregularStations.ts index 8f076d46..a9ca5ae5 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_IrregularStations.ts +++ b/B05_Profile/B05_Profile_UI_IrregularStations.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_wf2_Route_UI_IrregularStations.ts + * B05_Profile_UI_IrregularStations.ts * 비정규 측점(구조물 측점) 입력·목록·편집 사이드바 섹션. * * 사용자가 규칙 격자(측점 간격) 밖의 임의 위치(측점번호 X + 잔여거리 XX)에 구조물 측점을 diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Markers.ts b/B05_Profile/B05_Profile_UI_Markers.ts similarity index 100% rename from B05_wf2_Route/B05_wf2_Route_UI_Markers.ts rename to B05_Profile/B05_Profile_UI_Markers.ts diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Page.ts b/B05_Profile/B05_Profile_UI_Page.ts similarity index 98% rename from B05_wf2_Route/B05_wf2_Route_UI_Page.ts rename to B05_Profile/B05_Profile_UI_Page.ts index b7e5961c..40f15b64 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Page.ts +++ b/B05_Profile/B05_Profile_UI_Page.ts @@ -25,33 +25,33 @@ import { type CirclePoint, type RouteLatestResponse, type RoutePoint, -} from "./B05_wf2_Route_Api_Fetch"; +} from "./B05_Profile_Api_Fetch"; import { type ModelBounds, type PlacedRoutePoint, type RouteDesignPoints, type RoutePointKind, -} from "./B05_wf2_Route_UI_Markers"; -import { createRoutePanel, type RoutePanelValues } from "./B05_wf2_Route_UI_Panel"; -import { createRouteProfilePanel } from "./B05_wf2_Route_UI_Profile_Panel"; -import { createSelectionSync } from "./B05_wf2_Route_UI_Selection"; -import { createRouteViewer } from "./B05_wf2_Route_UI_Viewer"; +} from "./B05_Profile_UI_Markers"; +import { createRoutePanel, type RoutePanelValues } from "./B05_Profile_UI_Panel"; +import { createRouteProfilePanel } from "./B05_Profile_UI_Profile_Panel"; +import { createSelectionSync } from "./B05_Profile_UI_Selection"; +import { createRouteViewer } from "./B05_Profile_UI_Viewer"; import { irregularLabel, irregularStationId, isPipeStation, type IrregularStation, -} from "./B05_wf2_Route_UI_IrregularStations"; +} from "./B05_Profile_UI_IrregularStations"; import { fetchSectionContext, type SectionDetailResponse, type SectionStation, -} from "../B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch"; +} from "../B06_Section/B06_Section_Api_Fetch"; import { invalidateSectionDetail, loadSectionDetail, -} from "../B06_wf3_ProfileCross/B06_wf3_ProfileCross_Section_Store"; -import "./B05_wf2_Route_UI_Style.css"; +} from "../B06_Section/B06_Section_Section_Store"; +import "./B05_Profile_UI_Style.css"; type GradeClass = RoutePanelValues["gradeClass"]; type RoadWidths = Record; diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Panel.ts b/B05_Profile/B05_Profile_UI_Panel.ts similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_UI_Panel.ts rename to B05_Profile/B05_Profile_UI_Panel.ts index 940c2d8b..b8be62af 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Panel.ts +++ b/B05_Profile/B05_Profile_UI_Panel.ts @@ -1,9 +1,9 @@ -import type { PlacedRoutePoint, RoutePointKind } from "./B05_wf2_Route_UI_Markers"; +import type { PlacedRoutePoint, RoutePointKind } from "./B05_Profile_UI_Markers"; import { createIrregularStationsSection, type IrregularStation, type IrregularStationsSection, -} from "./B05_wf2_Route_UI_IrregularStations"; +} from "./B05_Profile_UI_IrregularStations"; import { type ButtonVariant, createButton, createSelectField } from "@ui/ui_template_elements"; import { attachCollapsible } from "@ui/ui_template_collapsible"; import { currentLanguageIndex, ui_locales } from "@ui/ui_template_locale"; diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Alignment.ts b/B05_Profile/B05_Profile_UI_Profile_Alignment.ts similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_UI_Profile_Alignment.ts rename to B05_Profile/B05_Profile_UI_Profile_Alignment.ts index a6068d64..36855cf6 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Alignment.ts +++ b/B05_Profile/B05_Profile_UI_Profile_Alignment.ts @@ -1,8 +1,8 @@ /* ============================================================================= - * B05_wf2_Route_UI_Profile_Alignment.ts + * B05_Profile_UI_Profile_Alignment.ts * 종단 계획선 선형(직선 + 측점 위 종단곡선) 프론트엔드 기하 계산. * - * 백엔드 `B05_wf2_Route_Engine_Grade_Alignment.py`와 **같은 식**을 쓴다. 사용자가 + * 백엔드 `B05_Profile_Engine_Grade_Alignment.py`와 **같은 식**을 쓴다. 사용자가 * 0.1m 버튼을 누를 때마다 서버를 오가지 않고 즉시 다시 그리기 위한 계산부이며, * 확정 시점에는 편집 델타만 서버로 보내 백엔드가 정본을 다시 만든다. * diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Data.ts b/B05_Profile/B05_Profile_UI_Profile_Data.ts similarity index 95% rename from B05_wf2_Route/B05_wf2_Route_UI_Profile_Data.ts rename to B05_Profile/B05_Profile_UI_Profile_Data.ts index 375e39de..c15af2ce 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Data.ts +++ b/B05_Profile/B05_Profile_UI_Profile_Data.ts @@ -8,8 +8,8 @@ import type { DesignProfile, LongitudinalSection, -} from "../B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch"; -import type { ProfileAlignment } from "./B05_wf2_Route_UI_Profile_Alignment"; +} from "../B06_Section/B06_Section_Api_Fetch"; +import type { ProfileAlignment } from "./B05_Profile_UI_Profile_Alignment"; export function readAlignment(data: LongitudinalSection): ProfileAlignment | null { const candidate = data.profile_alignment as ProfileAlignment | undefined; diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Edit.ts b/B05_Profile/B05_Profile_UI_Profile_Edit.ts similarity index 98% rename from B05_wf2_Route/B05_wf2_Route_UI_Profile_Edit.ts rename to B05_Profile/B05_Profile_UI_Profile_Edit.ts index 8ab19cb4..79c6dac8 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Edit.ts +++ b/B05_Profile/B05_Profile_UI_Profile_Edit.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_wf2_Route_UI_Profile_Edit.ts + * B05_Profile_UI_Profile_Edit.ts * 종단 계획선 편집 상태 보관과 그래프 위 숨김 버튼 오버레이. * * 편집 델타는 세션 저장소에 초안으로 남겨 새로고침해도 작업이 날아가지 않게 하고, @@ -19,8 +19,8 @@ import type { AlignmentEdits, AlignmentSegment, ProfileAlignment, -} from "./B05_wf2_Route_UI_Profile_Alignment"; -import { chainageKey, emptyEdits, hasEdits } from "./B05_wf2_Route_UI_Profile_Alignment"; +} from "./B05_Profile_UI_Profile_Alignment"; +import { chainageKey, emptyEdits, hasEdits } from "./B05_Profile_UI_Profile_Alignment"; const DRAFT_KEY_PREFIX = "b05-profile-alignment-draft"; /** 버튼 폭(21px)에 여유를 더한 값 — 이보다 가까우면 겹친 것으로 본다. */ diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Profile_MassHaul.ts b/B05_Profile/B05_Profile_UI_Profile_MassHaul.ts similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_UI_Profile_MassHaul.ts rename to B05_Profile/B05_Profile_UI_Profile_MassHaul.ts index 314512ef..456ab36d 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Profile_MassHaul.ts +++ b/B05_Profile/B05_Profile_UI_Profile_MassHaul.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_wf2_Route_UI_Profile_MassHaul.ts + * B05_Profile_UI_Profile_MassHaul.ts * B05 유토곡선 — 종단면 패널 바닥에 붙는 **오버레이 서브패널**. * * ── B06과 같은 그림이어야 한다 (2026-08-03 사용자 확정) ────────────── @@ -50,7 +50,7 @@ import { import { createWorkflowPanelHandle } from "@ui/ui_template_overlay"; import { createPanelResizer } from "@ui/ui_template_resizer"; import "@util/common_util_mass_haul.css"; -import "./B05_wf2_Route_UI_Style_MassHaul.css"; +import "./B05_Profile_UI_Style_MassHaul.css"; /** 2차 패널 펼침 여부 — 세션 동안만 유지(패널 높이·접힘과 같은 수명). */ const OPEN_KEY = "b05-route-profile-masshaul-open"; diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Panel.ts b/B05_Profile/B05_Profile_UI_Profile_Panel.ts similarity index 97% rename from B05_wf2_Route/B05_wf2_Route_UI_Profile_Panel.ts rename to B05_Profile/B05_Profile_UI_Profile_Panel.ts index 38bd9f3e..62b4875b 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Panel.ts +++ b/B05_Profile/B05_Profile_UI_Profile_Panel.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_wf2_Route_UI_Profile_Panel.ts + * B05_Profile_UI_Profile_Panel.ts * 하단 종단면도 패널 — 그래프 + 도면 테이블 2단, 계획선 직접 편집. * * 화면 높이의 60%를 쓰며, 그래프와 12행 도면 테이블이 **하나의 가로 스크롤러** 안에 @@ -13,35 +13,35 @@ import type { LongitudinalSection, SectionDetailResponse, -} from "../B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch"; +} from "../B06_Section/B06_Section_Api_Fetch"; import { createLongitudinalProfile, longitudinalMinimumWidth, -} from "../B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Longitudinal"; -import { LONG_PAD } from "../B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_Common"; +} from "../B06_Section/B06_Section_UI_Longitudinal"; +import { LONG_PAD } from "../B06_Section/B06_Section_UI_Section_Common"; import { createWorkflowPanelHandle } from "@ui/ui_template_overlay"; import { createPanelResizer } from "@ui/ui_template_resizer"; -import { createDrainagePanel } from "./B05_wf2_Route_UI_Drainage_Panel"; -import { mountStructureMenu } from "./B05_wf2_Route_UI_Profile_Structures"; +import { createDrainagePanel } from "./B05_Profile_UI_Drainage_Panel"; +import { mountStructureMenu } from "./B05_Profile_UI_Profile_Structures"; import { createProfileTableOverlay, TABLE_OVERLAY_MIN_HEIGHT, -} from "./B05_wf2_Route_UI_Profile_TableOverlay"; +} from "./B05_Profile_UI_Profile_TableOverlay"; import { hasLegacyAlignment, normalizedLongitudinal, readAlignment, toDesignProfile, -} from "./B05_wf2_Route_UI_Profile_Data"; +} from "./B05_Profile_UI_Profile_Data"; import { createProgressCircle } from "@ui/ui_template_progress"; import { showToast } from "@ui/ui_template_elements"; -import { saveProfileAlignment } from "./B05_wf2_Route_Api_Fetch"; -import { previewCrossDesigns } from "../B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch"; +import { saveProfileAlignment } from "./B05_Profile_Api_Fetch"; +import { previewCrossDesigns } from "../B06_Section/B06_Section_Api_Fetch"; import type { AlignmentBase, AlignmentEdits, ProfileAlignment, -} from "./B05_wf2_Route_UI_Profile_Alignment"; +} from "./B05_Profile_UI_Profile_Alignment"; import { adjustStation, buildAlignment, @@ -50,31 +50,31 @@ import { setCurveRadius, shiftSegment, toAlignmentBase, -} from "./B05_wf2_Route_UI_Profile_Alignment"; -import { createEditOverlay, createProfileEditStore } from "./B05_wf2_Route_UI_Profile_Edit"; +} from "./B05_Profile_UI_Profile_Alignment"; +import { createEditOverlay, createProfileEditStore } from "./B05_Profile_UI_Profile_Edit"; import { configureBalloonOffsets } from "@util/common_util_mass_haul_balance_view"; import { buildStickyYAxis, createRouteMassHaulPanel, MASSHAUL_MIN_HEIGHT, type RouteMassHaulContext, -} from "./B05_wf2_Route_UI_Profile_MassHaul"; +} from "./B05_Profile_UI_Profile_MassHaul"; import { createProfileTable, tableCellWidthFor, TABLE_TARGET_FONT_PX, -} from "./B05_wf2_Route_UI_Profile_Table"; +} from "./B05_Profile_UI_Profile_Table"; import { irregularLabel, irregularStationId, type IrregularStation, -} from "./B05_wf2_Route_UI_IrregularStations"; -import type { SectionStation } from "../B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch"; -import "../B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style.css"; +} from "./B05_Profile_UI_IrregularStations"; +import type { SectionStation } from "../B06_Section/B06_Section_Api_Fetch"; +import "../B06_Section/B06_Section_UI_Style.css"; // SVG 차트 색상(.b06-chart__*)의 정의처는 _Style_Cross.css다. 이걸 빼면 B05로 바로 진입했을 때 // 배경 rect가 브라우저 기본 fill(검정)로 그려진다 — B06을 먼저 방문해야 정상으로 보이던 원인. -import "../B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style_Cross.css"; -import "../B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style_Cross_Areas.css"; +import "../B06_Section/B06_Section_UI_Style_Cross.css"; +import "../B06_Section/B06_Section_UI_Style_Cross_Areas.css"; const COLLAPSED_KEY = "b05-route-profile-collapsed"; /** 드래그로 조절한 하단 패널 높이(px) 보관 키 — 브라우저 세션 동안만 유지한다. */ diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Structures.ts b/B05_Profile/B05_Profile_UI_Profile_Structures.ts similarity index 97% rename from B05_wf2_Route/B05_wf2_Route_UI_Profile_Structures.ts rename to B05_Profile/B05_Profile_UI_Profile_Structures.ts index 7a42e955..4bbd504c 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Structures.ts +++ b/B05_Profile/B05_Profile_UI_Profile_Structures.ts @@ -10,7 +10,7 @@ * ========================================================================== */ import { createMapContextMenu } from "@ui/ui_template_context_menu"; -import { isPipeStation, type IrregularStation } from "./B05_wf2_Route_UI_IrregularStations"; +import { isPipeStation, type IrregularStation } from "./B05_Profile_UI_IrregularStations"; /** 선을 잡았다고 볼 좌우 여유(px). 선 자체는 얇아 그대로는 집기 어렵다. */ const GRAB_SLACK_PX = 6; diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Table.ts b/B05_Profile/B05_Profile_UI_Profile_Table.ts similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_UI_Profile_Table.ts rename to B05_Profile/B05_Profile_UI_Profile_Table.ts index f08953bb..347b6678 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Profile_Table.ts +++ b/B05_Profile/B05_Profile_UI_Profile_Table.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_wf2_Route_UI_Profile_Table.ts + * B05_Profile_UI_Profile_Table.ts * 종단면도 하단 도면 테이블 (구배 3행 · 측점값 7행 · 곡선 2행 = 12행). * * 실무 종단면도 좌측 하단 표를 그대로 옮긴 구성이다. 구배와 곡선은 단일값 행이 아니라 @@ -16,13 +16,13 @@ import type { AlignmentCurve, AlignmentSegment, ProfileAlignment, -} from "./B05_wf2_Route_UI_Profile_Alignment"; -import { stationLabel } from "../B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_Common"; +} from "./B05_Profile_UI_Profile_Alignment"; +import { stationLabel } from "../B06_Section/B06_Section_UI_Section_Common"; import { irregularStationId, isPipeStation, type IrregularStation, -} from "./B05_wf2_Route_UI_IrregularStations"; +} from "./B05_Profile_UI_IrregularStations"; export interface ProfileTableOptions { alignment: ProfileAlignment; diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Profile_TableOverlay.ts b/B05_Profile/B05_Profile_UI_Profile_TableOverlay.ts similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_UI_Profile_TableOverlay.ts rename to B05_Profile/B05_Profile_UI_Profile_TableOverlay.ts index 96f893d3..cfea791e 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Profile_TableOverlay.ts +++ b/B05_Profile/B05_Profile_UI_Profile_TableOverlay.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_wf2_Route_UI_Profile_TableOverlay.ts + * B05_Profile_UI_Profile_TableOverlay.ts * 하단 종단 패널의 12행 도면식 테이블을 **유토곡선과 같은 형태**의 바닥 고정 * 오버레이 서브패널로 감싼다(2026-08-05 사용자 지시). * diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Selection.ts b/B05_Profile/B05_Profile_UI_Selection.ts similarity index 98% rename from B05_wf2_Route/B05_wf2_Route_UI_Selection.ts rename to B05_Profile/B05_Profile_UI_Selection.ts index b08089bf..4f2da651 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Selection.ts +++ b/B05_Profile/B05_Profile_UI_Selection.ts @@ -13,7 +13,7 @@ import { irregularStationId, isPipeStation, type IrregularStation, -} from "./B05_wf2_Route_UI_IrregularStations"; +} from "./B05_Profile_UI_IrregularStations"; export interface SelectionSyncPorts { /** 현재 구조물 측점 목록(수동 + 배관 투영분). */ diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Style.css b/B05_Profile/B05_Profile_UI_Style.css similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_UI_Style.css rename to B05_Profile/B05_Profile_UI_Style.css index 68896cf5..10e66579 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Style.css +++ b/B05_Profile/B05_Profile_UI_Style.css @@ -121,7 +121,7 @@ } /* 가로 스크롤 고정 Y축(.b05-profile__yaxis*)의 정의처는 - B05_wf2_Route_UI_Style_MassHaul.css다 — buildStickyYAxis를 쓰는 B05·B06이 함께 얻는다. */ + B05_Profile_UI_Style_MassHaul.css다 — buildStickyYAxis를 쓰는 B05·B06이 함께 얻는다. */ .b05-route-profile.is-collapsed .b05-route-profile__body-wrap, .b05-route-profile.is-collapsed .b05-route-profile__body, diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Style_MassHaul.css b/B05_Profile/B05_Profile_UI_Style_MassHaul.css similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_UI_Style_MassHaul.css rename to B05_Profile/B05_Profile_UI_Style_MassHaul.css index 70d7d038..5ee9930a 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Style_MassHaul.css +++ b/B05_Profile/B05_Profile_UI_Style_MassHaul.css @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_wf2_Route_UI_Style_MassHaul.css + * B05_Profile_UI_Style_MassHaul.css * B05 계획 유토곡선 2차 슬라이드 패널 전용 스타일. * * 곡선·범례·요약 자체의 스타일은 공용(`common_util_mass_haul.css`)이 이미 정의한다. diff --git a/B05_wf2_Route/B05_wf2_Route_UI_Viewer.ts b/B05_Profile/B05_Profile_UI_Viewer.ts similarity index 99% rename from B05_wf2_Route/B05_wf2_Route_UI_Viewer.ts rename to B05_Profile/B05_Profile_UI_Viewer.ts index 1cf617c1..d02b2829 100644 --- a/B05_wf2_Route/B05_wf2_Route_UI_Viewer.ts +++ b/B05_Profile/B05_Profile_UI_Viewer.ts @@ -12,7 +12,7 @@ import { type RouteMarkers, type RoutePointKind, type SectionStationMarker, -} from "./B05_wf2_Route_UI_Markers"; +} from "./B05_Profile_UI_Markers"; const LIGHT_VIEWER_BACKGROUND = 0xf5f7fa; const DARK_VIEWER_BACKGROUND = 0x251f38; diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch.ts b/B06_Section/B06_Section_Api_Fetch.ts similarity index 99% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch.ts rename to B06_Section/B06_Section_Api_Fetch.ts index a172c1dd..6a2a173e 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Api_Fetch.ts +++ b/B06_Section/B06_Section_Api_Fetch.ts @@ -1,8 +1,8 @@ /* ============================================================================= - * B06_wf3_ProfileCross_Api_Fetch.ts + * B06_Section_Api_Fetch.ts * 3차 워크플로우(종·횡단 생성) API 클라이언트 * - * 백엔드 계약 (B06_wf3_ProfileCross_Router.py): + * 백엔드 계약 (B06_Section_Router.py): * GET /api/projects/{project_id}/sections/context → 확정 경로 + 기본 옵션 * GET /api/projects/{project_id}/sections/{route_id} → 종단 요약 조회 * GET /api/projects/{project_id}/sections/{route_id}/detail → 종횡단 원시 샘플 조회 @@ -178,7 +178,7 @@ export interface LongitudinalSection { /** * 계획선 변화점(PVI) 구조. B05가 편집 기준선으로 사용하며 `design_profiles`는 * 여기서 파생된다. 구 데이터에는 없을 수 있어 optional이다. - * 구조는 `B05_wf2_Route_UI_Profile_Alignment.ProfileAlignment`. + * 구조는 `B05_Profile_UI_Profile_Alignment.ProfileAlignment`. */ profile_alignment?: unknown; } diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Engine_Areas.py b/B06_Section/B06_Section_Engine_Areas.py similarity index 100% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_Engine_Areas.py rename to B06_Section/B06_Section_Engine_Areas.py diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Engine_Design.py b/B06_Section/B06_Section_Engine_Design.py similarity index 99% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_Engine_Design.py rename to B06_Section/B06_Section_Engine_Design.py index 08a7d393..e6eb086f 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Engine_Design.py +++ b/B06_Section/B06_Section_Engine_Design.py @@ -18,7 +18,7 @@ from collections.abc import Callable from typing import Any -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Engine_Areas import ( +from B06_Section.B06_Section_Engine_Areas import ( _split_cut_areas, _trapezoid_areas, ) diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Repository.py b/B06_Section/B06_Section_Repository.py similarity index 99% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_Repository.py rename to B06_Section/B06_Section_Repository.py index 707c5649..9b4119bb 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Repository.py +++ b/B06_Section/B06_Section_Repository.py @@ -13,7 +13,7 @@ from uuid import UUID import aiomysql -_STAGE_ROOT = "B06_wf3_ProfileCross" +_STAGE_ROOT = "B06_Section" def _validate_stage_path(relative_path: str) -> str: diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Router.py b/B06_Section/B06_Section_Router.py similarity index 98% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_Router.py rename to B06_Section/B06_Section_Router.py index 8929062d..9208aa55 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Router.py +++ b/B06_Section/B06_Section_Router.py @@ -12,16 +12,16 @@ from fastapi import APIRouter, Depends from fastapi.responses import JSONResponse from B03_FileInput.B03_FileInput_Repository import get_project_storage_relative_path -from B05_wf2_Route.B05_wf2_Route_Engine_Grade import GradeDesignOptions, resolve_grade_options -from B05_wf2_Route.B05_wf2_Route_Engine_Grade_Profile import rebuild_alignment_profile -from B05_wf2_Route.B05_wf2_Route_Engine_Sections import ( +from B05_Profile.B05_Profile_Engine_Grade import GradeDesignOptions, resolve_grade_options +from B05_Profile.B05_Profile_Engine_Grade_Profile import rebuild_alignment_profile +from B05_Profile.B05_Profile_Engine_Sections import ( cross_filename, prune_stale_cross_files, run_section_generation, ) -from B05_wf2_Route.B05_wf2_Route_Engine_Sections_Core import SectionGenerationOptions -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Engine_Design import compute_cross_design -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Repository import ( +from B05_Profile.B05_Profile_Engine_Sections_Core import SectionGenerationOptions +from B06_Section.B06_Section_Engine_Design import compute_cross_design +from B06_Section.B06_Section_Repository import ( count_cross_sections, create_longitudinal_section, delete_sections_for_route, @@ -35,7 +35,7 @@ from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Repository import ( list_recent_company_projects, update_cross_section_design, ) -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Schema import ( +from B06_Section.B06_Section_Schema import ( CompanyStandardListResponse, CompanyStandardProject, CompanyStandardResponse, diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Router_Confirm.py b/B06_Section/B06_Section_Router_Confirm.py similarity index 96% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_Router_Confirm.py rename to B06_Section/B06_Section_Router_Confirm.py index ddc740d6..8af3ef11 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Router_Confirm.py +++ b/B06_Section/B06_Section_Router_Confirm.py @@ -19,8 +19,8 @@ from fastapi import APIRouter, Body from fastapi.responses import JSONResponse from B03_FileInput.B03_FileInput_Repository import get_project_storage_relative_path -from B05_wf2_Route.B05_wf2_Route_Router_Confirm import _merge_uphill_overrides_into_longitudinal -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Repository import ( +from B05_Profile.B05_Profile_Router_Confirm import _merge_uphill_overrides_into_longitudinal +from B06_Section.B06_Section_Repository import ( confirm_sections_for_route, get_cross_section_designs, get_cross_sections_missing_design_chainages, @@ -30,8 +30,8 @@ from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Repository import ( merge_longitudinal_section_options, update_cross_section_design, ) -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Router import _compute_default_designs -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Schema import ( +from B06_Section.B06_Section_Router import _compute_default_designs +from B06_Section.B06_Section_Schema import ( SectionConfirmRequest, SectionConfirmResponse, ) diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Schema.py b/B06_Section/B06_Section_Schema.py similarity index 100% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_Schema.py rename to B06_Section/B06_Section_Schema.py diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Section_Store.ts b/B06_Section/B06_Section_Section_Store.ts similarity index 94% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_Section_Store.ts rename to B06_Section/B06_Section_Section_Store.ts index e3b4147f..86c5e2bf 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_Section_Store.ts +++ b/B06_Section/B06_Section_Section_Store.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B06_wf3_ProfileCross_Section_Store.ts + * B06_Section_Section_Store.ts * 종횡단 상세(SectionDetailResponse)의 **프론트 공유 캐시** — B05·B06이 같은 객체를 본다. * * ── 왜 필요한가 (2026-08-03 사용자 확정) ───────────────────────────── @@ -15,8 +15,8 @@ * 쓰는 조작(재생성·계획선 편집 저장·확정)은 그 응답/재조회로 `replace`·`invalidate`한다. * ========================================================================== */ -import type { SectionDetailResponse } from "./B06_wf3_ProfileCross_Api_Fetch"; -import { fetchSectionDetail } from "./B06_wf3_ProfileCross_Api_Fetch"; +import type { SectionDetailResponse } from "./B06_Section_Api_Fetch"; +import { fetchSectionDetail } from "./B06_Section_Api_Fetch"; const cache = new Map(); const pending = new Map>(); diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Cross_Areas.ts b/B06_Section/B06_Section_UI_Cross_Areas.ts similarity index 98% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Cross_Areas.ts rename to B06_Section/B06_Section_UI_Cross_Areas.ts index 0b38f4ca..09d62d5d 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Cross_Areas.ts +++ b/B06_Section/B06_Section_UI_Cross_Areas.ts @@ -1,11 +1,11 @@ /* ============================================================================= - * B06_wf3_ProfileCross_UI_Cross_Areas.ts + * B06_Section_UI_Cross_Areas.ts * 횡단 절·성토 면적 readout과 면적 영역 하이라이트 밴드. * * 절토는 암반 경계선(지면선 평행 복사)을 기준으로 위=토사, 아래=암반으로 갈린다. 경계선 * 위치가 곧 유토곡선 EA/RR/BR 비율을 만들므로, 사용자가 경계선을 올리내리면 여기 표시되는 * 면적과 유토곡선이 함께 움직인다. 면적값 산출의 정본은 백엔드 - * (`B06_wf3_ProfileCross_Engine_Design._split_cut_areas`)이고, 이 모듈은 **같은 규칙으로 + * (`B06_Section_Engine_Design._split_cut_areas`)이고, 이 모듈은 **같은 규칙으로 * 영역만 다시 그린다**(수치를 여기서 다시 계산해 표시하지 않는다 — 이중 정의 금지). * * 하이라이트 규칙 (2026-08-02 사용자 지시): @@ -15,8 +15,8 @@ * 700줄 제한 대응으로 `_UI_Cross_Design`(588줄)에서 면적 readout을 이 파일로 옮겨 왔다. * ========================================================================== */ -import type { CrossDesign, SectionSample } from "./B06_wf3_ProfileCross_Api_Fetch"; -import { L, svgElement } from "./B06_wf3_ProfileCross_UI_Section_Common"; +import type { CrossDesign, SectionSample } from "./B06_Section_Api_Fetch"; +import { L, svgElement } from "./B06_Section_UI_Section_Common"; /** * 강조 대상 = 면적표의 칸. `cut_total`은 토사·암반 두 밴드를 함께 켠다. diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Cross_Design.ts b/B06_Section/B06_Section_UI_Cross_Design.ts similarity index 99% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Cross_Design.ts rename to B06_Section/B06_Section_UI_Cross_Design.ts index 251a4148..42282a66 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Cross_Design.ts +++ b/B06_Section/B06_Section_UI_Cross_Design.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B06_wf3_ProfileCross_UI_Cross_Design.ts + * B06_Section_UI_Cross_Design.ts * 측점 표준횡단 설계 지정 컨트롤(지반유형·단면유형·측구위치·측구형식·포장)과 * 설계선·암 경계선·포장층 오버레이. * @@ -23,7 +23,7 @@ import type { GroundType, SectionMode, SectionSample, -} from "./B06_wf3_ProfileCross_Api_Fetch"; +} from "./B06_Section_Api_Fetch"; const SVG_NS = "http://www.w3.org/2000/svg"; diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Cross_View.ts b/B06_Section/B06_Section_UI_Cross_View.ts similarity index 99% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Cross_View.ts rename to B06_Section/B06_Section_UI_Cross_View.ts index 5694c037..2944f9d9 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Cross_View.ts +++ b/B06_Section/B06_Section_UI_Cross_View.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B06_wf3_ProfileCross_UI_Cross_View.ts + * B06_Section_UI_Cross_View.ts * 개별 횡단면 카드 SVG 렌더러와 X:Y 1:1 스케일 지표 계산. * * 700줄 제한 대응으로 기존 단일 렌더러 파일에서 횡단 카드 렌더링만 분리했다. 공통 상수·유틸은 @@ -7,13 +7,13 @@ * 횡단은 종/횡 공통 Y스케일을 쓰지 않고 카드마다 자체 1:1 ppm으로 스케일한다. * ========================================================================== */ -import type { CrossSection, SectionSample } from "./B06_wf3_ProfileCross_Api_Fetch"; +import type { CrossSection, SectionSample } from "./B06_Section_Api_Fetch"; import { appendCrossAreaBands, type AreaHighlightSetter, buildAreaReadout, type CrossAreaKey, -} from "./B06_wf3_ProfileCross_UI_Cross_Areas"; +} from "./B06_Section_UI_Cross_Areas"; import { appendCrossDesignOverlay, appendPavementOverlay, @@ -22,7 +22,7 @@ import { buildRockBoundaryControl, sectionModeLabel, type RockBoundaryControl, -} from "./B06_wf3_ProfileCross_UI_Cross_Design"; +} from "./B06_Section_UI_Cross_Design"; import { CROSS_HEIGHT, CROSS_PAD, @@ -34,7 +34,7 @@ import { svgElement, svgText, validElevation, -} from "./B06_wf3_ProfileCross_UI_Section_Common"; +} from "./B06_Section_UI_Section_Common"; /** * 횡단 카드 요소. 선택 표시와 면적 강조를 **카드를 다시 만들지 않고** 갈아 끼우는 핸들을 단다 diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Longitudinal.ts b/B06_Section/B06_Section_UI_Longitudinal.ts similarity index 98% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Longitudinal.ts rename to B06_Section/B06_Section_UI_Longitudinal.ts index a5340884..77597232 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Longitudinal.ts +++ b/B06_Section/B06_Section_UI_Longitudinal.ts @@ -1,12 +1,12 @@ /* ============================================================================= - * B06_wf3_ProfileCross_UI_Longitudinal.ts + * B06_Section_UI_Longitudinal.ts * 종단면도(지반선·계획선·절성토 음영·측점 마커) SVG 렌더러. * * 700줄 제한 대응으로 기존 단일 렌더러 파일에서 종단 렌더링만 분리했다. 공통 상수·유틸은 * `_UI_Section_Common`을 참조한다. 종단은 종/횡 공통 Y스케일(`YScaleOptions`)을 그대로 쓴다. * ========================================================================== */ -import type { DesignProfile, LongitudinalSection } from "./B06_wf3_ProfileCross_Api_Fetch"; +import type { DesignProfile, LongitudinalSection } from "./B06_Section_Api_Fetch"; import { emptyView, inferStationInterval, @@ -20,7 +20,7 @@ import { svgText, validElevation, type YScaleOptions, -} from "./B06_wf3_ProfileCross_UI_Section_Common"; +} from "./B06_Section_UI_Section_Common"; /** 측점 라벨의 측점번호에 시작 측점 오프셋을 더한다(잔여거리는 그대로). */ function offsetStationLabel(chainageM: number, interval: number, stationOffset: number): string { diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Page.ts b/B06_Section/B06_Section_UI_Page.ts similarity index 97% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Page.ts rename to B06_Section/B06_Section_UI_Page.ts index 133f9a4a..212b33e6 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Page.ts +++ b/B06_Section/B06_Section_UI_Page.ts @@ -29,26 +29,26 @@ import { type SectionContextResponse, type SectionDetailResponse, type StandardCrossSection, -} from "./B06_wf3_ProfileCross_Api_Fetch"; -import { type StationWidthControl } from "./B06_wf3_ProfileCross_UI_Cross_View"; -import { readAlignmentDraft } from "../B05_wf2_Route/B05_wf2_Route_UI_Profile_Edit"; +} from "./B06_Section_Api_Fetch"; +import { type StationWidthControl } from "./B06_Section_UI_Cross_View"; +import { readAlignmentDraft } from "../B05_Profile/B05_Profile_UI_Profile_Edit"; import { type CrossDesignChange, createSectionView, type RockBoundaryControl, -} from "./B06_wf3_ProfileCross_UI_Section_View"; +} from "./B06_Section_UI_Section_View"; import { computeMassHaul, massHaulPayload } from "@util/common_util_mass_haul"; import { computeHaulPlan } from "@util/common_util_mass_haul_balance"; import { balloonOffsetsPayload } from "@util/common_util_mass_haul_balance_view"; -import { designElevationAt } from "./B06_wf3_ProfileCross_UI_Section_Common"; +import { designElevationAt } from "./B06_Section_UI_Section_Common"; import { createStandardPanel, type StandardPanelController, -} from "./B06_wf3_ProfileCross_UI_Standard_Panel"; -import "./B06_wf3_ProfileCross_UI_Style.css"; -import "./B06_wf3_ProfileCross_UI_Style_Cross.css"; -import "./B06_wf3_ProfileCross_UI_Style_Cross_Areas.css"; -import { loadSectionDetail, replaceSectionDetail } from "./B06_wf3_ProfileCross_Section_Store"; +} from "./B06_Section_UI_Standard_Panel"; +import "./B06_Section_UI_Style.css"; +import "./B06_Section_UI_Style_Cross.css"; +import "./B06_Section_UI_Style_Cross_Areas.css"; +import { loadSectionDetail, replaceSectionDetail } from "./B06_Section_Section_Store"; import "@util/common_util_mass_haul.css"; function L(key: keyof typeof ui_locales): string { diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_Common.ts b/B06_Section/B06_Section_UI_Section_Common.ts similarity index 97% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_Common.ts rename to B06_Section/B06_Section_UI_Section_Common.ts index a8fd1a91..6b46112d 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_Common.ts +++ b/B06_Section/B06_Section_UI_Section_Common.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B06_wf3_ProfileCross_UI_Section_Common.ts + * B06_Section_UI_Section_Common.ts * 종·횡단 SVG 렌더러가 공유하는 상수·타입·유틸리티. * * 700줄 제한 대응으로 기존 단일 렌더러 파일에서 공통 부분만 분리했다. 종단 렌더러 @@ -7,13 +7,13 @@ * 이 모듈을 참조한다. 색상 하드코딩 금지 원칙은 그대로이며 여기서는 지오메트리 계산만 다룬다. * ========================================================================== */ -import type { CrossDesignChange } from "./B06_wf3_ProfileCross_UI_Cross_Design"; +import type { CrossDesignChange } from "./B06_Section_UI_Cross_Design"; import type { DesignProfile, LongitudinalSection, SectionDetailResponse, SectionSample, -} from "./B06_wf3_ProfileCross_Api_Fetch"; +} from "./B06_Section_Api_Fetch"; export type { CrossDesignChange }; export type DesignChangeHandler = (chainageM: number, change: CrossDesignChange) => void; diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_View.ts b/B06_Section/B06_Section_UI_Section_View.ts similarity index 98% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_View.ts rename to B06_Section/B06_Section_UI_Section_View.ts index e665f2ad..708f1518 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Section_View.ts +++ b/B06_Section/B06_Section_UI_Section_View.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B06_wf3_ProfileCross_UI_Section_View.ts + * B06_Section_UI_Section_View.ts * 종·횡단 도면 뷰 컨트롤러: 상단 패널(종단면도 + 유토곡선)과 횡단 카드 그리드를 조립하고, * 측점 선택/스크롤, 반응형 폭 측정(ResizeObserver), 패널 높이 조절, 같은 행 높이 통일, * 단건 카드 갱신을 관장한다. @@ -16,25 +16,25 @@ import { createPanelResizer } from "@ui/ui_template_resizer"; import { createWorkflowPanelHandle } from "@ui/ui_template_overlay"; // 가로 스크롤 고정 Y축 — B05와 같은 오버레이를 쓴다(정의처: B05 MassHaul 모듈 + 그 CSS). -import { buildStickyYAxis } from "../B05_wf2_Route/B05_wf2_Route_UI_Profile_MassHaul"; +import { buildStickyYAxis } from "../B05_Profile/B05_Profile_UI_Profile_MassHaul"; import type { CrossSection, EarthworkConversion, HaulEquipmentLimit, SectionDetailResponse, -} from "./B06_wf3_ProfileCross_Api_Fetch"; -import type { RockBoundaryControl } from "./B06_wf3_ProfileCross_UI_Cross_Design"; -import type { CrossAreaKey } from "./B06_wf3_ProfileCross_UI_Cross_Areas"; +} from "./B06_Section_Api_Fetch"; +import type { RockBoundaryControl } from "./B06_Section_UI_Cross_Design"; +import type { CrossAreaKey } from "./B06_Section_UI_Cross_Areas"; import { createCrossSectionCard, crossCardNaturalHeight, type CrossCardElement, type StationWidthControl, -} from "./B06_wf3_ProfileCross_UI_Cross_View"; +} from "./B06_Section_UI_Cross_View"; import { createLongitudinalProfile, longitudinalMinimumWidth, -} from "./B06_wf3_ProfileCross_UI_Longitudinal"; +} from "./B06_Section_UI_Longitudinal"; import { applyLegendToggle, computeMassHaulSeries, @@ -70,7 +70,7 @@ import { longitudinalMaxChainage, LONG_PAD, type YScaleOptions, -} from "./B06_wf3_ProfileCross_UI_Section_Common"; +} from "./B06_Section_UI_Section_Common"; export type { CrossDesignChange, DesignChangeHandler, RockBoundaryControl }; diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Standard_Diagram.ts b/B06_Section/B06_Section_UI_Standard_Diagram.ts similarity index 99% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Standard_Diagram.ts rename to B06_Section/B06_Section_UI_Standard_Diagram.ts index 765028b9..e6c37a58 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Standard_Diagram.ts +++ b/B06_Section/B06_Section_UI_Standard_Diagram.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B06_wf3_ProfileCross_UI_Standard_Diagram.ts + * B06_Section_UI_Standard_Diagram.ts * 표준 횡단면 설정 패널의 "변수 위치 안내" 모식도. * * 설정 패널의 각 편집값(노폭·노견·측구·절토/성토 경사·횡단경사)이 횡단면의 어느 diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Standard_Panel.ts b/B06_Section/B06_Section_UI_Standard_Panel.ts similarity index 98% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Standard_Panel.ts rename to B06_Section/B06_Section_UI_Standard_Panel.ts index 43f0e349..604c515b 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Standard_Panel.ts +++ b/B06_Section/B06_Section_UI_Standard_Panel.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B06_wf3_ProfileCross_UI_Standard_Panel.ts + * B06_Section_UI_Standard_Panel.ts * 좌측 사이드 "표준 횡단면 설정" 패널 (토사 / 암 / 포장 3그룹). * * 각 그룹의 노폭·노견·측구 규격·경사값을 편집한다. 기본값은 백엔드 config @@ -13,14 +13,14 @@ import { currentLanguageIndex, ui_locales } from "@ui/ui_template_locale"; import { createButton, createInputField, createSelectField } from "@ui/ui_template_elements"; -import { buildStandardDiagram } from "./B06_wf3_ProfileCross_UI_Standard_Diagram"; +import { buildStandardDiagram } from "./B06_Section_UI_Standard_Diagram"; import { getCompanyStandard, listCompanyStandards, type StandardCrossGroup, type StandardCrossKey, type StandardCrossSection, -} from "./B06_wf3_ProfileCross_Api_Fetch"; +} from "./B06_Section_Api_Fetch"; function L(key: keyof typeof ui_locales): string { return ui_locales[key][currentLanguageIndex]; diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style.css b/B06_Section/B06_Section_UI_Style.css similarity index 99% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style.css rename to B06_Section/B06_Section_UI_Style.css index ed86e06a..95cacc76 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style.css +++ b/B06_Section/B06_Section_UI_Style.css @@ -1,5 +1,5 @@ /* ============================================================================= - * B06_wf3_ProfileCross_UI_Style.css + * B06_Section_UI_Style.css * 3차 워크플로우(종·횡단 생성) 페이지 전용 스타일. * * 원칙(frontend.md §1): 하드코딩 색상 금지. theme.css 변수(var(--...))만 참조. diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style_Cross.css b/B06_Section/B06_Section_UI_Style_Cross.css similarity index 99% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style_Cross.css rename to B06_Section/B06_Section_UI_Style_Cross.css index 59c14225..c45c3193 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style_Cross.css +++ b/B06_Section/B06_Section_UI_Style_Cross.css @@ -1,5 +1,5 @@ /* ============================================================================= - * B06_wf3_ProfileCross_UI_Style_Cross.css + * B06_Section_UI_Style_Cross.css * 종·횡단 도면 뷰(섹션·카드·차트·설계 컨트롤·줌/팬·오버레이) 스타일. * 700줄 제한 대응으로 _UI_Style.css에서 분리(패널/폼/모식도는 원본 유지). * ========================================================================== */ diff --git a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style_Cross_Areas.css b/B06_Section/B06_Section_UI_Style_Cross_Areas.css similarity index 99% rename from B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style_Cross_Areas.css rename to B06_Section/B06_Section_UI_Style_Cross_Areas.css index 829a3749..bfde1cb6 100644 --- a/B06_wf3_ProfileCross/B06_wf3_ProfileCross_UI_Style_Cross_Areas.css +++ b/B06_Section/B06_Section_UI_Style_Cross_Areas.css @@ -1,5 +1,5 @@ /* ============================================================================= - * B06_wf3_ProfileCross_UI_Style_Cross_Areas.css + * B06_Section_UI_Style_Cross_Areas.css * 횡단 카드의 **면적 오버레이 계열** 스타일 — 절·성토 면적 표, 면적 강조 밴드, * 설계선·암 경계선·포장층, 암 경계선 제어 버튼. * diff --git a/B07_wf4_DesignDetail/B07_wf4_DesignDetail_Router.py b/B07_wf4_DesignDetail/B07_wf4_DesignDetail_Router.py index dfd5acdf..cb0c7228 100644 --- a/B07_wf4_DesignDetail/B07_wf4_DesignDetail_Router.py +++ b/B07_wf4_DesignDetail/B07_wf4_DesignDetail_Router.py @@ -12,9 +12,9 @@ from fastapi import APIRouter from fastapi.responses import JSONResponse from B03_FileInput.B03_FileInput_Repository import get_project_storage_relative_path -from B05_wf2_Route.B05_wf2_Route_Engine_Sections import prune_stale_cross_files -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Engine_Design import compute_cross_design -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Repository import ( +from B05_Profile.B05_Profile_Engine_Sections import prune_stale_cross_files +from B06_Section.B06_Section_Engine_Design import compute_cross_design +from B06_Section.B06_Section_Repository import ( get_confirmed_route_context, get_cross_section_design, get_longitudinal_section, diff --git a/common_util/common_util_drainage_context.py b/common_util/common_util_drainage_context.py index 743d9b59..9bc3b0f3 100644 --- a/common_util/common_util_drainage_context.py +++ b/common_util/common_util_drainage_context.py @@ -21,12 +21,12 @@ from uuid import UUID from pyproj import Transformer from B03_FileInput.B03_FileInput_Repository import get_project_storage_relative_path -from B05_wf2_Route.B05_wf2_Route_Repository import ( +from B05_Profile.B05_Profile_Repository import ( get_latest_route, get_route_points, get_surface_crs_epsg, ) -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Repository import get_longitudinal_section +from B06_Section.B06_Section_Repository import get_longitudinal_section from common_util.common_util_route_geometry import ( RouteVertex, build_route_vertices, diff --git a/common_util/common_util_mass_haul.css b/common_util/common_util_mass_haul.css index b6efa9e4..138dd9da 100644 --- a/common_util/common_util_mass_haul.css +++ b/common_util/common_util_mass_haul.css @@ -1,5 +1,5 @@ /* ============================================================================= - * B06_wf3_ProfileCross_UI_Style_MassHaul.css + * B06_Section_UI_Style_MassHaul.css * 유토곡선(Mass Haul Diagram) 스타일 — 곡선·오버레이 범례·요약줄. * 700줄 제한 대응으로 _UI_Style_Cross.css에서 분리(종·횡단 도면 본체는 원본 유지). * diff --git a/common_util/common_util_mass_haul.ts b/common_util/common_util_mass_haul.ts index cbd0fdc1..bbfbe85c 100644 --- a/common_util/common_util_mass_haul.ts +++ b/common_util/common_util_mass_haul.ts @@ -374,7 +374,7 @@ function crossAreaSamples(sections: MassHaulSection[], minSlope?: number): AreaS * 종단 기준 — 계획고와 지반고의 차이(절토고/성토고)에 노반폭을 곱한 개략 단면적. * * `difference_m = 계획고 − 지반고`이므로 음수면 절토, 양수면 성토다 - * (`B05_wf2_Route_UI_Profile_Alignment.ts`가 이미 쓰는 부호 규약과 같다). + * (`B05_Profile_UI_Profile_Alignment.ts`가 이미 쓰는 부호 규약과 같다). * 노반폭과 지반유형은 종단 샘플에 없으므로 **가장 가까운 설계 측점**에서 가져온다. * 설계된 측점이 하나도 없으면 노반폭을 알 수 없어 곡선을 만들지 않는다. * diff --git a/common_util/common_util_storage.py b/common_util/common_util_storage.py index b2b85eba..a95af11e 100644 --- a/common_util/common_util_storage.py +++ b/common_util/common_util_storage.py @@ -9,9 +9,9 @@ PROJECT_STORAGE_LAYOUT_V2 = ( ("B03_FileInput", "input"), ("B04_PreProcess", "processed"), ("B04_PreProcess", "models"), - ("B05_wf2_Route", "route"), - ("B06_wf3_ProfileCross", "longitudinal"), - ("B06_wf3_ProfileCross", "cross_sections"), + ("B05_Profile", "route"), + ("B06_Section", "longitudinal"), + ("B06_Section", "cross_sections"), ("B07_wf4_DesignDetail", "structures"), ("B08_wf5_Quantity", "quantities"), ("B09_wf6_Estimation", "v1"), diff --git a/config/config_frontend.ts b/config/config_frontend.ts index 508cf0d4..c0de4ce4 100644 --- a/config/config_frontend.ts +++ b/config/config_frontend.ts @@ -85,8 +85,8 @@ export const ROUTES = { B02_PROJ_REGISTER: "b02-proj-register", B03_FILE_INPUT: "b03-file-input", B04_PREPROCESS: "b04-preprocess", - B05_WF2_ROUTE: "b05-wf2-route", - B06_WF3_PROFILE_CROSS: "b06-wf3-profile-cross", + B05_PROFILE: "b05-profile", + B06_SECTION: "b06-section", B07_WF4_DESIGN_DETAIL: "b07-wf4-design-detail", B08_WF5_QUANTITY: "b08-wf5-quantity", B09_WF6_ESTIMATION: "b09-wf6-estimation", @@ -108,8 +108,8 @@ export const PROTECTED_ROUTES: readonly RoutePath[] = [ ROUTES.B02_PROJ_REGISTER, ROUTES.B03_FILE_INPUT, ROUTES.B04_PREPROCESS, - ROUTES.B05_WF2_ROUTE, - ROUTES.B06_WF3_PROFILE_CROSS, + ROUTES.B05_PROFILE, + ROUTES.B06_SECTION, ROUTES.B07_WF4_DESIGN_DETAIL, ROUTES.B08_WF5_QUANTITY, ROUTES.B09_WF6_ESTIMATION, diff --git a/config/config_system.py b/config/config_system.py index 6a16d8e0..e9f8f027 100644 --- a/config/config_system.py +++ b/config/config_system.py @@ -314,7 +314,7 @@ DRAINAGE_ARROW_MIN_COVERAGE = float(os.getenv("DRAINAGE_ARROW_MIN_COVERAGE", "0. # 방향 일치도 하한(원형 평균 결과 길이 0~1). 블록 안 방향이 제각각이면 평균이 무의미하므로 버린다. DRAINAGE_ARROW_MIN_AGREEMENT = float(os.getenv("DRAINAGE_ARROW_MIN_AGREEMENT", "0.7")) # 단계별 검증 산출물은 같은 폴더에 `{번호}_{단계}.geojson` + `manifest.json`으로 쌓인다. -# 파일명 규칙은 B05_wf2_Route_Engine_Watershed_Export.STAGES가 유일한 정의처다. +# 파일명 규칙은 B05_Profile_Engine_Watershed_Export.STAGES가 유일한 정의처다. # ── 확률강우량 (map.wamis.go.kr 등우선도) ── # 전국 공통 등우선 GeoJSON 원본을 이 폴더에 1회 내려받아 영구 캐시한다(약 20~30MB). @@ -406,7 +406,7 @@ FOREST_ROAD_MIN_WIDTH_M = {"trunk": 3.0, "branch": 3.0, "work": 2.5} # 단위: 길이 m, 경사비 수평:수직=ratio:1, 횡단경사 %. # # 이 상수가 **표준 횡단면 기하의 유일한 정의처**다. B06 설정 패널 기본값과 -# 절·성토 단면적 엔진(B06_wf3_ProfileCross_Engine_Design)이 모두 여기를 읽으며, +# 절·성토 단면적 엔진(B06_Section_Engine_Design)이 모두 여기를 읽으며, # 아래 5-4-2의 파생 상수 외에 같은 값을 별도로 정의하지 않는다. # ───────────────────────────────────────────────────────────────────────── STANDARD_CROSS_SECTION = { @@ -688,8 +688,8 @@ PROJECT_STORAGE_STAGE_DIRS = frozenset( { "B03_FileInput", "B04_PreProcess", - "B05_wf2_Route", - "B06_wf3_ProfileCross", + "B05_Profile", + "B06_Section", "B07_wf4_DesignDetail", "B08_wf5_Quantity", "B09_wf6_Estimation", diff --git a/db_management/001_create_schema.sql b/db_management/001_create_schema.sql index eba4f90d..fccce094 100644 --- a/db_management/001_create_schema.sql +++ b/db_management/001_create_schema.sql @@ -292,7 +292,7 @@ CREATE TABLE IF NOT EXISTS routes ( grade_percent JSON, -- [2.5, 1.8, 3.2, ...] 각 구간 경사도 constraints JSON, -- max_grade, min_radius, avoidance_zones algorithm_params JSON, -- cost_weights, ... - route_data_path VARCHAR(500), -- storage/.../B05_wf2_Route/route/... + route_data_path VARCHAR(500), -- storage/.../B05_Profile/route/... computed_at TIMESTAMP NULL DEFAULT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -333,7 +333,7 @@ CREATE TABLE IF NOT EXISTS longitudinal_sections ( route_id INT NOT NULL, -- FK는 later computed_at TIMESTAMP NULL DEFAULT NULL, data JSON, -- chainages, elevations, grades, design_elevations - longitudinal_file_path VARCHAR(500), -- storage/.../B06_wf3_ProfileCross/longitudinal/... + longitudinal_file_path VARCHAR(500), -- storage/.../B06_Section/longitudinal/... status VARCHAR(50) DEFAULT 'DRAFT' -- DRAFT, CONFIRMED ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; @@ -345,7 +345,7 @@ CREATE TABLE IF NOT EXISTS cross_sections ( chainage_m FLOAT, sequence_num INT, data JSON, -- left_slope, right_slope, width_m, cut_volume_m3, fill_volume_m3, structures, notes - cross_section_file_path VARCHAR(500), -- storage/.../B06_wf3_ProfileCross/cross_sections/... + cross_section_file_path VARCHAR(500), -- storage/.../B06_Section/cross_sections/... status VARCHAR(50) DEFAULT 'DRAFT' -- DRAFT, CONFIRMED ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/main.py b/main.py index 52df8aea..562ff9a7 100644 --- a/main.py +++ b/main.py @@ -35,9 +35,9 @@ from B04_PreProcess.B04_PreProcess_Router_GIS import router as b04_surface_gis_r from B04_PreProcess.B04_PreProcess_Router_GIS import tiles_router from B04_PreProcess.B04_PreProcess_Router_Inflow import router as b04_inflow_router from B04_PreProcess.B04_PreProcess_Router_Watershed import router as b04_watershed_router -from B05_wf2_Route.B05_wf2_Route_Router import router as b05_route_router -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Router import router as b06_section_router -from B06_wf3_ProfileCross.B06_wf3_ProfileCross_Router_Confirm import ( +from B05_Profile.B05_Profile_Router import router as b05_route_router +from B06_Section.B06_Section_Router import router as b06_section_router +from B06_Section.B06_Section_Router_Confirm import ( router as b06_section_confirm_router, ) from B07_wf4_DesignDetail.B07_wf4_DesignDetail_Router import router as b07_design_router diff --git a/pyproject.toml b/pyproject.toml index 831e3b93..4b2d5579 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -2,7 +2,7 @@ target-version = "py313" line-length = 100 # 폐기 엔진 보관 폴더는 이동 당시 원본 그대로 두기로 했으므로 린트/포맷 대상에서 뺀다. -extend-exclude = ["B05_wf2_Route/_legacy_watershed"] +extend-exclude = ["B05_Profile/_legacy_watershed"] [tool.ruff.lint] select = ["E", "F", "I"] diff --git a/ui_template/ui_template_locale_b2.ts b/ui_template/ui_template_locale_b2.ts index 1327cd62..862d3544 100644 --- a/ui_template/ui_template_locale_b2.ts +++ b/ui_template/ui_template_locale_b2.ts @@ -1,6 +1,6 @@ /* ============================================================================= * ui_template_locale_b2.ts - * 다국어 사전 — B 그룹 후반부 (B05_wf2_Route ~ B11_Status) + * 다국어 사전 — B 그룹 후반부 (B05_Profile ~ B11_Status) * * 워크플로우 진행 단계 라벨은 ui_template_locale_common.ts 의 WF_Step_* 키를 * 재사용한다 (중복 등록 방지). @@ -11,7 +11,7 @@ import type { LocaleEntry } from "./ui_template_locale_common"; export const ui_locales_b2 = { - /* --- B05_wf2_Route 배수유역도 패널 (하단 패널 안쪽 우측) --- */ + /* --- B05_Profile 배수유역도 패널 (하단 패널 안쪽 우측) --- */ B05_Drainage_Title: ["배수유역도", "Drainage Basins"], B05_Drainage_Layer_Satellite: ["위성사진", "Satellite"], B05_Drainage_Layer_Satellite_Tip: [ @@ -92,7 +92,7 @@ export const ui_locales_b2 = { /* {chainage}=측점 누가거리(m) */ B05_Drainage_Basin_Chainage: ["측점 누가거리 {chainage}m", "Station chainage {chainage}m"], - /* --- B05_wf2_Route 경로 설계 --- */ + /* --- B05_Profile 경로 설계 --- */ B05_Route_Title: ["종단설계", "Profile Design"], B05_Route_Group_Points: ["경로 제어점", "Route Control Points"], B05_Route_Point_BP: ["시점 (BP)", "Begin (BP)"], @@ -150,7 +150,7 @@ export const ui_locales_b2 = { B05_Route_Field_StationLines: ["측점 가로선", "Station cross lines"], B05_Route_Field_StationLabels: ["측점 라벨", "Station labels"], - /* --- B06_wf3_ProfileCross 종·횡단 생성 --- */ + /* --- B06_Section 종·횡단 생성 --- */ B06_Profile_Title: ["횡단설계", "Cross Design"], B06_Profile_Group_Route: ["대상 경로", "Target Route"], B06_Profile_Field_RouteId: ["경로 ID (routes.id)", "Route ID"],