diff --git a/A00_Common/design/logic/design_calc_node.ts b/A00_Common/design/logic/design_calc_node.ts index 8d8f6ddc4..85a063959 100644 --- a/A00_Common/design/logic/design_calc_node.ts +++ b/A00_Common/design/logic/design_calc_node.ts @@ -38,8 +38,8 @@ import { computeMassHaul, massHaulPayload } from "@util/common_util_mass_haul"; import type { MassHaulResult } from "@util/common_util_mass_haul"; import { computeHaulPlan, haulPlanPayload } from "@util/common_util_mass_haul_balance"; import type { RoutePoint } from "../../../B05_Profile/B05_Profile_Api_Fetch"; -import { buildCorridor } from "../../../B05_Profile/B05_Profile_UI_Corridor_Build"; -import { corridorHash, serialize } from "../../../B05_Profile/B05_Profile_UI_Corridor_Envelope"; +import { buildCorridor } from "../../../B05_Profile/logic/B05_Profile_Corridor_Build"; +import { corridorHash, serialize } from "../../../B05_Profile/logic/B05_Profile_Corridor_Envelope"; import type { SectionDetailResponse } from "../../../B06_Section/B06_Section_Api_Fetch"; import { facilityAt, diff --git a/A00_Common/design/logic/design_calc_registry_facility.ts b/A00_Common/design/logic/design_calc_registry_facility.ts index c327f28a2..e12db323e 100644 --- a/A00_Common/design/logic/design_calc_registry_facility.ts +++ b/A00_Common/design/logic/design_calc_registry_facility.ts @@ -224,7 +224,7 @@ export const FACILITY_ROWS: readonly CalcEntry[] = [ outputs: ["3D", "file:corridor"], site: "browser_now", stage: "corridor", - ts: `${B05}B05_Profile_UI_Corridor_Build.ts#buildCorridor`, + ts: `${B05}logic/B05_Profile_Corridor_Build.ts#buildCorridor`, runner: "node:corridor.mesh", pair: null, mirror: [], diff --git a/B05_Profile/B05_Profile_Corridor_Node.ts b/B05_Profile/B05_Profile_Corridor_Node.ts index 013eeb133..9a04c5f4a 100644 --- a/B05_Profile/B05_Profile_Corridor_Node.ts +++ b/B05_Profile/B05_Profile_Corridor_Node.ts @@ -20,8 +20,8 @@ import { readFileSync, writeFileSync } from "node:fs"; import type { SectionDetailResponse } from "../B06_Section/B06_Section_Api_Fetch"; import type { RoutePoint } from "./B05_Profile_Api_Fetch"; -import { buildCorridor } from "./B05_Profile_UI_Corridor_Build"; -import { corridorHash, serialize } from "./B05_Profile_UI_Corridor_Envelope"; +import { buildCorridor } from "./logic/B05_Profile_Corridor_Build"; +import { corridorHash, serialize } from "./logic/B05_Profile_Corridor_Envelope"; interface CorridorNodeInput { detail: SectionDetailResponse; diff --git a/B05_Profile/B05_Profile_Router_Corridor.py b/B05_Profile/B05_Profile_Router_Corridor.py index b662451d1..68f8141e2 100644 --- a/B05_Profile/B05_Profile_Router_Corridor.py +++ b/B05_Profile/B05_Profile_Router_Corridor.py @@ -61,7 +61,7 @@ async def _resolve_project_root(project_id: UUID) -> Path | None: # 저장본 머리에서 열쇠(해시)만 떼어 볼 만큼. 봉투 첫 두 칸이 `version`·`hash` 라 -# (`B05_Profile_UI_Corridor_Envelope.serialize`) 이 안에 반드시 들어온다. +# (`logic/B05_Profile_Corridor_Envelope.serialize`) 이 안에 반드시 들어온다. _HASH_HEAD_BYTES = 4096 _HASH_PATTERN = re.compile(rb'"hash"\s*:\s*"([0-9a-fA-F]+)"') diff --git a/B05_Profile/B05_Profile_UI_Corridor.ts b/B05_Profile/B05_Profile_UI_Corridor.ts index 7549b8d43..3861a5ba0 100644 --- a/B05_Profile/B05_Profile_UI_Corridor.ts +++ b/B05_Profile/B05_Profile_UI_Corridor.ts @@ -25,14 +25,14 @@ import type { SectionDetailResponse } from "../B06_Section/B06_Section_Api_Fetch import { reconcilePagePipeline } from "../A00_Common/design/design_pipeline_page"; import { calcOnServer } from "../A00_Common/design/design_calc_sites"; import type { RoutePoint } from "./B05_Profile_Api_Fetch"; -import type { CorridorBuildResult } from "./B05_Profile_UI_Corridor_Build"; +import type { CorridorBuildResult } from "./logic/B05_Profile_Corridor_Build"; import { buildCorridorOffThread } from "./B05_Profile_UI_Corridor_Worker_Client"; import { corridorHash, ENVELOPE_VERSION, deserialize, type CorridorEnvelope, -} from "./B05_Profile_UI_Corridor_Envelope"; +} from "./logic/B05_Profile_Corridor_Envelope"; /** 구조물별 서피스 대체/삽입 훅 — 별도 지침 후 구현 예정(2026-08-23 범위 제외). */ export interface CorridorStructureHook { diff --git a/B05_Profile/B05_Profile_UI_Corridor_Deform_Structure.ts b/B05_Profile/B05_Profile_UI_Corridor_Deform_Structure.ts index a4f5dfa6b..0c01a5265 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Deform_Structure.ts +++ b/B05_Profile/B05_Profile_UI_Corridor_Deform_Structure.ts @@ -8,8 +8,8 @@ * ========================================================================== */ import type { CrossSection } from "../B06_Section/B06_Section_Api_Fetch"; -import type { CorridorStructure } from "./B05_Profile_UI_Corridor_Structures"; -import { structureSilhouettes } from "./B05_Profile_UI_Corridor_Station_Structure"; +import type { CorridorStructure } from "./logic/B05_Profile_Corridor_Structures"; +import { structureSilhouettes } from "./logic/B05_Profile_Corridor_Station_Structure"; import type { DeformLimit, DeformSide } from "./logic/B05_Profile_UI_Corridor_Deform"; /** 측점 프레임 축(모델 좌표) — 중심 · 좌향 단위 벡터. */ diff --git a/B05_Profile/B05_Profile_UI_Corridor_Loft_Profile.ts b/B05_Profile/B05_Profile_UI_Corridor_Loft_Profile.ts index ab2d759d7..8f8ada7a1 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Loft_Profile.ts +++ b/B05_Profile/B05_Profile_UI_Corridor_Loft_Profile.ts @@ -11,7 +11,7 @@ * ========================================================================== */ import type { CrossSection } from "../B06_Section/B06_Section_Api_Fetch"; -import { classifyStation, pieceKey, type OffsetPoint } from "./B05_Profile_UI_Corridor_Station"; +import { classifyStation, pieceKey, type OffsetPoint } from "./logic/B05_Profile_Corridor_Station"; /** 꺾임으로 남길 단면 꺾임각(도) — 새 방식(`_Deform.ts` BEND_DEG)과 같은 값. */ const BEND_DEG = 8; diff --git a/B05_Profile/B05_Profile_UI_Corridor_Mesh.ts b/B05_Profile/B05_Profile_UI_Corridor_Mesh.ts index b25371a7f..fd8ebf8d5 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Mesh.ts +++ b/B05_Profile/B05_Profile_UI_Corridor_Mesh.ts @@ -19,7 +19,7 @@ import type { CorridorKind, CorridorRibbon, CorridorStructure, -} from "./B05_Profile_UI_Corridor_Build"; +} from "./logic/B05_Profile_Corridor_Build"; /** * 종류별 색 — 지형은 주황~황~녹 고도 램프라 그 대역을 피한다. diff --git a/B05_Profile/B05_Profile_UI_Corridor_Worker.ts b/B05_Profile/B05_Profile_UI_Corridor_Worker.ts index 6c605be99..b2394cf7e 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Worker.ts +++ b/B05_Profile/B05_Profile_UI_Corridor_Worker.ts @@ -9,7 +9,7 @@ import type { RoutePoint } from "./B05_Profile_Api_Fetch"; import type { CrossSection } from "../B06_Section/B06_Section_Api_Fetch"; -import { buildCorridor, type CorridorBuildResult } from "./B05_Profile_UI_Corridor_Build"; +import { buildCorridor, type CorridorBuildResult } from "./logic/B05_Profile_Corridor_Build"; export interface CorridorWorkerRequest { id: number; diff --git a/B05_Profile/B05_Profile_UI_Corridor_Worker_Client.ts b/B05_Profile/B05_Profile_UI_Corridor_Worker_Client.ts index 0f2629266..4925f10d7 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Worker_Client.ts +++ b/B05_Profile/B05_Profile_UI_Corridor_Worker_Client.ts @@ -9,8 +9,8 @@ import { calcOnServer } from "../A00_Common/design/design_calc_sites"; import type { RoutePoint } from "./B05_Profile_Api_Fetch"; import type { CrossSection } from "../B06_Section/B06_Section_Api_Fetch"; -import { buildCorridor, type CorridorBuildResult } from "./B05_Profile_UI_Corridor_Build"; -import { deserialize, type CorridorEnvelope } from "./B05_Profile_UI_Corridor_Envelope"; +import { buildCorridor, type CorridorBuildResult } from "./logic/B05_Profile_Corridor_Build"; +import { deserialize, type CorridorEnvelope } from "./logic/B05_Profile_Corridor_Envelope"; import type { CorridorWorkerRequest, CorridorWorkerResponse, diff --git a/B05_Profile/B05_Profile_UI_Viewer.ts b/B05_Profile/B05_Profile_UI_Viewer.ts index 00eb84fa7..8c148ee27 100644 --- a/B05_Profile/B05_Profile_UI_Viewer.ts +++ b/B05_Profile/B05_Profile_UI_Viewer.ts @@ -17,7 +17,7 @@ import { } from "./B05_Profile_UI_Markers"; import { createCameraRig, type ProjectionKind } from "./B05_Profile_UI_Viewer_Camera"; import { bindMarkerPointerControls } from "./B05_Profile_UI_Viewer_Marker_Input"; -import type { CorridorBuildResult } from "./B05_Profile_UI_Corridor_Build"; +import type { CorridorBuildResult } from "./logic/B05_Profile_Corridor_Build"; import { createViewerCorridor, disposeObject } from "./B05_Profile_UI_Viewer_Corridor"; import { bindStructurePick, diff --git a/B05_Profile/B05_Profile_UI_Viewer_Corridor.ts b/B05_Profile/B05_Profile_UI_Viewer_Corridor.ts index 7f5f2e899..40cb8ea0c 100644 --- a/B05_Profile/B05_Profile_UI_Viewer_Corridor.ts +++ b/B05_Profile/B05_Profile_UI_Viewer_Corridor.ts @@ -10,7 +10,7 @@ import * as THREE from "three"; import type { ModelBounds } from "./B05_Profile_UI_Markers"; -import type { CorridorBuildResult } from "./B05_Profile_UI_Corridor_Build"; +import type { CorridorBuildResult } from "./logic/B05_Profile_Corridor_Build"; import { createCorridorGroup } from "./B05_Profile_UI_Corridor_Mesh"; import { setCorridorBuildSummary } from "./B05_Profile_UI_Viewer_Debug"; import type { TerrainHeightIndex } from "./B05_Profile_UI_Corridor_Terrain"; diff --git a/B05_Profile/B05_Profile_UI_Viewer_Debug.ts b/B05_Profile/B05_Profile_UI_Viewer_Debug.ts index 127163ad8..5dd76c8a8 100644 --- a/B05_Profile/B05_Profile_UI_Viewer_Debug.ts +++ b/B05_Profile/B05_Profile_UI_Viewer_Debug.ts @@ -7,7 +7,7 @@ * 요약 형태만 있으므로 화면 동작에는 영향이 없다. * ========================================================================== */ -import type { CorridorBuildResult } from "./B05_Profile_UI_Corridor_Build"; +import type { CorridorBuildResult } from "./logic/B05_Profile_Corridor_Build"; /** * 격자 재배치·투영선이 리본을 흔들었는지 화면 밖에서 수치로 확인한다(2026-08-26). diff --git a/B05_Profile/CLAUDE.md b/B05_Profile/CLAUDE.md index 406df85e5..a81756a45 100644 --- a/B05_Profile/CLAUDE.md +++ b/B05_Profile/CLAUDE.md @@ -3,7 +3,7 @@ 갈래 지도(앞머리 → 하는 일): - `UI_RouteEdit_*` 노선 편집(노드 · 곡선 · 측점 틀 · 등고선 띠) · `Api_Replan` 그 서버 요청 -- `UI_Corridor_*` 3D 길 모형 · `UI_Viewer*` 3D 화면 +- `UI_Corridor_*` 3D 길 모형 · `logic/Corridor_*` 그 계산 · `UI_Viewer*` 3D 화면 - `UI_Profile_*` 종단도(계획선 · 끌기 · 표 · 유토곡선) · `UI_Structures_*` · `Structures_*.py` 구조물 - `UI_Drainage_*` 배수유역 칸 · 관 · 시설 · `UI_Page_*` · `UI_Panel_*` 페이지 틀 · 좌측 칸 · `Api_*` 서버 요청 - `Engine_Grade*` 종단 계획선 · `Engine_Sections*` 측점 · 종횡단 생성 · `Engine_RouteInitial*` 노선 추천 · `Engine_AsPlanned` 노선 그대로 · `Router_*` API @@ -19,7 +19,7 @@ 서버 Node 묶음: -- 입구 `B05_Profile_Corridor_Node.ts`(package.json `build:corridor`) · 끌어감 = `UI_Corridor_*`(Build · Envelope · Frames · Station · Structures) · B06 `UI_Cross_*` 구조물(화면 · 세션 안 끔 · `test_472_3_calc_registry.py`) +- 입구 `B05_Profile_Corridor_Node.ts`(package.json `build:corridor`) · 끌어감 = `logic/Corridor_*`(Build · Envelope · Station · Structures) · `logic/UI_Corridor_Frames` · B06 `UI_Cross_*` 구조물(화면 · 세션 안 끔 · `test_472_3_calc_registry.py`) - `build:b07-extent` · `build:b07-note` 가 `Api_Structures` · `Api_Pipes_Draft` · `UI_Structures_Balloon` · `UI_Structures_Define` 를 끌어감 - 묶음이 끄는 TS 를 고치면 그 build 다시 지어 시험 · 그 파일 모듈 맨 위에 DOM · window · sessionStorage 금지 diff --git a/B05_Profile/B05_Profile_UI_Corridor_Build.ts b/B05_Profile/logic/B05_Profile_Corridor_Build.ts similarity index 97% rename from B05_Profile/B05_Profile_UI_Corridor_Build.ts rename to B05_Profile/logic/B05_Profile_Corridor_Build.ts index 610c8a0e9..00fa50dd3 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Build.ts +++ b/B05_Profile/logic/B05_Profile_Corridor_Build.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_Profile_UI_Corridor_Build.ts + * B05_Profile_Corridor_Build.ts * 계획노선 코리도(3D 예상형상) **순수 기하 빌더** — Three.js 의존 없음. * * 입력: 종횡단 상세(SectionDetailResponse)의 측점별 설계선(design_line)과 @@ -12,8 +12,8 @@ * 프레임을 삽입하고 단면을 파라메트릭 보간해 곡선 구간이 각지지 않게 한다. * ========================================================================== */ -import type { RoutePoint } from "./B05_Profile_Api_Fetch"; -import type { CrossSection } from "../B06_Section/B06_Section_Api_Fetch"; +import type { RoutePoint } from "../B05_Profile_Api_Fetch"; +import type { CrossSection } from "../../B06_Section/B06_Section_Api_Fetch"; import { classifyStation, mixedGround, @@ -26,9 +26,9 @@ import { type OffsetPoint, type StationPieces, type XY, -} from "./B05_Profile_UI_Corridor_Station"; +} from "./B05_Profile_Corridor_Station"; -export type { CorridorKind, CorridorSide } from "./B05_Profile_UI_Corridor_Station"; +export type { CorridorKind, CorridorSide } from "./B05_Profile_Corridor_Station"; import { bracketControls, buildPieceControls, @@ -38,21 +38,21 @@ import { lerpPoints, slerpLeft, type PieceControl, -} from "./logic/B05_Profile_UI_Corridor_Frames"; -import { buildCorridorStructures, type RouteFrame } from "./B05_Profile_UI_Corridor_Structures"; -export type { CorridorStructure, StructureFrame } from "./B05_Profile_UI_Corridor_Structures"; +} from "./B05_Profile_UI_Corridor_Frames"; +import { buildCorridorStructures, type RouteFrame } from "./B05_Profile_Corridor_Structures"; +export type { CorridorStructure, StructureFrame } from "./B05_Profile_Corridor_Structures"; import type { CorridorBuildResult, CorridorCap, CorridorRibbon, -} from "./logic/B05_Profile_UI_Corridor_Build_Types"; +} from "./B05_Profile_UI_Corridor_Build_Types"; // 결과 자료형은 `_Build_Types` 에 있다(2026-09-02 분리) — 호출부 경로 유지를 위해 재수출. export type { CorridorBuildResult, CorridorCap, CorridorRibbon, -} from "./logic/B05_Profile_UI_Corridor_Build_Types"; -import { structureSilhouettes } from "./B05_Profile_UI_Corridor_Station_Structure"; +} from "./B05_Profile_UI_Corridor_Build_Types"; +import { structureSilhouettes } from "./B05_Profile_Corridor_Station_Structure"; /** 종방향 세분 간격(m) — 곡선 각짐 방지(2026-08-23 사용자: 노선 폴리라인 따라 세분). * 평면 궤적을 스플라인으로 잇게 되어(2026-08-23) 0.1m까지 쪼갤 이유가 없어졌다 — diff --git a/B05_Profile/B05_Profile_UI_Corridor_Envelope.ts b/B05_Profile/logic/B05_Profile_Corridor_Envelope.ts similarity index 98% rename from B05_Profile/B05_Profile_UI_Corridor_Envelope.ts rename to B05_Profile/logic/B05_Profile_Corridor_Envelope.ts index ab489928a..ea790e811 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Envelope.ts +++ b/B05_Profile/logic/B05_Profile_Corridor_Envelope.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_Profile_UI_Corridor_Envelope.ts + * B05_Profile_Corridor_Envelope.ts * 코리도 저장본 형식 — 버전·해시·직렬화 한 벌. **브라우저와 서버가 같은 것을 쓴다.** * * 서버(전처리 체인 끝)가 같은 빌더로 코리도를 미리 만들어 저장하므로(2026-09-04 사용자 @@ -10,13 +10,10 @@ * 원래 `_UI_Corridor.ts` 안에 있던 것을 그대로 옮겼다(2026-09-04 분리, 내용 불변). * ========================================================================== */ -import type { SectionDetailResponse } from "../B06_Section/B06_Section_Api_Fetch"; -import type { RoutePoint } from "./B05_Profile_Api_Fetch"; -import type { - CorridorBuildResult, - CorridorRibbon, -} from "./logic/B05_Profile_UI_Corridor_Build_Types"; -import { structureHashParts } from "./B05_Profile_UI_Corridor_Structures"; +import type { SectionDetailResponse } from "../../B06_Section/B06_Section_Api_Fetch"; +import type { RoutePoint } from "../B05_Profile_Api_Fetch"; +import type { CorridorBuildResult, CorridorRibbon } from "./B05_Profile_UI_Corridor_Build_Types"; +import { structureHashParts } from "./B05_Profile_UI_Corridor_Structures_Hash"; /** * 저장본 **형식(스키마)** 버전 — 담는 필드가 바뀔 때만 올린다. diff --git a/B05_Profile/B05_Profile_UI_Corridor_Station.ts b/B05_Profile/logic/B05_Profile_Corridor_Station.ts similarity index 99% rename from B05_Profile/B05_Profile_UI_Corridor_Station.ts rename to B05_Profile/logic/B05_Profile_Corridor_Station.ts index 611f952b2..ae3df0043 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Station.ts +++ b/B05_Profile/logic/B05_Profile_Corridor_Station.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_Profile_UI_Corridor_Station.ts + * B05_Profile_Corridor_Station.ts * 코리도 측점 분류 · 행 지반 트림 유틸 (Build에서 분리 — 700줄 제한). * * classifyStation: 측점 하나의 design_line을 종류별(차도/노견/측구/절·성토 비탈) @@ -9,8 +9,8 @@ * (2026-08-23 사용자 지시)의 핵심. * ========================================================================== */ -import type { CrossSection } from "../B06_Section/B06_Section_Api_Fetch"; -import { structureSilhouettes } from "./B05_Profile_UI_Corridor_Station_Structure"; +import type { CrossSection } from "../../B06_Section/B06_Section_Api_Fetch"; +import { structureSilhouettes } from "./B05_Profile_Corridor_Station_Structure"; export type CorridorKind = "carriageway" | "shoulder" | "ditch" | "cut" | "fill"; export type CorridorSide = "left" | "right" | "center"; diff --git a/B05_Profile/B05_Profile_UI_Corridor_Station_Structure.ts b/B05_Profile/logic/B05_Profile_Corridor_Station_Structure.ts similarity index 98% rename from B05_Profile/B05_Profile_UI_Corridor_Station_Structure.ts rename to B05_Profile/logic/B05_Profile_Corridor_Station_Structure.ts index cac55c2ca..86c3384e1 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Station_Structure.ts +++ b/B05_Profile/logic/B05_Profile_Corridor_Station_Structure.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_Profile_UI_Corridor_Station_Structure.ts + * B05_Profile_Corridor_Station_Structure.ts * BOX암거·세월교 측점의 **비탈 실루엣**(성토·절토 한 줄)과 종방향 점유 구간. * `_Corridor_Station.ts`가 배수관 세트에 쓰던 규칙을 두 구조물에도 그대로 태운다 * (2026-08-25 사용자: 3D에 성토선 반영이 안 돼 탑뷰에서 구조물이 안 보인다). @@ -12,16 +12,16 @@ * 좌표 규약: +offset = 좌측. 점 배열은 항상 **도로측 → 바깥** 순서다. * ========================================================================== */ -import type { CrossSection } from "../B06_Section/B06_Section_Api_Fetch"; -import type { OffsetPoint } from "./B05_Profile_UI_Corridor_Station"; +import type { CrossSection } from "../../B06_Section/B06_Section_Api_Fetch"; +import type { OffsetPoint } from "./B05_Profile_Corridor_Station"; import { basinSpanOf, boxLayoutOf, culvertLayoutOf, fordLayoutOf, wallSpanOf, -} from "./B05_Profile_UI_Corridor_Structures"; -import { groundInterpolator } from "../B06_Section/logic/B06_Section_UI_Cross_Culvert_Solve"; +} from "./B05_Profile_Corridor_Structures"; +import { groundInterpolator } from "../../B06_Section/logic/B06_Section_UI_Cross_Culvert_Solve"; /** 한 측의 구조물 실루엣 — 비탈 조각을 이걸로 갈아 끼운다. */ export interface StructureSilhouette { diff --git a/B05_Profile/B05_Profile_UI_Corridor_Structures.ts b/B05_Profile/logic/B05_Profile_Corridor_Structures.ts similarity index 94% rename from B05_Profile/B05_Profile_UI_Corridor_Structures.ts rename to B05_Profile/logic/B05_Profile_Corridor_Structures.ts index fbdeb6050..17c6e0e0a 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Structures.ts +++ b/B05_Profile/logic/B05_Profile_Corridor_Structures.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_Profile_UI_Corridor_Structures.ts + * B05_Profile_Corridor_Structures.ts * 배수관 세트(배관·기슭막이·집수정) **3D 예상형상 솔리드** 계산 — 순수 기하, * Three.js 무의존(2026-08-23 사용자 지시: 3D가 B06 횡단을 그대로 따르게). * @@ -20,41 +20,44 @@ * 폴리곤을 갈아 끼워(`polygons`) 측점 사이를 Catmull-Rom으로 잇는다. 벽은 여전히 하나다. * ========================================================================== */ -import { structureHashParts, wallSweepAt } from "./logic/B05_Profile_UI_Corridor_Structures_Hash"; -import type { CrossSection, CulvertSideSpec } from "../B06_Section/B06_Section_Api_Fetch"; -import { computeCulvertLayout } from "../B06_Section/B06_Section_UI_Cross_Culvert"; +import { structureHashParts, wallSweepAt } from "./B05_Profile_UI_Corridor_Structures_Hash"; +import type { CrossSection, CulvertSideSpec } from "../../B06_Section/B06_Section_Api_Fetch"; +import { computeCulvertLayout } from "../../B06_Section/B06_Section_UI_Cross_Culvert"; import { culvertOwnerFor, ownWallsDrawAt, restrictToSide, tierSpanOf, -} from "../B06_Section/B06_Section_UI_Cross_Culvert_Wire"; -import { pipeWallThicknessM } from "../B06_Section/logic/B06_Section_UI_Cross_Culvert_Const"; -import type { CulvertLayout } from "../B06_Section/B06_Section_UI_Cross_Culvert"; -import { computeFordLayout, fordAdjustOf } from "../B06_Section/B06_Section_UI_Cross_Ford"; -import type { FordLayout } from "../B06_Section/B06_Section_UI_Cross_Ford"; +} from "../../B06_Section/B06_Section_UI_Cross_Culvert_Wire"; +import { pipeWallThicknessM } from "../../B06_Section/logic/B06_Section_UI_Cross_Culvert_Const"; +import type { CulvertLayout } from "../../B06_Section/B06_Section_UI_Cross_Culvert"; +import { computeFordLayout, fordAdjustOf } from "../../B06_Section/B06_Section_UI_Cross_Ford"; +import type { FordLayout } from "../../B06_Section/B06_Section_UI_Cross_Ford"; import { boreBandAt, boreRingChainages, boxSolids, splitByBand, -} from "./B05_Profile_UI_Corridor_Structures_Box"; -import type { SectionPolygon } from "./B05_Profile_UI_Corridor_Structures_Box"; -import { computeBoxLayout, DEFAULT_BOX_SIDE_ADJUST } from "../B06_Section/B06_Section_UI_Cross_Box"; -import type { BoxAdjust, BoxLayout } from "../B06_Section/B06_Section_UI_Cross_Box"; -import { buildWingSolids } from "./logic/B05_Profile_UI_Corridor_Structures_Wing"; +} from "./B05_Profile_Corridor_Structures_Box"; +import type { SectionPolygon } from "./B05_Profile_Corridor_Structures_Box"; +import { + computeBoxLayout, + DEFAULT_BOX_SIDE_ADJUST, +} from "../../B06_Section/B06_Section_UI_Cross_Box"; +import type { BoxAdjust, BoxLayout } from "../../B06_Section/B06_Section_UI_Cross_Box"; +import { buildWingSolids } from "./B05_Profile_UI_Corridor_Structures_Wing"; import { buildWallPath, detachedControlsOf, polygonAt, storedAdjusts, type WallPath, -} from "./B05_Profile_UI_Corridor_Structures_Path"; -import { computeRevetmentLayout } from "../B06_Section/B06_Section_UI_Cross_Revetment"; -import { withoutGuardedFill } from "../B06_Section/B06_Section_UI_Cross_Body_Guard"; -import { chuteBands, fordPavementChute } from "./B05_Profile_UI_Corridor_Structures_Chute"; -import { isChuteSegment } from "../B06_Section/B06_Section_UI_Cross_Wall_Hatch"; -import { builds, culvertBody, ownsBody } from "./logic/B05_Profile_UI_Corridor_Structures_Pick"; +} from "./B05_Profile_Corridor_Structures_Path"; +import { computeRevetmentLayout } from "../../B06_Section/B06_Section_UI_Cross_Revetment"; +import { withoutGuardedFill } from "../../B06_Section/B06_Section_UI_Cross_Body_Guard"; +import { chuteBands, fordPavementChute } from "./B05_Profile_Corridor_Structures_Chute"; +import { isChuteSegment } from "../../B06_Section/B06_Section_UI_Cross_Wall_Hatch"; +import { builds, culvertBody, ownsBody } from "./B05_Profile_UI_Corridor_Structures_Pick"; /** 스윕 프레임 하나 — 노선 위 한 지점의 중심 XY·좌향 단위벡터와 종단 표고 오프셋. */ export interface StructureFrame { @@ -693,6 +696,3 @@ export function buildCorridorStructures( } return solids; } - -// 해시 요약은 `_Structures_Hash.ts` 에 있다(2026-09-02 분리) — 호출부 경로 유지를 위해 재수출. -export { structureHashParts } from "./logic/B05_Profile_UI_Corridor_Structures_Hash"; diff --git a/B05_Profile/B05_Profile_UI_Corridor_Structures_Box.ts b/B05_Profile/logic/B05_Profile_Corridor_Structures_Box.ts similarity index 96% rename from B05_Profile/B05_Profile_UI_Corridor_Structures_Box.ts rename to B05_Profile/logic/B05_Profile_Corridor_Structures_Box.ts index 347f64537..63685f857 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Structures_Box.ts +++ b/B05_Profile/logic/B05_Profile_Corridor_Structures_Box.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_Profile_UI_Corridor_Structures_Box.ts + * B05_Profile_Corridor_Structures_Box.ts * BOX암거 3D 솔리드와 **관통 보어(구멍)** 계산 — 구조물 본체 * (`_UI_Corridor_Structures.ts`)에서 700줄 제한으로 분리했다(2026-08-25). * @@ -11,12 +11,12 @@ * 링 토폴로지가 항상 같아 스티칭이 단순하고, 눌린 구간은 면적 0이라 겹침이 없다. * ========================================================================== */ -import type { CrossSection } from "../B06_Section/B06_Section_Api_Fetch"; -import { computeBoxLayout } from "../B06_Section/B06_Section_UI_Cross_Box"; -import type { BoxAdjust } from "../B06_Section/B06_Section_UI_Cross_Box"; -import type { CorridorStructure, StructureFrame } from "./B05_Profile_UI_Corridor_Structures"; -import { buildWingSolids } from "./logic/B05_Profile_UI_Corridor_Structures_Wing"; -import { chuteBands } from "./B05_Profile_UI_Corridor_Structures_Chute"; +import type { CrossSection } from "../../B06_Section/B06_Section_Api_Fetch"; +import { computeBoxLayout } from "../../B06_Section/B06_Section_UI_Cross_Box"; +import type { BoxAdjust } from "../../B06_Section/B06_Section_UI_Cross_Box"; +import type { CorridorStructure, StructureFrame } from "./B05_Profile_Corridor_Structures"; +import { buildWingSolids } from "./B05_Profile_UI_Corridor_Structures_Wing"; +import { chuteBands } from "./B05_Profile_Corridor_Structures_Chute"; /** 단면 폴리곤 한 장 — [offset, elevation] 목록. */ export type SectionPolygon = Array<[number, number]>; diff --git a/B05_Profile/B05_Profile_UI_Corridor_Structures_Chute.ts b/B05_Profile/logic/B05_Profile_Corridor_Structures_Chute.ts similarity index 88% rename from B05_Profile/B05_Profile_UI_Corridor_Structures_Chute.ts rename to B05_Profile/logic/B05_Profile_Corridor_Structures_Chute.ts index cedbba41f..e69e0cb05 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Structures_Chute.ts +++ b/B05_Profile/logic/B05_Profile_Corridor_Structures_Chute.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_Profile_UI_Corridor_Structures_Chute.ts + * B05_Profile_Corridor_Structures_Chute.ts * 3D **도수로 · 돌붙임 띠** 단면(계획서 135-3) — 순수 기하, Three.js 무의존. * * · 단면 = B06 횡단 띠와 같은 계산(`chuteBandOutline`) — 유출 성토 조각(사면선)을 사면 안쪽으로 @@ -8,14 +8,14 @@ * 물넘이 포장 = 포장 폭. 스윕은 `_Structures.ts` 가 벽과 같은 규칙으로 한다. * ========================================================================== */ -import type { ChuteSpec, CrossSection } from "../B06_Section/B06_Section_Api_Fetch"; -import type { OffsetPoint } from "../B06_Section/B06_Section_UI_Cross_Culvert_Types"; +import type { ChuteSpec, CrossSection } from "../../B06_Section/B06_Section_Api_Fetch"; +import type { OffsetPoint } from "../../B06_Section/B06_Section_UI_Cross_Culvert_Types"; import { chuteBandOutline, chuteRun, groundLine, -} from "../B06_Section/B06_Section_UI_Cross_Wall_Hatch"; -import { outletFillLine } from "../B06_Section/B06_Section_UI_Cross_Ford_Pavement"; +} from "../../B06_Section/B06_Section_UI_Cross_Wall_Hatch"; +import { outletFillLine } from "../../B06_Section/B06_Section_UI_Cross_Ford_Pavement"; /** 성토 조각 하나 — B06 오버레이가 띠를 그리는 선(절토 조각은 뺀다). */ interface FillSegment { diff --git a/B05_Profile/B05_Profile_UI_Corridor_Structures_Path.ts b/B05_Profile/logic/B05_Profile_Corridor_Structures_Path.ts similarity index 93% rename from B05_Profile/B05_Profile_UI_Corridor_Structures_Path.ts rename to B05_Profile/logic/B05_Profile_Corridor_Structures_Path.ts index 1ae8dd7a6..17d438251 100644 --- a/B05_Profile/B05_Profile_UI_Corridor_Structures_Path.ts +++ b/B05_Profile/logic/B05_Profile_Corridor_Structures_Path.ts @@ -1,5 +1,5 @@ /* ============================================================================= - * B05_Profile_UI_Corridor_Structures_Path.ts + * B05_Profile_Corridor_Structures_Path.ts * 기슭막이 **벽 경로선** — 연동을 푼 측점이 있을 때 벽이 노선과 평행하지 않고 자기 * 경로를 따라가도록, 측점별 단면 폴리곤을 링마다 보간한다(2026-08-30 사용자 확정: * "연동은 분리가 아니다 — 하나의 기슭막이가 스플라인 형태의 경로를 따라간다"). @@ -10,17 +10,17 @@ * 소유 측점 폴리곤 하나로 고정(종전 동작)된다. * ========================================================================== */ -import type { CrossSection } from "../B06_Section/B06_Section_Api_Fetch"; -import type { CulvertLayout } from "../B06_Section/B06_Section_UI_Cross_Culvert"; -import { computeCulvertLayout } from "../B06_Section/B06_Section_UI_Cross_Culvert"; -import { bodyAbsolute } from "../B06_Section/B06_Section_UI_Cross_Body_Guard"; -import type { WallAdjust } from "../B06_Section/B06_Section_UI_Cross_Culvert_Types"; -import { ZERO_ADJUST } from "../B06_Section/B06_Section_UI_Cross_Culvert_Types"; +import type { CrossSection } from "../../B06_Section/B06_Section_Api_Fetch"; +import type { CulvertLayout } from "../../B06_Section/B06_Section_UI_Cross_Culvert"; +import { computeCulvertLayout } from "../../B06_Section/B06_Section_UI_Cross_Culvert"; +import { bodyAbsolute } from "../../B06_Section/B06_Section_UI_Cross_Body_Guard"; +import type { WallAdjust } from "../../B06_Section/B06_Section_UI_Cross_Culvert_Types"; +import { ZERO_ADJUST } from "../../B06_Section/B06_Section_UI_Cross_Culvert_Types"; import { culvertOwnerFor, culvertReach, restrictToSide, -} from "../B06_Section/B06_Section_UI_Cross_Culvert_Wire"; +} from "../../B06_Section/B06_Section_UI_Cross_Culvert_Wire"; /** 단면 폴리곤 [offset, 표고][] — 코리도 솔리드가 쓰는 그 형식. */ export type SectionPolygon = Array<[number, number]>; diff --git a/B05_Profile/logic/B05_Profile_UI_Corridor_Build_Types.ts b/B05_Profile/logic/B05_Profile_UI_Corridor_Build_Types.ts index e6cdec212..3e035887e 100644 --- a/B05_Profile/logic/B05_Profile_UI_Corridor_Build_Types.ts +++ b/B05_Profile/logic/B05_Profile_UI_Corridor_Build_Types.ts @@ -2,14 +2,14 @@ * B05_Profile_UI_Corridor_Build_Types.ts * 코리도 빌더가 내는 **결과 자료형** — 리본·캡·빌드 결과. * - * `B05_Profile_UI_Corridor_Build` 에서 떼어냈다(700줄 제한, 2026-09-02). 계산은 전혀 + * `B05_Profile_Corridor_Build` 에서 떼어냈다(700줄 제한, 2026-09-02). 계산은 전혀 * 없고 모양과 그 뜻(주석)만 있다. 빌더가 그대로 다시 내보내므로 기존 import 경로 - * (`... from "./B05_Profile_UI_Corridor_Build"`)는 전부 유효하다. + * (`... from "./B05_Profile_Corridor_Build"`)는 전부 유효하다. * ========================================================================== */ import type { CrossSection } from "../../B06_Section/B06_Section_Api_Fetch"; -import type { CorridorKind, CorridorSide } from "../B05_Profile_UI_Corridor_Station"; -import type { CorridorStructure } from "../B05_Profile_UI_Corridor_Structures"; +import type { CorridorKind, CorridorSide } from "./B05_Profile_Corridor_Station"; +import type { CorridorStructure } from "./B05_Profile_Corridor_Structures"; export interface CorridorRibbon { kind: CorridorKind; diff --git a/B05_Profile/logic/B05_Profile_UI_Corridor_Frames.ts b/B05_Profile/logic/B05_Profile_UI_Corridor_Frames.ts index 6a7af5459..8f4cd6450 100644 --- a/B05_Profile/logic/B05_Profile_UI_Corridor_Frames.ts +++ b/B05_Profile/logic/B05_Profile_UI_Corridor_Frames.ts @@ -10,7 +10,7 @@ * 테이퍼가 생긴다. 접속 길이 기준 = **인접 측점까지**(2026-08-24 사용자 확정). * ========================================================================== */ -import type { OffsetPoint, StationPieces, XY } from "../B05_Profile_UI_Corridor_Station"; +import type { OffsetPoint, StationPieces, XY } from "./B05_Profile_Corridor_Station"; import type { RoutePoint } from "../B05_Profile_Api_Fetch"; /** 제어점 하나 — 그 누가거리에서 쓸 단면과 출처. */ diff --git a/B05_Profile/logic/B05_Profile_UI_Corridor_Structures_Hash.ts b/B05_Profile/logic/B05_Profile_UI_Corridor_Structures_Hash.ts index d2618748d..ca228d4eb 100644 --- a/B05_Profile/logic/B05_Profile_UI_Corridor_Structures_Hash.ts +++ b/B05_Profile/logic/B05_Profile_UI_Corridor_Structures_Hash.ts @@ -4,7 +4,7 @@ * * 지문 = 그 측점 그림 자료(형상 얹기 한 벌 `SHAPE_KEYS` · 카드 · 상세 창 · B07 · 3D 가 같은 목록) + 형상을 * 바꾸는 조작값 통째를 키 차례 고정 글로 — 손으로 고른 칸 목록(빠뜨린 칸 = 「고쳐도 3D 가 안 바뀜」)을 걷음. - * 원래 파일(`B05_Profile_UI_Corridor_Structures`)이 그대로 다시 내보내므로 기존 import 경로는 유효하다. + * 쓰는 곳 = `B05_Profile_Corridor_Structures` · `B05_Profile_Corridor_Envelope`. * ========================================================================== */ import type { CrossSection } from "../../B06_Section/B06_Section_Api_Fetch"; diff --git a/B05_Profile/logic/B05_Profile_UI_Corridor_Structures_Pick.ts b/B05_Profile/logic/B05_Profile_UI_Corridor_Structures_Pick.ts index 7d03eb79c..fbc9af72c 100644 --- a/B05_Profile/logic/B05_Profile_UI_Corridor_Structures_Pick.ts +++ b/B05_Profile/logic/B05_Profile_UI_Corridor_Structures_Pick.ts @@ -2,7 +2,7 @@ * B05_Profile_UI_Corridor_Structures_Pick.ts * 3D 몸체 고르기(322-1) — 그림 자료 열쇠(`culvert` · `box` · `ford` · `ford_pavement` · `revetment`)의 주인 * 종류가 구조물 표 3D 부품으로 그 몸체를 세우는가. 지금 처음값 = 지금 결과 그대로(표가 끈 것만 빠짐). - * 쓰는 곳 = `B05_Profile_UI_Corridor_Structures.buildCorridorStructures`. + * 쓰는 곳 = `B05_Profile_Corridor_Structures.buildCorridorStructures`. * ========================================================================== */ import type { CrossSection } from "../../B06_Section/B06_Section_Api_Fetch"; diff --git a/B05_Profile/logic/B05_Profile_UI_Corridor_Structures_Wing.ts b/B05_Profile/logic/B05_Profile_UI_Corridor_Structures_Wing.ts index c0d3685f3..7ab79ffd4 100644 --- a/B05_Profile/logic/B05_Profile_UI_Corridor_Structures_Wing.ts +++ b/B05_Profile/logic/B05_Profile_UI_Corridor_Structures_Wing.ts @@ -17,8 +17,8 @@ import type { CorridorStructure, RouteFrame, StructureFrame, -} from "../B05_Profile_UI_Corridor_Structures"; -import type { SectionPolygon } from "../B05_Profile_UI_Corridor_Structures_Box"; +} from "./B05_Profile_Corridor_Structures"; +import type { SectionPolygon } from "./B05_Profile_Corridor_Structures_Box"; /** 날개벽이 붙는 구조물 한쪽 끝 — 좌·우 각각 하나. */ export interface WingAnchor { diff --git a/B05_Profile/logic/B05_Profile_UI_Corridor_Tin_Design.ts b/B05_Profile/logic/B05_Profile_UI_Corridor_Tin_Design.ts index 934b72266..a367d2233 100644 --- a/B05_Profile/logic/B05_Profile_UI_Corridor_Tin_Design.ts +++ b/B05_Profile/logic/B05_Profile_UI_Corridor_Tin_Design.ts @@ -7,7 +7,7 @@ * 옛 제안 ② 설계(변형 장에서 · buildTinDesign)는 `Old/` 에. * ========================================================================== */ -import type { CorridorStructure } from "../B05_Profile_UI_Corridor_Structures"; +import type { CorridorStructure } from "./B05_Profile_Corridor_Structures"; import type { Pslg } from "./B05_Profile_UI_Corridor_Tin_Pslg"; /** 단면 행 걸음(m) — 측점 사이 보간 단면. */ diff --git a/resources/tester/helper_115_8_corridor_loft.cjs b/resources/tester/helper_115_8_corridor_loft.cjs index 5102f7cf0..0515c00de 100644 --- a/resources/tester/helper_115_8_corridor_loft.cjs +++ b/resources/tester/helper_115_8_corridor_loft.cjs @@ -39,7 +39,7 @@ const { loadTs } = makeLoader({ }); const B05 = (name) => path.join(ROOT, "B05_Profile", `${name}.ts`); -const { buildCorridor } = loadTs(B05("B05_Profile_UI_Corridor_Build")); +const { buildCorridor } = loadTs(B05("logic/B05_Profile_Corridor_Build")); const { loftTerrain } = loadTs(B05("B05_Profile_UI_Corridor_Loft")); const { pairProfiles } = loadTs(B05("B05_Profile_UI_Corridor_Loft_Profile")); const { selfCrossings } = loadTs(B05("logic/B05_Profile_UI_Corridor_Loft_Toe")); diff --git a/resources/tester/helper_135_3_chute_solid.cjs b/resources/tester/helper_135_3_chute_solid.cjs index 5cb934254..b09cd7a76 100644 --- a/resources/tester/helper_135_3_chute_solid.cjs +++ b/resources/tester/helper_135_3_chute_solid.cjs @@ -29,7 +29,7 @@ const { loadTs } = makeLoader({ const B05 = (f) => path.join(ROOT, "B05_Profile", `${f}.ts`); const B06 = (f) => path.join(ROOT, "B06_Section", `${f}.ts`); -const { buildCorridorStructures } = loadTs(B05("B05_Profile_UI_Corridor_Structures")); +const { buildCorridorStructures } = loadTs(B05("logic/B05_Profile_Corridor_Structures")); const { structureHashParts } = loadTs(B05("logic/B05_Profile_UI_Corridor_Structures_Hash")); const { structureTopLoops } = loadTs(B05("logic/B05_Profile_UI_Corridor_Tin_Design")); const { chuteBandOutline, isChuteSegment } = loadTs(B06("B06_Section_UI_Cross_Wall_Hatch")); @@ -161,7 +161,7 @@ function check(name, section, expectedBands, expectedLength, strip) { delete s.culvert.body; s.culvert.hidden_pipe = false; s.culvert.chute = CHUTE; - const { culvertLayoutOf } = loadTs(B05("B05_Profile_UI_Corridor_Structures")); + const { culvertLayoutOf } = loadTs(B05("logic/B05_Profile_Corridor_Structures")); const layout = culvertLayoutOf(s); const bands = (layout?.outletFill.segments ?? []) .filter(isChuteSegment) // 묻힌 끝 3도 절토 조각도(152-3) diff --git a/resources/tester/helper_152_3_chute_cut.cjs b/resources/tester/helper_152_3_chute_cut.cjs index 2981239e8..c414d0ae1 100644 --- a/resources/tester/helper_152_3_chute_cut.cjs +++ b/resources/tester/helper_152_3_chute_cut.cjs @@ -32,7 +32,7 @@ const B06 = (f) => path.join(ROOT, "B06_Section", `${f}.ts`); const { computeStoredLayouts } = loadTs(B06("B06_Section_Structure_Layouts")); const { isChuteSegment, chuteBandOutline } = loadTs(B06("B06_Section_UI_Cross_Wall_Hatch")); const { chuteBands } = loadTs( - path.join(ROOT, "B05_Profile", "B05_Profile_UI_Corridor_Structures_Chute.ts"), + path.join(ROOT, "B05_Profile", "logic", "B05_Profile_Corridor_Structures_Chute.ts"), ); const fixture = (name) => JSON.parse(fs.readFileSync(path.join(__dirname, "fixtures", name), "utf8")).cross_sections; diff --git a/resources/tester/helper_172_1_loft_wrinkle.cjs b/resources/tester/helper_172_1_loft_wrinkle.cjs index 4eee129c0..71144e5f1 100644 --- a/resources/tester/helper_172_1_loft_wrinkle.cjs +++ b/resources/tester/helper_172_1_loft_wrinkle.cjs @@ -37,7 +37,7 @@ const { loadTs } = makeLoader({ }); const B05 = (name) => path.join(ROOT, "B05_Profile", `${name}.ts`); -const { buildCorridor } = loadTs(B05("B05_Profile_UI_Corridor_Build")); +const { buildCorridor } = loadTs(B05("logic/B05_Profile_Corridor_Build")); const { loftTerrain } = loadTs(B05("B05_Profile_UI_Corridor_Loft")); const { TerrainBandSplit } = loadTs(B05("B05_Profile_UI_Corridor_Split")); const { TerrainHeightIndex } = loadTs(B05("B05_Profile_UI_Corridor_Terrain")); diff --git a/resources/tester/helper_176_1_seam.cjs b/resources/tester/helper_176_1_seam.cjs index 08bdd37e6..3eef89066 100644 --- a/resources/tester/helper_176_1_seam.cjs +++ b/resources/tester/helper_176_1_seam.cjs @@ -37,7 +37,7 @@ const { loadTs } = makeLoader({ }); const B05 = (name) => path.join(ROOT, "B05_Profile", `${name}.ts`); -const { buildCorridor } = loadTs(B05("B05_Profile_UI_Corridor_Build")); +const { buildCorridor } = loadTs(B05("logic/B05_Profile_Corridor_Build")); const { loftTerrain } = loadTs(B05("B05_Profile_UI_Corridor_Loft")); const { TerrainBandSplit } = loadTs(B05("B05_Profile_UI_Corridor_Split")); const { TerrainHeightIndex } = loadTs(B05("B05_Profile_UI_Corridor_Terrain")); diff --git a/resources/tester/helper_322_0_golden.cjs b/resources/tester/helper_322_0_golden.cjs index c8a78b601..7c273ab6d 100644 --- a/resources/tester/helper_322_0_golden.cjs +++ b/resources/tester/helper_322_0_golden.cjs @@ -211,7 +211,7 @@ const { } = loadTs(B05("B05_Profile_Api_Structures")); const { loadSectionDetail } = loadTs(B06("B06_Section_Section_Store")); const { forgetDraftStations } = loadTs(B06("B06_Section_Section_Drafts")); -const { buildCorridorStructures } = loadTs(B05("B05_Profile_UI_Corridor_Structures")); +const { buildCorridorStructures } = loadTs(B05("logic/B05_Profile_Corridor_Structures")); const { computeRevetmentLayout } = loadTs(B06("B06_Section_UI_Cross_Revetment")); const { buildStructureLane } = loadTs(B05("B05_Profile_UI_Structures_Marks")); const { pickGroups } = loadTs(B05("B05_Profile_UI_Structures_Panel_Types")); diff --git a/resources/tester/helper_323_9_twin_cards_3d.cjs b/resources/tester/helper_323_9_twin_cards_3d.cjs index bd5b2d495..70ca9170d 100644 --- a/resources/tester/helper_323_9_twin_cards_3d.cjs +++ b/resources/tester/helper_323_9_twin_cards_3d.cjs @@ -29,7 +29,7 @@ const { loadTs } = makeLoader({ }); const { buildCorridorStructures } = loadTs( - path.join(ROOT, "B05_Profile", "B05_Profile_UI_Corridor_Structures.ts"), + path.join(ROOT, "B05_Profile", "logic", "B05_Profile_Corridor_Structures.ts"), ); const fixture = JSON.parse( fs.readFileSync(path.join(__dirname, "fixtures", "b06_73_4_body_guard_sections.json"), "utf8"), diff --git a/resources/tester/helper_345_4_corridor_worker.cjs b/resources/tester/helper_345_4_corridor_worker.cjs index 056180c4a..acd9a2bce 100644 --- a/resources/tester/helper_345_4_corridor_worker.cjs +++ b/resources/tester/helper_345_4_corridor_worker.cjs @@ -22,7 +22,7 @@ const { loadTs } = makeLoader({ }); const B05 = (name) => path.join(ROOT, "B05_Profile", `${name}.ts`); -const { buildCorridor } = loadTs(B05("B05_Profile_UI_Corridor_Build")); +const { buildCorridor } = loadTs(B05("logic/B05_Profile_Corridor_Build")); const { handleCorridorRequest, corridorTransfers } = loadTs(B05("B05_Profile_UI_Corridor_Worker")); const { buildCorridorOffThread } = loadTs(B05("B05_Profile_UI_Corridor_Worker_Client")); diff --git a/resources/tester/helper_472_3_graph.mjs b/resources/tester/helper_472_3_graph.mjs index 9714d0c1c..64e76f463 100644 --- a/resources/tester/helper_472_3_graph.mjs +++ b/resources/tester/helper_472_3_graph.mjs @@ -1,7 +1,8 @@ /* 472-3 헬퍼 — TS import 도달 집합(472-0 g472/graph.mjs 꼴 · 읽기만). * node helper_472_3_graph.mjs <저장소 뿌리> <입구.ts> [<입구.ts> …] * 입구마다 도달 파일(뿌리 상대 · `/`)을 JSON 한 벌로 표준출력 — 정적 import · export from · 동적 - * import() · new URL(…, import.meta.url)(워커) · `import type` · `export type` 은 뺌(지워짐). */ + * import() · new URL(…, import.meta.url)(워커) · `import type` · `export type` 은 뺌(지워짐) · 정적 import · + * export 는 줄 머리만(주석 속 「import」 낱말 안 셈). */ import fs from "node:fs"; import path from "node:path"; @@ -24,13 +25,13 @@ function resolve(from, spec) { return exists(base.replace(/\.js$/, "")); } const re = - /(?:import|export)\s+(?:type\s+)?(?:[^;"'`]*?\sfrom\s+)?["']([^"']+)["']|import\(\s*["']([^"']+)["']\s*\)|new URL\(\s*["']([^"']+)["']\s*,\s*import\.meta\.url/g; + /^\s*(?:import|export)\s+(?:type\s+)?(?:[^;"'`]*?\sfrom\s+)?["']([^"']+)["']|import\(\s*["']([^"']+)["']\s*\)|new URL\(\s*["']([^"']+)["']\s*,\s*import\.meta\.url/gm; function deps(file) { if (!/\.(ts|mts)$/.test(file)) return []; const src = fs.readFileSync(file, "utf8"); const out = []; for (const m of src.matchAll(re)) { - if (/^(?:import|export)\s+type\s/.test(m[0])) continue; + if (/^\s*(?:import|export)\s+type\s/.test(m[0])) continue; const target = resolve(file, m[1] || m[2] || m[3]); if (target) out.push(target); } diff --git a/resources/tester/helper_508_2_corridor_server.cjs b/resources/tester/helper_508_2_corridor_server.cjs index 479a8a426..993521f2c 100644 --- a/resources/tester/helper_508_2_corridor_server.cjs +++ b/resources/tester/helper_508_2_corridor_server.cjs @@ -45,8 +45,8 @@ const { loadTs } = makeLoader({ rewrite: (js) => js.replace(/import\.meta\.url/g, '"file:///x.js"'), }); const B05 = (name) => path.join(ROOT, "B05_Profile", `${name}.ts`); -const { buildCorridor } = loadTs(B05("B05_Profile_UI_Corridor_Build")); -const { serialize, corridorHash } = loadTs(B05("B05_Profile_UI_Corridor_Envelope")); +const { buildCorridor } = loadTs(B05("logic/B05_Profile_Corridor_Build")); +const { serialize, corridorHash } = loadTs(B05("logic/B05_Profile_Corridor_Envelope")); const corridor = loadTs(B05("B05_Profile_UI_Corridor")); const HALF = 3; diff --git a/resources/tester/test_152_3_chute_cut.py b/resources/tester/test_152_3_chute_cut.py index 5304d40e7..514d9d9f2 100644 --- a/resources/tester/test_152_3_chute_cut.py +++ b/resources/tester/test_152_3_chute_cut.py @@ -57,7 +57,7 @@ def test_성토만인_측점은_그대로(out: dict) -> None: def test_거름_한_벌_배선() -> None: culvert = _src("B06_Section/B06_Section_UI_Cross_Culvert.ts") assert "layout.outletFill.segments.filter(isChuteSegment)," in culvert - corridor = _src("B05_Profile/B05_Profile_UI_Corridor_Structures.ts") + corridor = _src("B05_Profile/logic/B05_Profile_Corridor_Structures.ts") flat = " ".join(corridor.split()) assert "chuteBands( layout.outletFill.segments, section.culvert?.chute, isChuteSegment," in flat hatch = _src("B06_Section/B06_Section_UI_Cross_Wall_Hatch.ts") diff --git a/resources/tester/test_178_1_slope_wall_guard.py b/resources/tester/test_178_1_slope_wall_guard.py index d16520092..dab16be60 100644 --- a/resources/tester/test_178_1_slope_wall_guard.py +++ b/resources/tester/test_178_1_slope_wall_guard.py @@ -77,7 +77,7 @@ def test_카드_서버_3D_가_가드_한_벌을_쓴다(): files = { "카드": ROOT / "B06_Section" / "B06_Section_UI_Cross_View.ts", "서버 면적 · B07": ROOT / "B06_Section" / "B06_Section_Structure_Layouts.ts", - "3D": ROOT / "B05_Profile" / "B05_Profile_UI_Corridor_Structures.ts", + "3D": ROOT / "B05_Profile" / "logic" / "B05_Profile_Corridor_Structures.ts", } for where, path in files.items(): source = path.read_text(encoding="utf-8") diff --git a/resources/tester/test_287_ford_pavement_followup.py b/resources/tester/test_287_ford_pavement_followup.py index 326a53977..0f0340c96 100644 --- a/resources/tester/test_287_ford_pavement_followup.py +++ b/resources/tester/test_287_ford_pavement_followup.py @@ -83,7 +83,7 @@ def test_포장층_노견까지_점선은_노면_위(ts): def test_3D_노면을_파지_않고_옛_파임_그림을_걷음(): - station = _read("B05_Profile", "B05_Profile_UI_Corridor_Station.ts") + station = _read("B05_Profile", "logic", "B05_Profile_Corridor_Station.ts") assert "fordDeckElevationAt" not in station pave = _read("B06_Section", "B06_Section_UI_Cross_Ford_Pavement.ts") assert "hideFordPavedRoad" not in pave and "fordDeckElevationAt" not in pave diff --git a/resources/tester/test_472_3_calc_registry.py b/resources/tester/test_472_3_calc_registry.py index 4812d13dd..e7d6f6c57 100644 --- a/resources/tester/test_472_3_calc_registry.py +++ b/resources/tester/test_472_3_calc_registry.py @@ -64,16 +64,9 @@ pytestmark = pytest.mark.skipif( reason="프론트엔드 의존성 미설치", ) -# 화면 · 세션 끌림(목록 1.3) — 472-2 2-B 가 걷음. 남은 줄 = 헬퍼 정규식 헛잡음 -# (Corridor_Structures_Hash 머리 주석 속 「import」부터 잡아 아래 `import type` 을 값으로 셈) — -# 헬퍼를 고치면 빈 목록. +# 화면 · 세션 끌림(목록 1.3) — 472-2 2-B 가 걷음. 남은 줄 = `B06_Section_Route_Carry_Patch` → +# `common_util_svg`(측점 간격) → 화면 글(`ui_template_locale`) 값 import. SESSION_PULLS = ( - "B06_Section/B06_Section_Api_Fetch.ts", - "config/config_frontend.ts", - "ui_template/ui_template_elements.ts", - "ui_template/ui_template_elements_base.ts", - "ui_template/ui_template_elements_chart.ts", - "ui_template/ui_template_elements_styles.ts", "ui_template/ui_template_locale.ts", "ui_template/ui_template_locale_a.ts", "ui_template/ui_template_locale_b1.ts", @@ -87,14 +80,6 @@ SESSION_PULLS = ( ) # 기하가 logic 밖(구조물 그림 · 3D 빌더 파일 안) — 472-4 가 logic · common_util 로. GEOMETRY_PULLS = ( - "B05_Profile/B05_Profile_UI_Corridor_Build.ts", - "B05_Profile/B05_Profile_UI_Corridor_Envelope.ts", - "B05_Profile/B05_Profile_UI_Corridor_Station.ts", - "B05_Profile/B05_Profile_UI_Corridor_Station_Structure.ts", - "B05_Profile/B05_Profile_UI_Corridor_Structures.ts", - "B05_Profile/B05_Profile_UI_Corridor_Structures_Box.ts", - "B05_Profile/B05_Profile_UI_Corridor_Structures_Chute.ts", - "B05_Profile/B05_Profile_UI_Corridor_Structures_Path.ts", "B06_Section/B06_Section_Structure_Layouts.ts", "B06_Section/B06_Section_UI_Cross_Body_Guard.ts", "B06_Section/B06_Section_UI_Cross_Box.ts", diff --git a/resources/tester/test_b05_corridor_separation.py b/resources/tester/test_b05_corridor_separation.py index c2d9265cf..38145dfcd 100644 --- a/resources/tester/test_b05_corridor_separation.py +++ b/resources/tester/test_b05_corridor_separation.py @@ -15,10 +15,10 @@ PROJECT_ROOT = Path(__file__).resolve().parents[2] if str(PROJECT_ROOT) not in sys.path: sys.path.insert(0, str(PROJECT_ROOT)) -BUILD = (PROJECT_ROOT / "B05_Profile" / "B05_Profile_UI_Corridor_Build.ts").read_text( +BUILD = (PROJECT_ROOT / "B05_Profile" / "logic" / "B05_Profile_Corridor_Build.ts").read_text( encoding="utf-8" ) -STATION = (PROJECT_ROOT / "B05_Profile" / "B05_Profile_UI_Corridor_Station.ts").read_text( +STATION = (PROJECT_ROOT / "B05_Profile" / "logic" / "B05_Profile_Corridor_Station.ts").read_text( encoding="utf-8" ) diff --git a/resources/tester/test_b05_corridor_switching.py b/resources/tester/test_b05_corridor_switching.py index c354899db..28edaf30e 100644 --- a/resources/tester/test_b05_corridor_switching.py +++ b/resources/tester/test_b05_corridor_switching.py @@ -14,7 +14,7 @@ if str(PROJECT_ROOT) not in sys.path: sys.path.insert(0, str(PROJECT_ROOT)) # 2026-08-23 700줄 분리로 측점 분류부가 Station 파일로 이사했다. -BUILD_SOURCE = (PROJECT_ROOT / "B05_Profile" / "B05_Profile_UI_Corridor_Station.ts").read_text( +BUILD_SOURCE = (PROJECT_ROOT / "B05_Profile" / "logic" / "B05_Profile_Corridor_Station.ts").read_text( encoding="utf-8" ) diff --git a/resources/tester/test_revet_wall_path.mjs b/resources/tester/test_revet_wall_path.mjs index 113773e0d..730e0f60d 100644 --- a/resources/tester/test_revet_wall_path.mjs +++ b/resources/tester/test_revet_wall_path.mjs @@ -1,4 +1,4 @@ -// 기슭막이 벽 경로선(B05_Profile_UI_Corridor_Structures_Path) 자체검증 — 로직 복제. +// 기슭막이 벽 경로선(logic/B05_Profile_Corridor_Structures_Path) 자체검증 — 로직 복제. // 연동을 푼 측점이 있으면 벽이 노선과 평행이 아니라 자기 경로를 따라간다(2026-08-30). // 실행: node tmp/tests/test_revet_wall_path.mjs import assert from "node:assert/strict";