refactor(logic): 348-1 순수 계산 TS 49 파일 <페이지>/logic/ 로 옮김 — 이름 앞머리 그대로 · 동작 고침 없음

- 옮김: B04 2 · B05 23 · B06 11 · A00_Common/design 13 (9,299 줄) · 이미 logic/ 에 있던 16 파일 그대로
- 안 옮김: 묶음 입구(package.json build:*) · 파이썬 · 순수지만 계산 아닌 8 (보기 결선 · 콜백 · API 타입 · 갈아끼움 알림판)
- import 266 줄(142 파일) · 시험 · 주석 · 짝 표시 문자열 경로 고침 · B05 · B06 CLAUDE.md 짝 줄 logic/
- 시험 도우미 새 경로: 가짜 require 열쇠 · B05()/B06() 부름 · 형제 import 자리 · tsc 묶어 돌리는 시험 · 정규식 · rglob
- design_view_cross 줄 한도 시험 685 → 688 (긴 import 경로 줄바꿈 3줄)
- 확인: typecheck 0 · 서버 묶음 넷(corridor · server-calc · b07-extent · b07-note) 다시 지어 코드 같음(//#region 경로 주석만 다름) · 관련 시험 270 파일 — 남은 실패 19 는 옮기기 전과 같음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014utrjfoW831Vc5wJUd13kL
This commit is contained in:
2026-10-16 13:44:50 +09:00
co-authored by Claude Opus 5.5
parent 109d5e9a8f
commit 281c71b55b
257 changed files with 484 additions and 425 deletions
+1 -1
View File
@@ -14,7 +14,7 @@
import type { CrossSection, SectionDetailResponse } from "../../B06_Section/B06_Section_Api_Fetch";
import { effectiveStandardCross } from "../../B06_Section/B06_Section_UI_Standard_Panel";
import type { CrossInput, SectionSpecs } from "../../B05_Profile/logic/B05_Profile_Pipeline_Detail";
import type { PipelineStation } from "./design_pipeline_types";
import type { PipelineStation } from "./logic/design_pipeline_types";
export interface PipelineCrossSource {
input: CrossInput;
+5 -5
View File
@@ -19,26 +19,26 @@
* [저장](sub5)이 서버 정본 — 노선을 먼저 보내고 `pendingAlignment(DRAFT_ROUTE_ID)` 를 새 노선에 보냄.
* ========================================================================== */
import { createDesignPipeline, publishToStore, type DesignPipeline } from "./design_pipeline";
import { createDesignPipeline, publishToStore, type DesignPipeline } from "./logic/design_pipeline";
import { pipelineCrossSource, type PipelineCrossSource } from "./design_pipeline_cross";
import { createStationsStage } from "./design_pipeline_stations";
import { createStationsStage } from "./logic/design_pipeline_stations";
import type {
PipelineInputs,
PipelineStation,
RouteDraft,
StageFn,
Vertex,
} from "./design_pipeline_types";
} from "./logic/design_pipeline_types";
import { useDesignStore } from "./design_store";
import { fetchDetailPipePoints } from "../../B04_PreProcess/B04_PreProcess_Api_Fetch";
import type { SectionDetailResponse } from "../../B06_Section/B06_Section_Api_Fetch";
import { createCrossStage } from "../../B06_Section/B06_Section_Cross_Stage";
import { createCrossStage } from "../../B06_Section/logic/B06_Section_Cross_Stage";
import {
emptyEdits,
type AlignmentBase,
type AlignmentEdits,
type ProfileAlignment,
} from "../../B05_Profile/B05_Profile_UI_Profile_Alignment";
} from "../../B05_Profile/logic/B05_Profile_UI_Profile_Alignment";
import {
markAlignmentSaved,
readAlignmentDraft,
+4 -4
View File
@@ -23,7 +23,7 @@ import {
hasLegacyAlignment,
readAlignment,
toDesignProfile,
} from "../../B05_Profile/B05_Profile_UI_Profile_Data";
} from "../../B05_Profile/logic/B05_Profile_UI_Profile_Data";
import { createProgressCircle } from "@ui/ui_template_progress";
import { showToast } from "@ui/ui_template_elements";
import { saveProfileAlignment } from "../../B05_Profile/B05_Profile_Api_Fetch";
@@ -39,12 +39,12 @@ import type {
AlignmentBase,
AlignmentEdits,
ProfileAlignment,
} from "../../B05_Profile/B05_Profile_UI_Profile_Alignment";
} from "../../B05_Profile/logic/B05_Profile_UI_Profile_Alignment";
import {
buildAlignment,
emptyEdits,
toAlignmentBase,
} from "../../B05_Profile/B05_Profile_UI_Profile_Alignment";
} from "../../B05_Profile/logic/B05_Profile_UI_Profile_Alignment";
import { createProfileEditStore } from "../../B05_Profile/B05_Profile_UI_Profile_Edit";
import {
structureGroupMenuItems,
@@ -69,7 +69,7 @@ import {
createElevationHold,
createProfileDrag,
} from "../../B05_Profile/B05_Profile_UI_Profile_Drag";
import { planCurveWarning, sampleAt } from "../../B05_Profile/B05_Profile_UI_Profile_Guard";
import { planCurveWarning, sampleAt } from "../../B05_Profile/logic/B05_Profile_UI_Profile_Guard";
import { listedBase } from "./design_profile_base";
import * as pagePipeline from "./design_pipeline_page";
import type { RouteProfilePanelCallbacks } from "../../B05_Profile/B05_Profile_UI_Profile_Panel_Types";
+1 -1
View File
@@ -5,7 +5,7 @@
* ========================================================================== */
import type { SectionDetailResponse } from "../../B06_Section/B06_Section_Api_Fetch";
import type { AlignmentBase } from "../../B05_Profile/B05_Profile_UI_Profile_Alignment";
import type { AlignmentBase } from "../../B05_Profile/logic/B05_Profile_UI_Profile_Alignment";
import type { IrregularStation } from "../../B05_Profile/B05_Profile_UI_IrregularStations";
import {
irregularGraphStations,
@@ -17,7 +17,7 @@ import {
parseWindowTransform,
type ChartWindow,
type FreeDraw,
} from "./design_profile_free";
} from "./logic/design_profile_free";
const SVG_NS = "http://www.w3.org/2000/svg";
+3 -3
View File
@@ -24,10 +24,10 @@ import type { StateName } from "../b_page_state";
import { CURRENT_PROJECT_ID_KEY } from "../../config/config_frontend";
import type { StructureInstance } from "../../B05_Profile/B05_Profile_Api_Structures";
import type { DetailPipeInput } from "../../B04_PreProcess/B04_PreProcess_Api_Fetch";
import type { AlignmentEdits } from "../../B05_Profile/B05_Profile_UI_Profile_Alignment";
import type { AlignmentEdits } from "../../B05_Profile/logic/B05_Profile_UI_Profile_Alignment";
import type { SectionDetailResponse } from "../../B06_Section/B06_Section_Api_Fetch";
import type { ProfileAlignment } from "../../B05_Profile/B05_Profile_UI_Profile_Alignment";
import type { PipelineStation, PlanFootprint, RouteDraft } from "./design_pipeline_types";
import type { ProfileAlignment } from "../../B05_Profile/logic/B05_Profile_UI_Profile_Alignment";
import type { PipelineStation, PlanFootprint, RouteDraft } from "./logic/design_pipeline_types";
/** 한 페이지의 두 보기(계획서 24-1). */
export type DesignView = "profile" | "cross";
@@ -17,7 +17,7 @@
import { fordSection } from "../../B05_Profile/B05_Profile_UI_Drainage_Facility_Fields";
import type { SpecForm } from "./design_structure_form";
import type { SpecContainer, SpecItem } from "./design_structure_spec";
import type { SpecContainer, SpecItem } from "./logic/design_structure_spec";
/** 월류 폭(m) → 필요 월류 높이(m) · 0.01 m 올림. 유량 · 폭이 없으면 null. */
export function fordHeightM(designFlowM3s: number | null, widthM: number): number | null {
+1 -1
View File
@@ -32,7 +32,7 @@ import {
type SpecState,
type SplitRole,
type StructureSpec,
} from "./design_structure_spec";
} from "./logic/design_structure_spec";
import {
group,
grid,
@@ -11,8 +11,8 @@
import type { CrossSection } from "../../B06_Section/B06_Section_Api_Fetch";
import { computeStoredLayouts } from "../../B06_Section/B06_Section_Structure_Layouts";
export { DEFAULT_BASIN_SHAPE } from "../../B06_Section/B06_Section_UI_Cross_Culvert_Basin";
export { pipeLengthText } from "../../B06_Section/B06_Section_UI_Cross_Culvert_Const"; // 「8 m (7.6)」(225-1)
export { DEFAULT_BASIN_SHAPE } from "../../B06_Section/logic/B06_Section_UI_Cross_Culvert_Basin";
export { pipeLengthText } from "../../B06_Section/logic/B06_Section_UI_Cross_Culvert_Const"; // 「8 m (7.6)」(225-1)
import { PIPE_MATCH_M } from "./design_selection";
/** 횡단 측점 목록을 대는 곳 — 횡단 보기가 자료를 받으면 걸어 둠(종단만 연 동안은 없음). */
+4 -1
View File
@@ -43,7 +43,10 @@ import { savingDesign } from "./design_save";
import { applyStructurePick } from "../../B06_Section/B06_Section_UI_Page_Structure_Pick";
import { bindCrossPick } from "../../B06_Section/B06_Section_UI_Page_Pick_Sync";
import { createSectionView } from "../../B06_Section/B06_Section_UI_Section_View";
import { revetFormOf, revetWallSpec } from "../../B06_Section/B06_Section_UI_Cross_Culvert_Const";
import {
revetFormOf,
revetWallSpec,
} from "../../B06_Section/logic/B06_Section_UI_Cross_Culvert_Const";
import {
applyPipeOptionsToCache,
type PipeOptionsContext,
@@ -1,5 +1,5 @@
/* =============================================================================
* A00_Common/design/design_pipeline.ts
* A00_Common/design/logic/design_pipeline.ts
* 실시간 계산 묶음 하나(PLAN 344-4) — 조작마다 차례 번호(generation) +1 · 단계 사이마다 번호
* 확인 · 옛 번호 결과 버림 · 뒤 단계 요청은 AbortController 로 끊음. 계약(키 모양 · 단계 · deps)
* = `design_pipeline_types.ts` 머리 주석.
@@ -13,7 +13,7 @@
* 화면 · fetch · 세션은 단계 함수(주입) 몫 — 이 파일은 차례 · 버림 · 범위 · 기록만.
* ========================================================================== */
import type { DesignStore } from "./design_store";
import type { DesignStore } from "../design_store";
import type {
ChangeRange,
ChangeSource,
@@ -1,5 +1,5 @@
/* =============================================================================
* A00_Common/design/design_pipeline_stations.ts
* A00_Common/design/logic/design_pipeline_stations.ts
* 계산 묶음 stations 단계(PLAN 346-1) — 측점 계산은 `B05_Profile/logic/B05_Profile_Sections_Stations.ts`
* (서버 `generate_sections` 짝) · 여기는 단계 꼴 · 범위 밖 앞 값 재사용만.
* ========================================================================== */
@@ -8,12 +8,12 @@ import {
buildStations,
REUSE_MARGIN_M,
type StationsOptions,
} from "../../B05_Profile/logic/B05_Profile_Sections_Stations";
} from "../../../B05_Profile/logic/B05_Profile_Sections_Stations";
import type {
PlanPipe,
PlanStructure,
PlanType,
} from "../../common_util/common_util_structure_station";
} from "../../../common_util/common_util_structure_station";
import type { PipelineStation, StageContext, StageFn } from "./design_pipeline_types";
/** 범위 밖 측점은 앞 값(같은 열쇠 · 같은 자리)을 그대로 — 뒤 단계가 같은 객체로 「안 바뀜」을 앎. */
@@ -1,5 +1,5 @@
/* =============================================================================
* A00_Common/design/design_pipeline_types.ts
* A00_Common/design/logic/design_pipeline_types.ts
* 실시간 계산 묶음 **계약**(PLAN 344-4) — 키별 모양 · 단계 입력 · 출력. 다른 창(sub1 · sub2 ·
* sub3 · sub6 · sub8)은 이 모양대로 단계 함수를 만들어 `createDesignPipeline({ stages })` 에 넣음.
* 계산 묶음 본체 = `design_pipeline.ts`.
@@ -53,7 +53,7 @@ import type {
AlignmentBase,
AlignmentEdits,
ProfileAlignment,
} from "../../B05_Profile/B05_Profile_UI_Profile_Alignment";
} from "../../../B05_Profile/logic/B05_Profile_UI_Profile_Alignment";
/** 평면 좌표(m) — 도면 좌표계 x · y. */
export type Vertex = [number, number];
@@ -1,5 +1,5 @@
/* =============================================================================
* A00_Common/design/design_profile_free.ts
* A00_Common/design/logic/design_profile_free.ts
* 종단 [자유지정] 계산 — 범위 · 클릭 점 · 측점선 붙음 · 높이 변환 · 기울기 판정 · 적용(215-1).
*
* 흐름: 세로 측점선 둘로 범위를 고름 → 시작(또는 끝) 세로선 근처 클릭 = 그 측점 계획고에 이은
@@ -17,16 +17,16 @@ import type {
AlignmentBase,
AlignmentEdits,
ProfileAlignment,
} from "../../B05_Profile/B05_Profile_UI_Profile_Alignment";
} from "../../../B05_Profile/logic/B05_Profile_UI_Profile_Alignment";
import {
buildAlignment,
chainageKey,
controlElevationAt,
} from "../../B05_Profile/B05_Profile_UI_Profile_Alignment";
} from "../../../B05_Profile/logic/B05_Profile_UI_Profile_Alignment";
import {
baseElevationAt,
defaultCurveLength,
} from "../../B05_Profile/B05_Profile_UI_Profile_Straighten";
} from "../../../B05_Profile/logic/B05_Profile_UI_Profile_Straighten";
/** 두 chainage 를 같은 측점으로 볼 허용 오차(m). */
const SAME_M = 1e-6;
@@ -18,7 +18,7 @@ import { BOX_SPEC } from "./design_structure_box";
import { FORD_SPEC } from "./design_structure_ford";
import { FORD_PAVEMENT_SPEC } from "./design_structure_ford_pavement";
import { ETC_SPEC, PAVEMENT_SPEC } from "./design_structure_road";
import { baseType } from "../../common_util/common_util_structure_catalog";
import { baseType } from "../../../common_util/common_util_structure_catalog";
const SOIL = "기슭막이"; // 저장 값(옛 키 그대로) — 화면 이름은 흙막이
const BASIN = "집수정";
+1 -1
View File
@@ -39,7 +39,7 @@ import {
pointAtChainage,
resampleRoute,
type RoutePoint,
} from "./B04_PreProcess_UI_RouteSamples";
} from "./logic/B04_PreProcess_UI_RouteSamples";
import { PIPE_MATCH_M } from "../A00_Common/design/design_selection";
function L(key: keyof typeof ui_locales): string {
+1 -1
View File
@@ -11,7 +11,7 @@
import "@ui/ui_template_flow_legend.css";
import { currentLanguageIndex, ui_locales } from "@ui/ui_template_locale";
import { themeColor } from "@ui/ui_template_palette";
import type { RoutePoint } from "./B04_PreProcess_UI_RouteSamples";
import type { RoutePoint } from "./logic/B04_PreProcess_UI_RouteSamples";
/** 강도 색띠 — 파랑(적음) → 빨강(많음). 정의처는 `ui_template_theme.css`. */
const RAMP_TOKENS: ReadonlyArray<[name: string, fallback: string]> = [
@@ -27,7 +27,11 @@ import {
normalizeStrength,
rampColor,
} from "./B04_PreProcess_UI_FlowRamp";
import { pointAtChainage, resampleRoute, type RoutePoint } from "./B04_PreProcess_UI_RouteSamples";
import {
pointAtChainage,
resampleRoute,
type RoutePoint,
} from "./logic/B04_PreProcess_UI_RouteSamples";
function L(key: keyof typeof ui_locales): string {
return ui_locales[key][currentLanguageIndex];
@@ -41,7 +41,7 @@ import {
type PreparedLayer,
type ViewState,
} from "./B04_PreProcess_UI_MapRender";
import { prepareLayer, prepareMetricPolyline } from "./B04_PreProcess_UI_MapRender_Prepare";
import { prepareLayer, prepareMetricPolyline } from "./logic/B04_PreProcess_UI_MapRender_Prepare";
import { drawStationTicks } from "./B04_PreProcess_UI_MapOverlays";
import type { WatershedAnalysis } from "./B04_PreProcess_Api_Fetch";
@@ -8,7 +8,7 @@
* 순환 참조가 생기지 않는다.
* ========================================================================== */
import type { VWorldMeta } from "./B04_PreProcess_Api_Fetch";
import type { VWorldMeta } from "../B04_PreProcess_Api_Fetch";
import type {
GeoJsonCollection,
GeoJsonGeometry,
@@ -16,7 +16,7 @@ import type {
PreparedFeature,
PreparedLayer,
PreparedPart,
} from "./B04_PreProcess_UI_MapRender";
} from "../B04_PreProcess_UI_MapRender";
function isPoint(value: unknown): value is [number, number] {
return Array.isArray(value) && typeof value[0] === "number" && typeof value[1] === "number";
+1 -1
View File
@@ -12,7 +12,7 @@
import { API_BASE_URL } from "@config/config_frontend";
import type { HaulPlan } from "@util/common_util_mass_haul_balance";
import type { StageContext } from "../A00_Common/design/design_pipeline_types";
import type { StageContext } from "../A00_Common/design/logic/design_pipeline_types";
import type { MassHaulStageOutput } from "./logic/B05_Profile_MassHaul_Stage";
/** 서버가 돌려주는 배분 한 벌 — **화면이 쓰는 꼴 그대로**라 그리기 코드가 손대지 않는다.
+1 -1
View File
@@ -18,7 +18,7 @@ import { API_BASE_URL } from "@config/config_frontend";
import { readState, writeState } from "../A00_Common/b_page_state";
import { heightAt } from "../common_util/common_util_surface_sampler";
import { loadDesignTerrainGrid } from "./B05_Profile_Api_TerrainGrid";
import type { RouteDraft } from "../A00_Common/design/design_pipeline_types";
import type { RouteDraft } from "../A00_Common/design/logic/design_pipeline_types";
/** 편집 창 분석 지형 — las = 확정 지표면(라이다) · sheet = 수치지형도 서피스. */
export type AnalysisTerrain = "las" | "sheet";
+1 -1
View File
@@ -23,7 +23,7 @@ import {
type DefinedSpot,
type StructureDefinition,
withDefinition,
} from "./B05_Profile_UI_Structures_Define";
} from "./logic/B05_Profile_UI_Structures_Define";
/** 배치형태 — 점형(측점 1개) / 구간형(시~종점) / 부지형(위치+면적). */
export type StructurePlacement = "point" | "interval" | "site";
+1 -1
View File
@@ -4,7 +4,7 @@
API — `POST /api/projects/{id}/route/replan`(`B05_Profile_Router_Replan.replan_route`):
요청 `RouteSaveRequest` = 옛 칸(`vertices` · `initial` · `balanced_profile` · `terrain` ·
`station_snap`) +
`draft` — 계약 `RouteDraft`(`A00_Common/design/design_pipeline_types.ts`) 그대로
`draft` — 계약 `RouteDraft`(`A00_Common/design/logic/design_pipeline_types.ts`) 그대로
`{rev, nodes: [[x, y]…], curveOn: [bool…], curveRadius: [m | null…], curveLock, curveArc,
stationSnap, terrain}` · 오면 `vertices` · `station_snap` · `terrain` 대신 이것.
`as_initial` — 추천 노선 [적용](초기값 다시 뜸) · 손으로 고친 노선 저장은 false(초기값 그대로).
+3 -3
View File
@@ -38,20 +38,20 @@ import {
lerpPoints,
slerpLeft,
type PieceControl,
} from "./B05_Profile_UI_Corridor_Frames";
} 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";
import type {
CorridorBuildResult,
CorridorCap,
CorridorRibbon,
} from "./B05_Profile_UI_Corridor_Build_Types";
} from "./logic/B05_Profile_UI_Corridor_Build_Types";
// 결과 자료형은 `_Build_Types` 에 있다(2026-09-02 분리) — 호출부 경로 유지를 위해 재수출.
export type {
CorridorBuildResult,
CorridorCap,
CorridorRibbon,
} from "./B05_Profile_UI_Corridor_Build_Types";
} from "./logic/B05_Profile_UI_Corridor_Build_Types";
import { structureSilhouettes } from "./B05_Profile_UI_Corridor_Station_Structure";
/** 종방향 세분 간격(m) — 곡선 각짐 방지(2026-08-23 사용자: 노선 폴리라인 따라 세분).
@@ -10,7 +10,7 @@
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 { DeformLimit, DeformSide } from "./B05_Profile_UI_Corridor_Deform";
import type { DeformLimit, DeformSide } from "./logic/B05_Profile_UI_Corridor_Deform";
/** 측점 프레임 축(모델 좌표) — 중심 · 좌향 단위 벡터. */
interface StationAxis {
@@ -12,7 +12,10 @@
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 type {
CorridorBuildResult,
CorridorRibbon,
} from "./logic/B05_Profile_UI_Corridor_Build_Types";
import { structureHashParts } from "./B05_Profile_UI_Corridor_Structures";
/**
+6 -6
View File
@@ -16,10 +16,10 @@
import type * as THREE from "three";
import type { ModelBounds } from "./B05_Profile_UI_Markers";
import type { CorridorBuildResult } from "./B05_Profile_UI_Corridor_Build_Types";
import type { CorridorBuildResult } from "./logic/B05_Profile_UI_Corridor_Build_Types";
import type { TerrainBandSplit } from "./B05_Profile_UI_Corridor_Split";
import type { TerrainHeightIndex } from "./B05_Profile_UI_Corridor_Terrain";
import { roadRows } from "./B05_Profile_UI_Corridor_Deform";
import { roadRows } from "./logic/B05_Profile_UI_Corridor_Deform";
import { noFillLimits } from "./B05_Profile_UI_Corridor_Deform_Structure";
import { tinTerrain, type TinDesigner, type TinStats } from "./B05_Profile_UI_Corridor_Tin";
import {
@@ -27,7 +27,7 @@ import {
SECTION_STEP_M,
structureTopLoops,
type TinDesign,
} from "./B05_Profile_UI_Corridor_Tin_Design";
} from "./logic/B05_Profile_UI_Corridor_Tin_Design";
import {
EDGE_ANCHOR,
EDGE_DESIGN,
@@ -39,7 +39,7 @@ import {
TAG_CUT,
TAG_FILL,
TAG_HOLE,
} from "./B05_Profile_UI_Corridor_Tin_Pslg";
} from "./logic/B05_Profile_UI_Corridor_Tin_Pslg";
import {
arcFractions,
atFraction,
@@ -50,8 +50,8 @@ import {
stationLofts,
} from "./B05_Profile_UI_Corridor_Loft_Profile";
import { smoothSlopeNormals } from "./B05_Profile_UI_Corridor_Loft_Shade";
import { gauss, pinBack, smoothToe } from "./B05_Profile_UI_Corridor_Loft_Toe";
import { taubin, type GridRow } from "./B05_Profile_UI_Corridor_Loft_Grid";
import { gauss, pinBack, smoothToe } from "./logic/B05_Profile_UI_Corridor_Loft_Toe";
import { taubin, type GridRow } from "./logic/B05_Profile_UI_Corridor_Loft_Grid";
// ponytail: 이보다 짧은 비탈은 없는 것으로(10 cm) — 부채꼴 끝 0.2 m 행 사이 실오라기 삼각형을 막음.
const MIN_SLOPE_M = 0.1;
@@ -21,7 +21,7 @@ import {
fordLayoutOf,
wallSpanOf,
} from "./B05_Profile_UI_Corridor_Structures";
import { groundInterpolator } from "../B06_Section/B06_Section_UI_Cross_Culvert_Solve";
import { groundInterpolator } from "../B06_Section/logic/B06_Section_UI_Cross_Culvert_Solve";
/** 한 측의 구조물 실루엣 — 비탈 조각을 이걸로 갈아 끼운다. */
export interface StructureSilhouette {
@@ -20,7 +20,7 @@
* 폴리곤을 갈아 끼워(`polygons`) 측점 사이를 Catmull-Rom으로 잇는다. 벽은 여전히 하나다.
* ========================================================================== */
import { structureHashParts, wallSweepAt } from "./B05_Profile_UI_Corridor_Structures_Hash";
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 {
@@ -29,7 +29,7 @@ import {
restrictToSide,
tierSpanOf,
} from "../B06_Section/B06_Section_UI_Cross_Culvert_Wire";
import { pipeWallThicknessM } from "../B06_Section/B06_Section_UI_Cross_Culvert_Const";
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";
@@ -42,7 +42,7 @@ import {
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 "./B05_Profile_UI_Corridor_Structures_Wing";
import { buildWingSolids } from "./logic/B05_Profile_UI_Corridor_Structures_Wing";
import {
buildWallPath,
detachedControlsOf,
@@ -54,7 +54,7 @@ import { computeRevetmentLayout } from "../B06_Section/B06_Section_UI_Cross_Reve
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 "./B05_Profile_UI_Corridor_Structures_Pick";
import { builds, culvertBody, ownsBody } from "./logic/B05_Profile_UI_Corridor_Structures_Pick";
/** 스윕 프레임 하나 — 노선 위 한 지점의 중심 XY·좌향 단위벡터와 종단 표고 오프셋. */
export interface StructureFrame {
@@ -695,4 +695,4 @@ export function buildCorridorStructures(
}
// 해시 요약은 `_Structures_Hash.ts` 에 있다(2026-09-02 분리) — 호출부 경로 유지를 위해 재수출.
export { structureHashParts } from "./B05_Profile_UI_Corridor_Structures_Hash";
export { structureHashParts } from "./logic/B05_Profile_UI_Corridor_Structures_Hash";
@@ -15,7 +15,7 @@ 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 "./B05_Profile_UI_Corridor_Structures_Wing";
import { buildWingSolids } from "./logic/B05_Profile_UI_Corridor_Structures_Wing";
import { chuteBands } from "./B05_Profile_UI_Corridor_Structures_Chute";
/** 단면 폴리곤 한 장 — [offset, elevation] 목록. */
+4 -4
View File
@@ -14,11 +14,11 @@
import * as THREE from "three";
import type { ModelBounds } from "./B05_Profile_UI_Markers";
import type { CorridorBuildResult } from "./B05_Profile_UI_Corridor_Build_Types";
import type { CorridorBuildResult } from "./logic/B05_Profile_UI_Corridor_Build_Types";
import type { TerrainBandSplit } from "./B05_Profile_UI_Corridor_Split";
import type { TerrainHeightIndex } from "./B05_Profile_UI_Corridor_Terrain";
import { CellRegion } from "./B05_Profile_UI_Corridor_Region";
import type { TinDesign } from "./B05_Profile_UI_Corridor_Tin_Design";
import { CellRegion } from "./logic/B05_Profile_UI_Corridor_Region";
import type { TinDesign } from "./logic/B05_Profile_UI_Corridor_Tin_Design";
import {
EDGE_TERRAIN,
LoopIndex,
@@ -28,7 +28,7 @@ import {
TAG_FILL,
TAG_TERRAIN,
TriGrid,
} from "./B05_Profile_UI_Corridor_Tin_Pslg";
} from "./logic/B05_Profile_UI_Corridor_Tin_Pslg";
/** 절토 · 성토 색 — 리본 색과 같은 값. */
const CUT_COLOR = new THREE.Color(0xb5179e);
@@ -7,7 +7,7 @@
* 시설 종류는 구조물 배치의 "종류" 드롭다운이, 위치(시작·기준·종료 측점)는 위치
* 칸이 담당하므로 여기에는 부속 옵션 필드만 있다.
*
* 배관 부속(PLAN 52-1): 사용자 구조물 표 01 명세 폼(`A00_Common/design/design_structure_pipe`)
* 배관 부속(PLAN 52-1): 사용자 구조물 표 01 명세 폼(`A00_Common/design/logic/design_structure_pipe`)
* — 관 · 관 보호공(유입 · 유출) · 흙막이 추가 · 도수로/돌붙임 컨테이너. 저장 키는 옛 키 그대로 ·
* 옛 관종 · 날개벽 · 집수정 형식 칸은 화면에서 빠지고 값은 남음(지난 정의 값).
*
@@ -56,15 +56,15 @@ import {
type SpecForm,
type SpecLinks,
} from "../A00_Common/design/design_structure_form";
import { PIPE_SPEC } from "../A00_Common/design/design_structure_pipe";
import { PIPE_SPEC } from "../A00_Common/design/logic/design_structure_pipe";
import { catalogRow } from "../common_util/common_util_structure_catalog";
import {
BOX_SPEC,
bodyOf,
bodyOptions,
boxOptionsIn,
} from "../A00_Common/design/design_structure_box";
import { FORD_SPEC, withLegacyGuards } from "../A00_Common/design/design_structure_ford";
} from "../A00_Common/design/logic/design_structure_box";
import { FORD_SPEC, withLegacyGuards } from "../A00_Common/design/logic/design_structure_ford";
import { overflowSync } from "../A00_Common/design/design_structure_ford_calc";
import {
pipeDrawn,
@@ -78,7 +78,7 @@ import {
type GroupItems,
type SummaryItem,
} from "../common_util/common_util_summary_item";
import { FORD_PAVEMENT_SPEC } from "../A00_Common/design/design_structure_ford_pavement";
import { FORD_PAVEMENT_SPEC } from "../A00_Common/design/logic/design_structure_ford_pavement";
import { createHiddenOptions } from "./B05_Profile_UI_Drainage_Facility_Hidden";
export type { InletStructureKind }; // 목록은 700줄 한계로 `_Fields` 로 옮김 — 부르던 곳은 그대로
@@ -11,7 +11,7 @@
* · 필수 검사는 이 폼에 없다(레지스트리 옵션 칸은 `renderOptionFields` 가 숨긴 칸을 뺌).
* ========================================================================== */
import { hiddenFormKeys } from "./B05_Profile_UI_Drainage_Facility_Merge";
import { hiddenFormKeys } from "./logic/B05_Profile_UI_Drainage_Facility_Merge";
export interface HiddenOptions {
/** 폼이 받은 옵션 — 숨긴 칸의 옛 값 보존용. `setFacility` 가 부른다. */
+1 -1
View File
@@ -15,7 +15,7 @@ import { API_BASE_URL } from "@config/config_frontend";
import { createProgressCircle } from "@ui/ui_template_progress";
import { openModal } from "@ui/ui_template_modal";
import { readStateRaw, writeStateRaw } from "../A00_Common/b_page_state";
import type { StageFn } from "../A00_Common/design/design_pipeline_types";
import type { StageFn } from "../A00_Common/design/logic/design_pipeline_types";
import {
computeDetailBasins,
type DetailBasinResponse,
+3 -3
View File
@@ -24,16 +24,16 @@ import {
import {
prepareLayer,
prepareMetricPolyline,
} from "../B04_PreProcess/B04_PreProcess_UI_MapRender_Prepare";
} from "../B04_PreProcess/logic/B04_PreProcess_UI_MapRender_Prepare";
import { type RoutePoint } from "./B05_Profile_Api_Fetch";
import type { FlowArrow } from "../B04_PreProcess/B04_PreProcess_UI_FlowArrows";
import { buildStrengthArray } from "../B04_PreProcess/B04_PreProcess_UI_FlowRamp";
import { resampleRoute } from "../B04_PreProcess/B04_PreProcess_UI_RouteSamples";
import { resampleRoute } from "../B04_PreProcess/logic/B04_PreProcess_UI_RouteSamples";
import { batched, createPipeEditor } from "./B05_Profile_UI_Drainage_Pipes";
import { followMovedPipe, PIPE_MATCH_M } from "../A00_Common/design/design_pipe_ids";
import { snapStructureStation } from "../common_util/common_util_structure_station";
import { createFacilityStore } from "./B05_Profile_UI_Drainage_Facility";
import { mergeFacilityOptions } from "./B05_Profile_UI_Drainage_Facility_Merge";
import { mergeFacilityOptions } from "./logic/B05_Profile_UI_Drainage_Facility_Merge";
import { readPendingPipes, writePendingPipes } from "./B05_Profile_Api_Pipes_Draft";
import { buildPipeReports } from "./B05_Profile_UI_Drainage_Report";
import { fillFordHeights, fordWaitsOf, waitsFordHeight } from "./B05_Profile_UI_Drainage_Ford_Fill";
@@ -13,7 +13,7 @@ import type { FacilityAttributes } from "./B05_Profile_UI_Drainage_Facility";
import type { PipeFacility, PipeSource } from "../B04_PreProcess/B04_PreProcess_Api_Fetch";
import type { MapContextMenuItem } from "@ui/ui_template_context_menu";
import type { RouteSpanBand } from "./B05_Profile_UI_Drainage_Spans";
import type { StageFn } from "../A00_Common/design/design_pipeline_types";
import type { StageFn } from "../A00_Common/design/logic/design_pipeline_types";
export interface DrainagePanel {
root: HTMLElement;
@@ -29,7 +29,7 @@ import {
import type { DetailBasin, VWorldMeta } from "../B04_PreProcess/B04_PreProcess_Api_Fetch";
import { drawFlowArrows, type FlowArrow } from "../B04_PreProcess/B04_PreProcess_UI_FlowArrows";
import { drawStrengthLine } from "../B04_PreProcess/B04_PreProcess_UI_FlowRamp";
import type { RoutePoint } from "../B04_PreProcess/B04_PreProcess_UI_RouteSamples";
import type { RoutePoint } from "../B04_PreProcess/logic/B04_PreProcess_UI_RouteSamples";
import {
basinColor,
createMetricProjector,
+1 -1
View File
@@ -11,7 +11,7 @@
* 않는다. 이름은 안 적는다(종단에 이미 있고, 지도에 글자를 얹으면 눈금·유역 번호와 겹친다).
* ========================================================================== */
import type { RoutePoint } from "../B04_PreProcess/B04_PreProcess_UI_RouteSamples";
import type { RoutePoint } from "../B04_PreProcess/logic/B04_PreProcess_UI_RouteSamples";
import type { StructureInstance, StructureType } from "./B05_Profile_Api_Structures";
/** 계획선 위에 얹을 구간 하나 — 누가거리 두 값과 색. */
@@ -30,7 +30,7 @@ import {
import type { IrregularStation } from "./B05_Profile_UI_IrregularStations";
import type { createRoutePanel } from "./B05_Profile_UI_Panel";
import type { createRouteProfilePanel } from "./B05_Profile_UI_Profile_Panel";
import { followedStation } from "./B05_Profile_UI_Profile_Alignment";
import { followedStation } from "./logic/B05_Profile_UI_Profile_Alignment";
import { followSnapped } from "./B05_Profile_UI_Structures_Snap";
import { plantsStation } from "./B05_Profile_UI_Profile_Structures";
import { listPick } from "../common_util/common_util_structure_catalog";
@@ -14,7 +14,7 @@
* 표시줄은 상태를 갖지 않는다 — 그릴 때마다 현재 선형·편집 상태를 인자로 받는다.
* ========================================================================== */
import type { ProfileAlignment } from "./B05_Profile_UI_Profile_Alignment";
import type { ProfileAlignment } from "./logic/B05_Profile_UI_Profile_Alignment";
import type { MinCoverViolation } from "./B05_Profile_UI_Profile_MinCover";
export interface BalanceBarParams {
+2 -2
View File
@@ -15,8 +15,8 @@
* 라벨에 가려 보이지 않기 때문이다.
* ========================================================================== */
import type { AlignmentEdits, ProfileAlignment } from "./B05_Profile_UI_Profile_Alignment";
import { chainageKey, emptyEdits, hasEdits } from "./B05_Profile_UI_Profile_Alignment";
import type { AlignmentEdits, ProfileAlignment } from "./logic/B05_Profile_UI_Profile_Alignment";
import { chainageKey, emptyEdits, hasEdits } from "./logic/B05_Profile_UI_Profile_Alignment";
import {
ALIGNMENT_DRAFT_KEY_PREFIX,
draftProjectId,
+1 -1
View File
@@ -8,7 +8,7 @@
* ========================================================================== */
import { LONG_PAD } from "../B06_Section/B06_Section_UI_Section_Common";
import { normalizedLongitudinal } from "./B05_Profile_UI_Profile_Data";
import { normalizedLongitudinal } from "./logic/B05_Profile_UI_Profile_Data";
import { TABLE_TARGET_FONT_PX, tableCellWidthFor } from "./B05_Profile_UI_Profile_Table";
import type { LongitudinalSection, SectionStation } from "../B06_Section/B06_Section_Api_Fetch";
import {
@@ -20,8 +20,8 @@
* ========================================================================== */
import { showToast } from "@ui/ui_template_elements";
import { controlElevationAt } from "./B05_Profile_UI_Profile_Alignment";
import type { AlignmentBase, ProfileAlignment } from "./B05_Profile_UI_Profile_Alignment";
import { controlElevationAt } from "./logic/B05_Profile_UI_Profile_Alignment";
import type { AlignmentBase, ProfileAlignment } from "./logic/B05_Profile_UI_Profile_Alignment";
import type { PipeFacility } from "../B04_PreProcess/B04_PreProcess_Api_Fetch";
@@ -15,8 +15,8 @@ import type {
AlignmentBase,
AlignmentEdits,
ProfileAlignment,
} from "./B05_Profile_UI_Profile_Alignment";
import { adjustStation } from "./B05_Profile_UI_Profile_Alignment";
} from "./logic/B05_Profile_UI_Profile_Alignment";
import { adjustStation } from "./logic/B05_Profile_UI_Profile_Alignment";
import { HOLD_DELAY_MS, HOLD_INTERVAL_MS } from "./B05_Profile_UI_Profile_Edit";
import {
createProfileHistory,
@@ -30,9 +30,9 @@ import {
shiftStraightRuns,
straightenBetween,
tiltStraightRun,
} from "./B05_Profile_UI_Profile_Straighten";
} from "./logic/B05_Profile_UI_Profile_Straighten";
import type { IrregularStation } from "./B05_Profile_UI_IrregularStations";
import { createFreeDraw } from "../A00_Common/design/design_profile_free";
import { createFreeDraw } from "../A00_Common/design/logic/design_profile_free";
import { createFreeView, type FreeChartGeom } from "../A00_Common/design/design_profile_free_view";
import { arrowsBelongToProfile } from "../B06_Section/B06_Section_UI_Cross_Panel_Base";
import { stepStructureStation } from "../common_util/common_util_structure_station";
@@ -9,7 +9,7 @@
* 끌기 중에는 계속 호출되므로 디바운스하고, 늦게 온 응답은 seq 비교로 버린다.
* ========================================================================== */
import type { AlignmentEdits, ProfileAlignment } from "./B05_Profile_UI_Profile_Alignment";
import type { AlignmentEdits, ProfileAlignment } from "./logic/B05_Profile_UI_Profile_Alignment";
import { holdScreenAlignment, refreshCrossDesigns } from "../B06_Section/B06_Section_Cross_Refresh";
import { staleChainages } from "../B06_Section/B06_Section_UI_Section_Common";
import type { SectionDetailResponse } from "../B06_Section/B06_Section_Api_Fetch";
+2 -2
View File
@@ -20,14 +20,14 @@ import {
windowElevationRange,
} from "../B06_Section/B06_Section_UI_Section_Common";
import type { SectionDetailResponse } from "../B06_Section/B06_Section_Api_Fetch";
import { normalizedLongitudinal, toDesignProfile } from "./B05_Profile_UI_Profile_Data";
import { normalizedLongitudinal, toDesignProfile } from "./logic/B05_Profile_UI_Profile_Data";
import {
adjustStation,
setCurveRadius,
type AlignmentBase,
type AlignmentEdits,
type ProfileAlignment,
} from "./B05_Profile_UI_Profile_Alignment";
} from "./logic/B05_Profile_UI_Profile_Alignment";
import { createEditOverlay } from "./B05_Profile_UI_Profile_Edit";
import { createRunHighlight } from "./B05_Profile_UI_Profile_RunHighlight";
import {
@@ -12,8 +12,8 @@
* (`onYAxis`)에서 되짚는다 — 두 눈금의 (표고, y) 두 쌍이면 1차식이 정해진다.
* ========================================================================== */
import type { ProfileAlignment } from "./B05_Profile_UI_Profile_Alignment";
import type { StraightRun } from "./B05_Profile_UI_Profile_Straighten";
import type { ProfileAlignment } from "./logic/B05_Profile_UI_Profile_Alignment";
import type { StraightRun } from "./logic/B05_Profile_UI_Profile_Straighten";
const SVG_NS = "http://www.w3.org/2000/svg";
/** 두 chainage를 같은 변화점으로 볼 허용 오차(m). */
+1 -1
View File
@@ -17,7 +17,7 @@ import type {
AlignmentCurve,
AlignmentSegment,
ProfileAlignment,
} from "./B05_Profile_UI_Profile_Alignment";
} from "./logic/B05_Profile_UI_Profile_Alignment";
import { stationLabel } from "../B06_Section/B06_Section_UI_Section_Common";
import {
irregularStationId,
+2 -2
View File
@@ -14,8 +14,8 @@
* [자유지정] → 범위를 고르고 클릭으로 계획선을 잇는다(`design_profile_free` 몫 · 215-1).
* ========================================================================== */
import type { StraightRun } from "./B05_Profile_UI_Profile_Straighten";
import { sameRun } from "./B05_Profile_UI_Profile_Straighten";
import type { StraightRun } from "./logic/B05_Profile_UI_Profile_Straighten";
import { sameRun } from "./logic/B05_Profile_UI_Profile_Straighten";
import type { FreeChartGeom } from "../A00_Common/design/design_profile_free_view";
export type ProfileToolMode = "none" | "straighten" | "shift" | "free";
+7 -3
View File
@@ -41,7 +41,7 @@ import {
buildEditedPolyline,
type EditedCurve,
type EditedNode,
} from "./B05_Profile_UI_RouteEdit_Curve";
} from "./logic/B05_Profile_UI_RouteEdit_Curve";
import { drawRouteEditScene, polylineLengthM } from "./B05_Profile_UI_RouteEdit_Render";
import { bindNodeSplice, bindRouteEditNavigation } from "./B05_Profile_UI_RouteEdit_Input";
import { bindRouteEditPointer } from "./B05_Profile_UI_RouteEdit_Pointer";
@@ -61,7 +61,11 @@ import {
viewPxPerMeter,
} from "./B05_Profile_UI_RouteEdit_View";
import { createCurveBar } from "./B05_Profile_UI_RouteEdit_CurveBar";
import { curveSpans, snapCurveStations, stationsAlong } from "./B05_Profile_UI_RouteEdit_Frame";
import {
curveSpans,
snapCurveStations,
stationsAlong,
} from "./logic/B05_Profile_UI_RouteEdit_Frame";
import {
lockColumn,
readRouteLocks,
@@ -76,7 +80,7 @@ import {
flattenServerPlan,
spliceNode,
type CurveLock,
} from "./B05_Profile_UI_RouteEdit_Edits";
} from "./logic/B05_Profile_UI_RouteEdit_Edits";
import {
bindHistoryControls,
createRouteEditHistory,
@@ -12,7 +12,7 @@
* ========================================================================== */
import { clearDrafts, clearResults } from "../A00_Common/b_page_state";
import type { RouteDraft } from "../A00_Common/design/design_pipeline_types";
import type { RouteDraft } from "../A00_Common/design/logic/design_pipeline_types";
import { useDesignStore } from "../A00_Common/design/design_store";
import { currentRoute, remountRoute } from "../A00_Common/router";
import { hideLoadingOverlay, showLoadingOverlay, showToast } from "@ui/ui_template_elements";
@@ -21,7 +21,7 @@ import {
import {
prepareLayer,
prepareMetricPolylines,
} from "../B04_PreProcess/B04_PreProcess_UI_MapRender_Prepare";
} from "../B04_PreProcess/logic/B04_PreProcess_UI_MapRender_Prepare";
import type { VWorldMeta } from "../B04_PreProcess/B04_PreProcess_Api_Fetch";
/** 도엽 등고선의 표고 속성 이름 — B04 지도가 쓰는 것과 같은 키. */
@@ -19,7 +19,7 @@
import { svgElement, svgText } from "@util/common_util_svg";
import type { ContentBounds } from "../A00_Common/b_svg_zoom_pan";
import type { CrossSection } from "./../B06_Section/B06_Section_Api_Fetch";
import { fillSlopeLengths, toeOffsets } from "./../B06_Section/B06_Section_UI_Cross_Fit";
import { fillSlopeLengths, toeOffsets } from "../B06_Section/logic/B06_Section_UI_Cross_Fit";
import type { CrossPreviewResponse } from "./B05_Profile_Api_Replan";
/** 그림 가장자리 여백(px) — 위는 범례 한 줄, 아래는 눈금 안내 한 줄 몫이다. */
@@ -10,13 +10,13 @@
* 들고 간다. 두 벌로 두면 교각이 바뀔 때 서로 어긋난다(`_Edits.ts` 설명 참고).
* ========================================================================== */
import type { EditedCurve, EditedNode, Vertex } from "./B05_Profile_UI_RouteEdit_Curve";
import type { EditedCurve, EditedNode, Vertex } from "./logic/B05_Profile_UI_RouteEdit_Curve";
import {
curveOptionalAt,
deflectionRad,
radiusFloorM,
type CurveLock,
} from "./B05_Profile_UI_RouteEdit_Edits";
} from "./logic/B05_Profile_UI_RouteEdit_Edits";
import {
centerDirectionOf,
createCurveLabel,
@@ -13,7 +13,7 @@
* 초안은 `fromPage` 로 편집기 새 걸음이 됨. 사진첩이 없으면 편집기 사진 그대로.
* ========================================================================== */
import type { RouteDraft } from "../A00_Common/design/design_pipeline_types";
import type { RouteDraft } from "../A00_Common/design/logic/design_pipeline_types";
import { pageHistory } from "./B05_Profile_UI_Profile_History";
import {
sameLine,
@@ -9,7 +9,7 @@
* ========================================================================== */
import { draftProjectId, useDesignStore } from "../A00_Common/design/design_store";
import type { Vertex } from "./B05_Profile_UI_RouteEdit_Curve";
import type { Vertex } from "./logic/B05_Profile_UI_RouteEdit_Curve";
import {
type FootprintStrokeKind,
type FootprintValue,
@@ -10,7 +10,7 @@ import type {
RouteInitialLogic,
RouteInitialWeights,
} from "./B05_Profile_Api_RouteInitial";
import { flattenServerPlan } from "./B05_Profile_UI_RouteEdit_Edits";
import { flattenServerPlan } from "./logic/B05_Profile_UI_RouteEdit_Edits";
import type { RouteEditSnapshot } from "./B05_Profile_UI_RouteEdit_History";
import { parseBalance, type BalanceProfile } from "./B05_Profile_UI_RouteEdit_Recommend_Profile";
@@ -17,7 +17,7 @@ import { pickPx, wheelZoomsIn } from "../A00_Common/touch_bridge";
import { computeMaxScale, type ViewState } from "../B04_PreProcess/B04_PreProcess_UI_MapRender";
import type { VWorldMeta } from "../B04_PreProcess/B04_PreProcess_Api_Fetch";
import type { StationLabelBox } from "../B04_PreProcess/B04_PreProcess_UI_MapOverlays";
import { curveArcVertices, type EditedCurve } from "./B05_Profile_UI_RouteEdit_Curve";
import { curveArcVertices, type EditedCurve } from "./logic/B05_Profile_UI_RouteEdit_Curve";
/** 배수유역도와 같은 값 — 한 번에 얼마나 확대·축소할지. */
const ZOOM_IN_FACTOR = 1.15;
@@ -22,11 +22,14 @@
import { createButton } from "@ui/ui_template_elements";
import { numberField, toggleButton } from "./B05_Profile_UI_Panel_Fields";
import { CURVE_OPTIONAL_INNER_ANGLE_DEG, type CurveLock } from "./B05_Profile_UI_RouteEdit_Edits";
import {
CURVE_OPTIONAL_INNER_ANGLE_DEG,
type CurveLock,
} from "./logic/B05_Profile_UI_RouteEdit_Edits";
// `deflectionRad` 는 화면을 안 만지는 셈이라 `_Edits.ts` 로 옮겼다(2026-09-12) — 순수
// 함수가 DOM 파일에 얹혀 있으면 시험이 화면째 들여와야 한다. 재수출로 부르던 자리를 지킨다.
export { deflectionRad } from "./B05_Profile_UI_RouteEdit_Edits";
export { deflectionRad } from "./logic/B05_Profile_UI_RouteEdit_Edits";
/** 곡선 중심이 있는 **화면 방향**(단위벡터) — 패널을 그 반대쪽에 붙이는 데 쓴다.
*
@@ -16,7 +16,7 @@ import {
type EditedCurve,
type EditedNode,
type Vertex,
} from "./B05_Profile_UI_RouteEdit_Curve";
} from "./logic/B05_Profile_UI_RouteEdit_Curve";
import {
arcAtScreen,
handleAtScreen,
@@ -30,7 +30,7 @@ import {
radiusFloorM,
shortfallCrossed,
type CurveLock,
} from "./B05_Profile_UI_RouteEdit_Edits";
} from "./logic/B05_Profile_UI_RouteEdit_Edits";
/** 노드를 잡았다고 볼 거리(px). 손가락·마우스 모두 무리 없는 크기. */
const NODE_HIT_PX = 9;
@@ -24,10 +24,10 @@ import {
drawStationTicks,
type StationLabelBox,
} from "../B04_PreProcess/B04_PreProcess_UI_MapOverlays";
import type { EditedCurve, EditedNode, Vertex } from "./B05_Profile_UI_RouteEdit_Curve";
import type { EditedCurve, EditedNode, Vertex } from "./logic/B05_Profile_UI_RouteEdit_Curve";
import { contourBandRect, setStationLabelBoxes } from "./B05_Profile_UI_RouteEdit_Input";
import type { CrossWatch } from "./B05_Profile_UI_RouteEdit_Cross";
import { stationFrameAt } from "./B05_Profile_UI_RouteEdit_Frame";
import { stationFrameAt } from "./logic/B05_Profile_UI_RouteEdit_Frame";
import type { MeasureMark } from "./B05_Profile_UI_RouteEdit_Measure";
import { stationLabel as formatStation } from "../common_util/common_util_station";
import { arcLocked, straightLocked } from "./B05_Profile_UI_RouteEdit_Lock";
@@ -11,8 +11,8 @@
* ========================================================================== */
import type { StructureType } from "./B05_Profile_Api_Structures";
import { ruleDefaults, ruleStates } from "./B05_Profile_UI_Structures_Define";
import { isOptionVisible } from "./B05_Profile_UI_Structures_Summary";
import { ruleDefaults, ruleStates } from "./logic/B05_Profile_UI_Structures_Define";
import { isOptionVisible } from "./logic/B05_Profile_UI_Structures_Summary";
/** 시설 폼이 가릴 옵션 키 — 「구조물 옵션 보이기」에서 끈 것 + 정의 「안 씀」. */
export function hiddenOptionKeys(type: StructureType | null): string[] {
@@ -7,8 +7,8 @@
* 저장은 누가거리(m), 화면 입출력만 측점번호+잔여거리.
* ========================================================================== */
import { chainageToStation, stationToChainage } from "./B05_Profile_Util_Station";
import { DEFAULT_BASIN_SHAPE } from "../B06_Section/B06_Section_UI_Cross_Culvert_Basin";
import { chainageToStation, stationToChainage } from "./logic/B05_Profile_Util_Station";
import { DEFAULT_BASIN_SHAPE } from "../B06_Section/logic/B06_Section_UI_Cross_Culvert_Basin";
import { fillPipeHeights } from "../common_util/common_util_culvert_sets";
import { snapStructureStation } from "../common_util/common_util_structure_station";
@@ -17,13 +17,13 @@
import { openItemPicker } from "@ui/ui_template_item_picker";
import { pipeStructureId } from "@ui/ui_template_item_picker_project";
import type { StructureType } from "./B05_Profile_Api_Structures";
import { hiddenFormKeys } from "./B05_Profile_UI_Drainage_Facility_Merge";
import { hiddenFormKeys } from "./logic/B05_Profile_UI_Drainage_Facility_Merge";
import { buildSummaryRow, type SummaryRow } from "./B05_Profile_UI_Structures_Summary_Row";
import { isOptionVisible } from "./B05_Profile_UI_Structures_Summary";
import { SHAPE_FIELDS, shapeFields, shapeKey } from "./B05_Profile_UI_Structures_Define";
import { isOptionVisible } from "./logic/B05_Profile_UI_Structures_Summary";
import { SHAPE_FIELDS, shapeFields, shapeKey } from "./logic/B05_Profile_UI_Structures_Define";
import { numberInput } from "./B05_Profile_UI_Structures_Fields";
import { grid, group as boxOf, labeled, stepper } from "./B05_Profile_UI_Drainage_Facility_Fields";
import { specFor } from "../A00_Common/design/design_structure_pipe";
import { specFor } from "../A00_Common/design/logic/design_structure_pipe";
import {
GROUP_JOIN,
type GroupItems,
@@ -22,7 +22,7 @@ import {
summaryTooltip,
type SummaryItem,
} from "../common_util/common_util_summary_item";
import { specFor } from "../A00_Common/design/design_structure_pipe";
import { specFor } from "../A00_Common/design/logic/design_structure_pipe";
import { PIPE_MATCH_M } from "../A00_Common/design/design_selection";
import { pipeExtraCount } from "../A00_Common/design/design_structure_pipe_calc";
import {
@@ -30,9 +30,9 @@ import {
isNone,
linkOf,
readState,
} from "../A00_Common/design/design_structure_spec";
import { withLegacyGuards } from "../A00_Common/design/design_structure_ford";
import { asRoad } from "./B05_Profile_UI_Structures_Define";
} from "../A00_Common/design/logic/design_structure_spec";
import { withLegacyGuards } from "../A00_Common/design/logic/design_structure_ford";
import { asRoad } from "./logic/B05_Profile_UI_Structures_Define";
export interface StructureListParams {
/** 목록을 담을 <ul>. 그릴 때마다 통째로 갈아 끼운다. */
@@ -22,7 +22,7 @@ import {
type StructureType,
} from "./B05_Profile_Api_Structures";
import { etcName, numberDuplicateNames } from "./B05_Profile_UI_Structures_List";
import { balloonLines, type ContainerCount } from "./B05_Profile_UI_Structures_Balloon";
import { balloonLines, type ContainerCount } from "./logic/B05_Profile_UI_Structures_Balloon";
import { stationLabel as formatStation } from "../common_util/common_util_station";
import { frameOf } from "../common_util/common_util_view_window";
import { catalogRow } from "../common_util/common_util_structure_catalog";
@@ -43,7 +43,7 @@ import {
} from "./B05_Profile_UI_Structures_Panel_Commit";
import { renderStructureList } from "./B05_Profile_UI_Structures_List";
import { addsAtOnce, finishAdd } from "./B05_Profile_UI_Structures_Panel_AddAt";
import { showsAnchor } from "./B05_Profile_UI_Structures_Define";
import { showsAnchor } from "./logic/B05_Profile_UI_Structures_Define";
import { hiddenOptionKeys } from "./B05_Profile_UI_Structures_Define_Form";
import { stationLabel as formatStation } from "../common_util/common_util_station";
import { PIPE_MATCH_M, resolveSelection } from "../A00_Common/design/design_selection";
@@ -18,11 +18,11 @@ import type { PipeFacility } from "../B04_PreProcess/B04_PreProcess_Api_Fetch";
import type { FacilityAttributes, FacilityOptionsForm } from "./B05_Profile_UI_Drainage_Facility";
import type { StationFields } from "./B05_Profile_UI_Structures_Fields";
import { splitPavementRange } from "./B05_Profile_UI_Structures_Pavement";
import { mergeStructureOptions } from "./B05_Profile_UI_Structures_Summary";
import { mergeStructureOptions } from "./logic/B05_Profile_UI_Structures_Summary";
import { readStructureSpec, specRenderedKeys } from "./B05_Profile_UI_Structures_Spec";
import { asRoad } from "./B05_Profile_UI_Structures_Define";
import { asRoad } from "./logic/B05_Profile_UI_Structures_Define";
import type { GroupBoxes } from "./B05_Profile_UI_Structures_Groups";
import { specFor } from "../A00_Common/design/design_structure_pipe";
import { specFor } from "../A00_Common/design/logic/design_structure_pipe";
import { snapStructureStation } from "../common_util/common_util_structure_station";
import {
readGroupItems,
@@ -14,7 +14,7 @@ import {
type StructureType,
} from "./B05_Profile_Api_Structures";
import type { StructuresCommitContext } from "./B05_Profile_UI_Structures_Panel_Commit";
import { asRoad } from "./B05_Profile_UI_Structures_Define";
import { asRoad } from "./logic/B05_Profile_UI_Structures_Define";
import { readState, writeState } from "../A00_Common/b_page_state";
import { NO_SELECTION, PIPE_MATCH_M, selectDesign } from "../A00_Common/design/design_selection";
import { readGroupItems, readSummaryItem } from "../common_util/common_util_summary_item";
@@ -18,13 +18,17 @@ import {
ruleDefaults,
ruleStates,
staleValues,
} from "./B05_Profile_UI_Structures_Define";
import { FORM_OPTION_KEYS } from "./B05_Profile_UI_Drainage_Facility_Merge";
} from "./logic/B05_Profile_UI_Structures_Define";
import { FORM_OPTION_KEYS } from "./logic/B05_Profile_UI_Drainage_Facility_Merge";
import { stepper } from "./B05_Profile_UI_Drainage_Facility_Fields";
import { specFor } from "../A00_Common/design/design_structure_pipe";
import { specFor } from "../A00_Common/design/logic/design_structure_pipe";
import { baseType } from "../common_util/common_util_structure_catalog";
import { paintStructureSpec, specOwnedKeys } from "./B05_Profile_UI_Structures_Spec";
import { solveSplit, specKeys, type SplitRole } from "../A00_Common/design/design_structure_spec";
import {
solveSplit,
specKeys,
type SplitRole,
} from "../A00_Common/design/logic/design_structure_spec";
/** 종류 단위 「구조물 조합」 줄을 가릴 종류인지 — 구조물 명세 컨테이너 · 정의 그룹 상자(그룹마다 잇기 줄)로
* 그리는 종류(PLAN 52-1 · 52-6b · 52-7) · 종단배수(B군 · 조합 잇기 없음 · 표 07). */
@@ -20,7 +20,7 @@ import {
} from "./B05_Profile_Api_Structures";
import type { DesignSelection, ResolvedSelection } from "../A00_Common/design/design_selection";
import type { GroupItems, SummaryItem } from "../common_util/common_util_summary_item";
import { specFor } from "../A00_Common/design/design_structure_pipe";
import { specFor } from "../A00_Common/design/logic/design_structure_pipe";
import { catalogRow } from "../common_util/common_util_structure_catalog";
/** 구조물군 표시 이름. 리스트 기호(A~G)만으로는 무엇인지 알기 어렵다.
@@ -15,10 +15,10 @@ import {
type SpecFormHooks,
type SpecLinks,
} from "../A00_Common/design/design_structure_form";
import { specFor } from "../A00_Common/design/design_structure_pipe";
import { ADDON_SPECS } from "../A00_Common/design/design_structure_slope_tier";
import { specFor } from "../A00_Common/design/logic/design_structure_pipe";
import { ADDON_SPECS } from "../A00_Common/design/logic/design_structure_slope_tier";
import { baseType } from "../common_util/common_util_structure_catalog";
import { specKeys, type StructureSpec } from "../A00_Common/design/design_structure_spec";
import { specKeys, type StructureSpec } from "../A00_Common/design/logic/design_structure_spec";
import { hiddenOptionKeys, optionDefaults } from "./B05_Profile_UI_Structures_Fields";
import type { WideningBox } from "./B05_Profile_UI_Structures_Widening";
@@ -13,7 +13,7 @@ import {
wideningArea,
wideningRuns,
type WideningRun,
} from "../A00_Common/design/design_structure_widening";
} from "../A00_Common/design/logic/design_structure_widening";
import { stationLabel } from "../common_util/common_util_station";
import { group } from "./B05_Profile_UI_Drainage_Facility_Fields";
+2 -2
View File
@@ -11,8 +11,8 @@
① 짝(ts ↔ py · 거울 시험):
- `UI_RouteEdit_Curve.ts` ↔ `common_util_route_polyline.py` · `test_route_polyline_browser_mirror.py`
- `UI_RouteEdit_Frame.ts` ↔ `Engine_Sections_Core.py`(측점 틀 · 스냅) · `test_b05_routeedit_frame_mirror.py` · `test_224_2_station_snap.py`
- `logic/UI_RouteEdit_Curve.ts` ↔ `common_util_route_polyline.py` · `test_route_polyline_browser_mirror.py`
- `logic/UI_RouteEdit_Frame.ts` ↔ `Engine_Sections_Core.py`(측점 틀 · 스냅) · `test_b05_routeedit_frame_mirror.py` · `test_224_2_station_snap.py`
- `UI_Drainage_Facility.ts` carryIndices ↔ `common_util_drainage_pipes.py` · `test_b05_facility_carry.py`
- `logic/B05_Profile_PlanFootprint.ts` ↔ `B07_DesignDetail_Engine_Cad_PlanSlope.py` · `test_346_2_plan_footprint_mirror.py`
- 지형 표본 = `common_util_surface_sampler.build_surface_sampler` 하나 · 2 m 비용면은 노선 추천 점수만
@@ -15,7 +15,7 @@ import type {
CrossStationResult,
PipelineStation,
StageContext,
} from "../../A00_Common/design/design_pipeline_types";
} from "../../A00_Common/design/logic/design_pipeline_types";
import {
footprintLines,
footprintRecord,
@@ -7,7 +7,7 @@
* 조각이 바뀌는 점은 앞뒤 조각이 함께 가짐(선이 끊겨 보이지 않게 · `splitRuns` 와 같은 규칙).
* ========================================================================== */
import type { PlanFootprint, Vertex } from "../../A00_Common/design/design_pipeline_types";
import type { PlanFootprint, Vertex } from "../../A00_Common/design/logic/design_pipeline_types";
export type FootprintStrokeKind = "road" | "cut" | "fill" | "slope";
+1 -1
View File
@@ -14,7 +14,7 @@ import {
chainageKey,
type AlignmentEdits,
type AlignmentNode,
} from "../B05_Profile_UI_Profile_Alignment";
} from "./B05_Profile_UI_Profile_Alignment";
/** 같은 정점으로 볼 거리(m) — 파이썬 `SAME_VERTEX_M` 짝. */
export const SAME_VERTEX_M = 1e-3;
@@ -13,7 +13,7 @@ import {
evaluateAt,
type AlignmentNode,
type AlignmentPolicy,
} from "../B05_Profile_UI_Profile_Alignment";
} from "./B05_Profile_UI_Profile_Alignment";
/** 종단 지반 표본 한 점 — 저장 종단 `samples[]` 꼴. */
export interface GroundSample {
@@ -9,7 +9,7 @@
import { computeMassHaulSeries, type MassHaulSeries } from "@util/common_util_mass_haul";
import type { EarthworkConversion, MassHaulSection } from "@util/common_util_mass_haul_types";
import type { StageContext } from "../../A00_Common/design/design_pipeline_types";
import type { StageContext } from "../../A00_Common/design/logic/design_pipeline_types";
export interface MassHaulStageContext {
conversion: EarthworkConversion;
@@ -22,8 +22,8 @@ import type {
CrossOutput,
GroundOutput,
PipelineStation,
} from "../../A00_Common/design/design_pipeline_types";
import type { ProfileAlignment } from "../B05_Profile_UI_Profile_Alignment";
} from "../../A00_Common/design/logic/design_pipeline_types";
import type { ProfileAlignment } from "./B05_Profile_UI_Profile_Alignment";
import { stationLabel } from "../../common_util/common_util_station";
import { stationIdOf } from "./B05_Profile_Pipeline_Grade";
@@ -1,7 +1,7 @@
/* =============================================================================
* B05_Profile_Pipeline_Grade.ts
* 계산 묶음(PLAN 346-1) **follow · planline · profile 단계** + 바뀐 범위 — 계약 =
* `A00_Common/design/design_pipeline_types.ts`. 셈은 이미 있는 짝을 부르기만(어댑터):
* `A00_Common/design/logic/design_pipeline_types.ts`. 셈은 이미 있는 짝을 부르기만(어댑터):
*
* follow — 관 · 구조물 좌표 따라감(`common_util_route_follow`) · 계획고 편집 옮김(`Grade_Carry`
* `carryProfileEdits` 의 edits 몫 · 옛 노선 `before.route` 가 있을 때만).
@@ -17,7 +17,7 @@ import type {
RangePart,
StageFn,
Vertex,
} from "../../A00_Common/design/design_pipeline_types";
} from "../../A00_Common/design/logic/design_pipeline_types";
import {
followStructures,
projectPipePoints,
@@ -29,7 +29,7 @@ import {
emptyEdits,
type AlignmentBase,
type AlignmentEdits,
} from "../B05_Profile_UI_Profile_Alignment";
} from "./B05_Profile_UI_Profile_Alignment";
import { carryProfileEdits, changedSpan } from "./B05_Profile_Grade_Carry";
import { groundFollowingBasePvi, groundProfile } from "./B05_Profile_Grade_Ground";
@@ -22,10 +22,10 @@ import type {
StageFn,
StationGround,
Vertex,
} from "../../A00_Common/design/design_pipeline_types";
} from "../../A00_Common/design/logic/design_pipeline_types";
import { type DtmGrid, heightAt } from "../../common_util/common_util_surface_sampler";
import { buildEditedPolyline } from "../B05_Profile_UI_RouteEdit_Curve";
import { applyArcLocks } from "../B05_Profile_UI_RouteEdit_Edits";
import { buildEditedPolyline } from "./B05_Profile_UI_RouteEdit_Curve";
import { applyArcLocks } from "./B05_Profile_UI_RouteEdit_Edits";
import {
crossOffsets,
longitudinalPoints,
@@ -11,7 +11,7 @@
* 순수 계산 — 화면 · three · fetch · sessionStorage 없음 · 좌표 = 사업지 m · 오프셋 좌(+) · 우(-).
* ========================================================================== */
import type { PlanFootprint, Vertex } from "../../A00_Common/design/design_pipeline_types";
import type { PlanFootprint, Vertex } from "../../A00_Common/design/logic/design_pipeline_types";
/** 횡단 설계선 · 지반 표본 한 점(`CrossDesignEdge` · `CrossGroundSample` 꼴). */
export interface FootprintPoint {
@@ -16,7 +16,7 @@
import { type DtmGrid, heightAt } from "../../common_util/common_util_surface_sampler";
import type { CrossDesignEdge } from "../../common_util/common_util_cross_design";
import { stationFrameAt, stationsAlong } from "../B05_Profile_UI_RouteEdit_Frame";
import { stationFrameAt, stationsAlong } from "./B05_Profile_UI_RouteEdit_Frame";
type Vertex = [number, number];
@@ -1,8 +1,8 @@
/* =============================================================================
* B05_Profile/logic/B05_Profile_Sections_Stations.ts
* 측점 한 벌(PLAN 344-3 뼈대 · 346-1) — 그린 노선 + 관 · 구조물 → 측점(지반 null). 계산 묶음 stations
* 단계(`A00_Common/design/design_pipeline_stations.ts`)가 부름. 측점 열쇠 규칙 한 곳(`stationKey` ·
* 계약 = `A00_Common/design/design_pipeline_types.ts` 머리).
* 단계(`A00_Common/design/logic/design_pipeline_stations.ts`)가 부름. 측점 열쇠 규칙 한 곳(`stationKey` ·
* 계약 = `A00_Common/design/logic/design_pipeline_types.ts` 머리).
*
* ⚠ 파이썬·TS 짝 — `B05_Profile_Engine_Sections_Core.py` `generate_sections` 의 측점 부분
* (격자 · 스냅 · 구조물 측점 병합 · 종류 · 틀 · 방위각) ↔ `buildStations` ·
@@ -20,7 +20,7 @@ import {
snapCurveStations,
stationFrameAt,
stationsAlong,
} from "../B05_Profile_UI_RouteEdit_Frame";
} from "./B05_Profile_UI_RouteEdit_Frame";
import {
planStations,
type PlanPipe,
@@ -33,7 +33,7 @@ import type {
PipelineStation,
StationKind,
Vertex,
} from "../../A00_Common/design/design_pipeline_types";
} from "../../A00_Common/design/logic/design_pipeline_types";
/** 짝: `config_system_design.py` 같은 이름. */
export const SECTION_STATION_INTERVAL_M = 20.0;
@@ -7,9 +7,9 @@
* (`... from "./B05_Profile_UI_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 { 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";
export interface CorridorRibbon {
kind: CorridorKind;
@@ -10,8 +10,8 @@
* 테이퍼가 생긴다. 접속 길이 기준 = **인접 측점까지**(2026-08-24 사용자 확정).
* ========================================================================== */
import type { OffsetPoint, StationPieces, XY } from "./B05_Profile_UI_Corridor_Station";
import type { RoutePoint } from "./B05_Profile_Api_Fetch";
import type { OffsetPoint, StationPieces, XY } from "../B05_Profile_UI_Corridor_Station";
import type { RoutePoint } from "../B05_Profile_Api_Fetch";
/** 제어점 하나 — 그 누가거리에서 쓸 단면과 출처. */
export interface PieceControl {

Some files were not shown because too many files have changed in this diff Show More