refactor(종단보기): 345-4 정리 — 빈 saveCorridorIfDirty 와 부르는 곳 지움 · B05 등고선 주소 두 곳 = contourAssetUrl(미리 받기와 같은 파일)
- 3D 뷰어 · 노선 편집 바탕 등고선이 같은 주소 한 벌(recalculate=false 붙음 · 보관함 한 칸) - 시험: test_345_4_contour_one_url 2 · 관련 250 통과 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VmC34fsxxbweEG3RUjs3Mn
This commit is contained in:
@@ -53,7 +53,6 @@ import {
|
|||||||
structureAnchorM,
|
structureAnchorM,
|
||||||
} from "../../B05_Profile/B05_Profile_Api_Structures";
|
} from "../../B05_Profile/B05_Profile_Api_Structures";
|
||||||
import { pipeToFacilityItem } from "../../B05_Profile/B05_Profile_UI_Structures_Panel_Types";
|
import { pipeToFacilityItem } from "../../B05_Profile/B05_Profile_UI_Structures_Panel_Types";
|
||||||
import { saveCorridorIfDirty } from "../../B05_Profile/B05_Profile_UI_Corridor";
|
|
||||||
import {
|
import {
|
||||||
profileSaveParts,
|
profileSaveParts,
|
||||||
type PageActionContext,
|
type PageActionContext,
|
||||||
@@ -404,10 +403,6 @@ export async function mountProfileView(
|
|||||||
}
|
}
|
||||||
profilePick.paint();
|
profilePick.paint();
|
||||||
},
|
},
|
||||||
// 보기를 떠나는 자리 = 코리도 영구저장 시점(2026-08-23 사용자 확정) — 이동은 막지 않는다.
|
|
||||||
onHide: () => {
|
|
||||||
if (state.latest?.route?.id) void saveCorridorIfDirty(activeProjectId, state.latest.route.id);
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/** [노선 반영] 끝 — 서버가 배수유역부터 다시 셌고 그 결과가 새 초기값이다. 새로고침 대신 페이지를
|
/** [노선 반영] 끝 — 서버가 배수유역부터 다시 셌고 그 결과가 새 초기값이다. 새로고침 대신 페이지를
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
import { showToast } from "@ui/ui_template_elements";
|
import { showToast } from "@ui/ui_template_elements";
|
||||||
import { updateContourInterval } from "../../B05_Profile/B05_Profile_Api_Fetch";
|
import { updateContourInterval } from "../../B05_Profile/B05_Profile_Api_Fetch";
|
||||||
import { refreshCorridor, saveCorridorIfDirty } from "../../B05_Profile/B05_Profile_UI_Corridor";
|
import { refreshCorridor } from "../../B05_Profile/B05_Profile_UI_Corridor";
|
||||||
import type { createLatestSource } from "../../B05_Profile/B05_Profile_UI_Page_Latest";
|
import type { createLatestSource } from "../../B05_Profile/B05_Profile_UI_Page_Latest";
|
||||||
import { toBounds } from "../../B05_Profile/B05_Profile_UI_Page_Helpers";
|
import { toBounds } from "../../B05_Profile/B05_Profile_UI_Page_Helpers";
|
||||||
import type { ViewControlCallbacks } from "../../B05_Profile/B05_Profile_UI_Panel_View";
|
import type { ViewControlCallbacks } from "../../B05_Profile/B05_Profile_UI_Panel_View";
|
||||||
@@ -64,8 +64,6 @@ export function createProfile3d(deps: Profile3dDeps) {
|
|||||||
);
|
);
|
||||||
// 측점 바·라벨·램프도 계획고를 따라 움직여야 한다(2026-08-23 지적 ③).
|
// 측점 바·라벨·램프도 계획고를 따라 움직여야 한다(2026-08-23 지적 ③).
|
||||||
deps.sections().renderStationLines(detail);
|
deps.sections().renderStationLines(detail);
|
||||||
// 만든 것을 **바로 올려 둔다**(2026-09-06) — 다음 진입이 네트워크 없이 선다.
|
|
||||||
void saveCorridorIfDirty(projectId, latest.route.id);
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -184,9 +184,6 @@ export async function ensureCorridor(
|
|||||||
return build;
|
return build;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 옛 올림 자리 — 3D 길 모형은 서버가 [저장]·[확정] 때 지음(342-2). 부르는 곳이 지워지면 함께 지움. */
|
|
||||||
export async function saveCorridorIfDirty(_projectId: string, _routeId: number): Promise<void> {}
|
|
||||||
|
|
||||||
/** ③ 사면이 읽을 측점 단면을 얹는다(115-1 · 저장본에는 안 담긴다). */
|
/** ③ 사면이 읽을 측점 단면을 얹는다(115-1 · 저장본에는 안 담긴다). */
|
||||||
function withSections(
|
function withSections(
|
||||||
build: CorridorBuildResult | null,
|
build: CorridorBuildResult | null,
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ import {
|
|||||||
invalidateSectionDetail,
|
invalidateSectionDetail,
|
||||||
saveCachedCrossPatches,
|
saveCachedCrossPatches,
|
||||||
} from "../B06_Section/B06_Section_Section_Store";
|
} from "../B06_Section/B06_Section_Section_Store";
|
||||||
import { saveCorridorIfDirty } from "./B05_Profile_UI_Corridor";
|
|
||||||
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 type { createStructuresBridge } from "./B05_Profile_UI_Page_Structures";
|
import type { createStructuresBridge } from "./B05_Profile_UI_Page_Structures";
|
||||||
@@ -87,9 +86,6 @@ export function profileSaveParts(ctx: PageActionContext): DesignViewSave {
|
|||||||
// 서버가 종단 정본의 계획선을 다시 썼다 — 공유 캐시를 비워 횡단 보기가 옛 계획선을 못 보게 한다.
|
// 서버가 종단 정본의 계획선을 다시 썼다 — 공유 캐시를 비워 횡단 보기가 옛 계획선을 못 보게 한다.
|
||||||
invalidateSectionDetail(projectId);
|
invalidateSectionDetail(projectId);
|
||||||
ctx.renderLatest(await ctx.loadLatest(true));
|
ctx.renderLatest(await ctx.loadLatest(true));
|
||||||
// 저장 = 코리도 영구저장 시점(2026-08-23) — 실패해도 저장은 성공 처리.
|
|
||||||
const routeId = ctx.latest()?.route?.id;
|
|
||||||
if (routeId) void saveCorridorIfDirty(projectId, routeId);
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,7 @@
|
|||||||
* 그리기·라벨·집기가 출처를 안 가리게 한다.
|
* 그리기·라벨·집기가 출처를 안 가리게 한다.
|
||||||
* ========================================================================== */
|
* ========================================================================== */
|
||||||
|
|
||||||
import { API_BASE_URL } from "@config/config_frontend";
|
import { contourAssetUrl, fetchCachedJson } from "../A00_Common/b_asset_cache";
|
||||||
import { fetchCachedJson } from "../A00_Common/b_asset_cache";
|
|
||||||
import {
|
import {
|
||||||
createNormalizer,
|
createNormalizer,
|
||||||
type GeoJsonCollection,
|
type GeoJsonCollection,
|
||||||
@@ -71,8 +70,7 @@ export async function loadRouteEditContours(
|
|||||||
// 3D 뷰어가 쓰는 것과 **같은 파일**이다 — 보관함에 있으면 다시 내려받지 않는다.
|
// 3D 뷰어가 쓰는 것과 **같은 파일**이다 — 보관함에 있으면 다시 내려받지 않는다.
|
||||||
const data = await fetchCachedJson<ContourResponse>(
|
const data = await fetchCachedJson<ContourResponse>(
|
||||||
projectId,
|
projectId,
|
||||||
`${API_BASE_URL}/projects/${projectId}/surface/models/${options.surfaceModelId}` +
|
contourAssetUrl(projectId, options.surfaceModelId, interval, options.smooth),
|
||||||
`/contour?interval=${interval}&smooth=${options.smooth}`,
|
|
||||||
);
|
);
|
||||||
const all = data.contours ?? [];
|
const all = data.contours ?? [];
|
||||||
const onUnit = (level: number): boolean => Math.abs(level % LAS_CONTOUR_UNIT_M) < 1e-6;
|
const onUnit = (level: number): boolean => Math.abs(level % LAS_CONTOUR_UNIT_M) < 1e-6;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { createTerrainCompass } from "@ui/ui_template_compass";
|
|||||||
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
|
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
|
||||||
import { PLYLoader } from "three/examples/jsm/loaders/PLYLoader.js";
|
import { PLYLoader } from "three/examples/jsm/loaders/PLYLoader.js";
|
||||||
import { API_BASE_URL } from "@config/config_frontend";
|
import { API_BASE_URL } from "@config/config_frontend";
|
||||||
import { fetchCachedBytes, fetchCachedJson } from "../A00_Common/b_asset_cache";
|
import { contourAssetUrl, fetchCachedBytes, fetchCachedJson } from "../A00_Common/b_asset_cache";
|
||||||
import { bindCursorPivotControls, TOP_VIEW_TILT } from "../B04_PreProcess/B04_PreProcess_UI_Camera";
|
import { bindCursorPivotControls, TOP_VIEW_TILT } from "../B04_PreProcess/B04_PreProcess_UI_Camera";
|
||||||
import {
|
import {
|
||||||
createRouteMarkers,
|
createRouteMarkers,
|
||||||
@@ -325,7 +325,7 @@ export function createRouteViewer(): RouteViewer {
|
|||||||
contours: Array<{ level: number; coordinates: [number, number, number][] }>;
|
contours: Array<{ level: number; coordinates: [number, number, number][] }>;
|
||||||
}>(
|
}>(
|
||||||
current.projectId,
|
current.projectId,
|
||||||
`${API_BASE_URL}/projects/${current.projectId}/surface/models/${current.modelId}/contour?interval=${interval}&smooth=${current.smooth}`,
|
contourAssetUrl(current.projectId, current.modelId, interval, current.smooth),
|
||||||
);
|
);
|
||||||
clearContours();
|
clearContours();
|
||||||
// 등고선 한 가닥마다 3D 객체를 만들면 수백 개가 된다. 주곡선·보조곡선 두 덩어리로 합친다.
|
// 등고선 한 가닥마다 3D 객체를 만들면 수백 개가 된다. 주곡선·보조곡선 두 덩어리로 합친다.
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
"""345-4 정리 — B05 등고선 주소 한 벌(`contourAssetUrl` · 미리 받기와 같은 파일) · 빈 saveCorridorIfDirty 지움."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
ROOT = Path(__file__).resolve().parents[2]
|
||||||
|
|
||||||
|
|
||||||
|
def _read(rel: str) -> str:
|
||||||
|
return (ROOT / rel).read_text(encoding="utf-8")
|
||||||
|
|
||||||
|
|
||||||
|
def test_B05_등고선_주소는_한_벌():
|
||||||
|
for rel in (
|
||||||
|
"B05_Profile/B05_Profile_UI_Viewer.ts",
|
||||||
|
"B05_Profile/B05_Profile_UI_RouteEdit_Contour.ts",
|
||||||
|
):
|
||||||
|
source = _read(rel)
|
||||||
|
assert "contourAssetUrl(" in source, rel
|
||||||
|
assert "/contour?interval" not in source, rel
|
||||||
|
# 미리 받기(b_asset_cache)도 같은 함수 — 주소가 같아야 보관함 한 칸을 같이 씀
|
||||||
|
assert "contourAssetUrl(projectId, confirmed.model_id, interval, smooth)" in _read(
|
||||||
|
"A00_Common/b_asset_cache.ts"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_빈_코리도_올림_함수_지움():
|
||||||
|
for rel in (
|
||||||
|
"B05_Profile/B05_Profile_UI_Corridor.ts",
|
||||||
|
"B05_Profile/B05_Profile_UI_Page_Actions.ts",
|
||||||
|
"A00_Common/design/design_view_profile.ts",
|
||||||
|
"A00_Common/design/design_view_profile_3d.ts",
|
||||||
|
):
|
||||||
|
assert "saveCorridorIfDirty" not in _read(rel), rel
|
||||||
Reference in New Issue
Block a user