# PLAN ARCHIVE: B04 등고선 — 기본값(CSF+DTM) 외 조합에서 표시 안 됨 (2026-07-17) ## 활성 작업: B04 등고선 — 기본값(CSF+DTM) 외 조합에서 표시 안 됨 (2026-07-17) ### 증상 좌측 옵션에서 지면 필터(csf/pmf/grid_min_z) 또는 지표면 표현(tin/dtm/nurbs/implicit/meshfree)을 기본값(csf+dtm)에서 바꾸면 3D 뷰어에 등고선이 나타나지 않음. ### 원인 분석 (실 저장소 `storage/.../B04_wf1_Surface/models/` 캐시 파일 실증 확인) | # | 원인 | 근거 위치 | |---|---|---| | 1 | **간격 기본값 불일치 (핵심)**: 파이프라인 사전 캐시는 `contour_interval_meters=5.0`m로만 생성, 프론트 기본 간격은 `1.0`m → 캐시 파일명(`contour_{filter}_{method}_{interval}m.json`) 불일치로 항상 캐시 미스 → 모든 조합이 첫 조회 시 온디맨드 재계산 | `B04_wf1_Surface_Engine_Pipeline.py:57`, `B04_wf1_Surface_UI_TerrainViewer.ts:78`, `B04_wf1_Surface_Router.py:616-618` | | 2 | **온디맨드 계산은 실제로 동작하나 13~23초+ 소요, 그동안 UI 무피드백**: 오늘(07-17 18:06~18:14) 사용자 조작 시각에 `contour_pmf_dtm_smooth_1.0m.json` 등이 실제 생성됨 = 계산은 됨. 그러나 자동 로드 경로는 `void loadContourLines(...)`로 결과·진행을 무시 → 상태표시는 "표시 중"에 머물고, 사용자는 "계산 안 함"으로 인지 | `B04_wf1_Surface_UI_TerrainViewer.ts:344,366` | | 3 | **실패 침묵 2중**: (a) 파이프라인 사전 캐시 실패를 `except: pass`로 은폐 — 실제로 `contour_csf_nurbs_*.json`은 어떤 간격으로도 존재하지 않음(manifest는 nurbs csf "completed") (b) 프론트 `loadContourLines` 실패 시 `catch → return false`만 하고 사용자에게 알리지 않음 | `B04_wf1_Surface_Engine_Pipeline.py:272-273`, `B04_wf1_Surface_UI_TerrainViewer.ts:483-486` | | 4 | **무거운 표현의 1.0m 온디맨드 과부하**: nurbs(전 필터)·meshfree(전 필터)·비스무딩 tin 등은 1.0m 격자 온디맨드 산출물이 하나도 없음 — RBF/griddata/Delaunay를 1m 격자로 돌려 수십 초~수 분 소요 또는 실패 추정. Router는 `target_grid_m=1.0` 고정 | `B04_wf1_Surface_Router.py:648-655` | | 5 | (부수) 응답 경합 가드 없음: 선택을 빠르게 바꾸면 이전 모델의 등고선 응답이 늦게 도착해 새 화면에 그려질 수 있음 | `B04_wf1_Surface_UI_TerrainViewer.ts:379-388` | | 6 | (부수) 파이프라인 캐시 재사용 분기(`continue`)는 등고선 사전 캐시 존재를 보증하지 않음 → 재분석 시에도 누락 캐시가 복구되지 않음 | `B04_wf1_Surface_Engine_Pipeline.py:199-218` | ### 수정 방향 및 구현 체크리스트 - [x] **C1. 간격 기본값 정합**: 프론트 등고선 간격 기본값을 사전 캐시 간격(5.0m)과 일치시킴 (`intervalInput.value = "5.0"` + `resetOptions()` 동일 수정). 사용자가 간격을 바꾸면 그때만 온디맨드 계산. — `B04_wf1_Surface_UI_TerrainViewer.ts` - [x] **C2. 등고선 로딩 피드백**: 자동 로드 경로에서도 `statusSpan`에 "등고선 계산 중..." 표시, 완료/실패 시 결과 반영 (`void` 제거하고 결과 사용). — `B04_wf1_Surface_UI_TerrainViewer.ts` - [x] **C3. 실패 침묵 제거**: 파이프라인 `except: pass` → `logger.warning(...)`로 교체(빌드 무효화는 여전히 안 함). 프론트 실패 시 상태 문구 표시. — `B04_wf1_Surface_Engine_Pipeline.py`, `..._UI_TerrainViewer.ts` - [x] **C4. csf+nurbs 등고선 실패 원인 재현·수정**: `extract_contours(nurbs_csf.npz, "bspline_surface", ...)`를 venv로 직접 실행해 예외 확인 후 수정 (RectBivariateSpline 파라미터 추정). — `B04_wf1_Surface_Engine_Contour.py` - [x] **C5. 온디맨드 격자 해상도 적응화**: Router 고정 `target_grid_m=1.0` → 모델 범위 기반 적응(예: 격자 셀 수 상한 도입)으로 무거운 표현의 계산 시간 상한 확보. — `B04_wf1_Surface_Router.py` - [x] **C6. 응답 경합 가드**: `loadContourLines` 응답 도착 시 `currentModelId`·간격이 요청 시점과 같을 때만 그리기. — `B04_wf1_Surface_UI_TerrainViewer.ts` - [x] **C7. 캐시 재사용 분기에서 등고선 캐시 보증**: `_cache_is_valid` 통과(`continue`) 시에도 기본 간격 등고선 파일 부재면 `_cache_contours` 호출. — `B04_wf1_Surface_Engine_Pipeline.py` ### 검증 기준 - 15개 전 조합(3필터×5표현, 스무딩 on/off 포함)에서 등고선 표시 또는 명시적 실패 메시지 확인 - `contour_csf_nurbs_5.0m.json` 생성 확인 - 계산 중 상태 문구 노출 확인