diff --git a/B04_PreProcess/B04_PreProcess_Router.py b/B04_PreProcess/B04_PreProcess_Router.py index 00977c5c..a1df3a3d 100644 --- a/B04_PreProcess/B04_PreProcess_Router.py +++ b/B04_PreProcess/B04_PreProcess_Router.py @@ -432,8 +432,26 @@ async def get_confirmed_surface(project_id: UUID) -> SurfaceConfirmedResponse | "z_max": float(bounds[2, 1]), } - # 지도(2D) 초기 화면을 도로 기준으로 맞추기 위한 계획노선 범위(없으면 None). + # LAS 없이 설계한 프로젝트는 위 두 파일이 아예 없다(도엽등고선으로 만든 + # 서피스가 정본). 그때는 확정 모델 격자의 bounds를 그대로 쓴다 — 없으면 + # B05가 "지표면 범위 정보를 찾을 수 없습니다"로 3D를 못 띄운다(2026-08-30). project_root = processed_dir.parent.parent + if bounds_payload is None and confirmed and confirmed.get("model_file_path"): + model_path = project_root / str(confirmed["model_file_path"]) + if model_path.is_file(): + with np.load(model_path) as stored: + if "bounds" in stored: + bounds = np.asarray(stored["bounds"], dtype=np.float64) + bounds_payload = { + "x_min": float(bounds[0, 0]), + "x_max": float(bounds[0, 1]), + "y_min": float(bounds[1, 0]), + "y_max": float(bounds[1, 1]), + "z_min": float(bounds[2, 0]), + "z_max": float(bounds[2, 1]), + } + + # 지도(2D) 초기 화면을 도로 기준으로 맞추기 위한 계획노선 범위(없으면 None). route_bounds = planned_route_bounds(project_root, project_epsg_from_prj(project_root)) signature = "|".join(