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

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