diff --git a/B04_PreProcess/B04_PreProcess_Engine_Ground.py b/B04_PreProcess/B04_PreProcess_Engine_Ground.py index f5435e358..790805f5a 100644 --- a/B04_PreProcess/B04_PreProcess_Engine_Ground.py +++ b/B04_PreProcess/B04_PreProcess_Engine_Ground.py @@ -54,8 +54,8 @@ def resolve_auto_source_filters( """자동 전처리가 만들 필터를 입력 LAS를 보고 정한다. 첫 항목이 기본 확정값이다. 업체가 이미 지면을 분류해 놨으면 그것을 기본으로 쓴다 — 계산이 없고 품질도 가장 - 안정적이다. **csf는 분류가 있어도 함께 만든다** — csf 처리 결과를 눈으로 검증할 수 - 있어야 하기 때문이다 (2026-09-01 사용자 확정). 분류가 없으면 csf 하나만 남는다. + 안정적이다. **ptd(점진 TIN)는 분류가 있어도 함께 만든다** — 내장 필터 결과를 눈으로 + 검증할 수 있어야 하기 때문이다 (2026-09-01 사용자 확정). 분류가 없으면 ptd 하나만 남는다. 「분류 있음」 = 비율 문턱 + 덮임(일부만 분류된 LAS 거름) — 자동 고름에만(요구 558). """ usable = usable_conditional_filters(structured_data) diff --git a/B04_PreProcess/B04_PreProcess_UI_Page.ts b/B04_PreProcess/B04_PreProcess_UI_Page.ts index d3709fe53..09ccb24bc 100644 --- a/B04_PreProcess/B04_PreProcess_UI_Page.ts +++ b/B04_PreProcess/B04_PreProcess_UI_Page.ts @@ -53,7 +53,7 @@ import { currentProjectId, guardProjectLeave } from "../A00_Common/b_project_swi // 드롭다운에서 고를 때 그 조합만 계산한다 (2026-09-01 사용자 확정). const SOURCE_FILTERS = ["classification", "ptd", "grid_min_z", "csf", "pmf"] as const; const MODEL_METHODS = ["tin", "dtm", "nurbs", "implicit", "meshfree"] as const; -const DEFAULT_FILTER = "csf"; +const DEFAULT_FILTER = "ptd"; const DEFAULT_METHOD = "implicit"; // 확정 기본 표현(요구 558) — 확정본이 있으면 그것이 먼저 const ROUTE_STAGE = ROUTES.B05_PROFILE; // 도엽 서피스 보간 방식 버튼 순서 — 백엔드 SHEET_SURFACE_METHODS와 같은 차례로 둔다. @@ -494,7 +494,7 @@ export async function renderB04Surface(root: HTMLElement): Promise { ]); models = modelResponse.models; // 확정본과 같은 조합에서 시작해야 B05와 같은 파일을 보고, 보관함도 한 벌만 쓴다. - // 확정 이력이 없을 때만 개발 기본값(csf·implicit)으로 둔다. + // 확정 이력이 없을 때만 개발 기본값(ptd·implicit)으로 둔다. if (confirmed.model_id) { if (confirmed.source_filter) filterGroup.select.value = confirmed.source_filter; if (confirmed.method) methodGroup.select.value = confirmed.method; diff --git a/config/config_system_terrain.py b/config/config_system_terrain.py index 425610189..104a7e0eb 100644 --- a/config/config_system_terrain.py +++ b/config/config_system_terrain.py @@ -177,7 +177,7 @@ SHEET_SURFACE_AUTO_METHODS = [ ] # 일반 사용자 WF1 자동 확정 기본값 -SURFACE_CONFIRM_DEFAULT_FILTER = os.getenv("SURFACE_CONFIRM_DEFAULT_FILTER", "csf") +SURFACE_CONFIRM_DEFAULT_FILTER = os.getenv("SURFACE_CONFIRM_DEFAULT_FILTER", "ptd") # 확정 표현 = implicit · 평활 끔 — WF1 자동 짓기도 이 표현을 기본 필터에 지음(요구 558). SURFACE_CONFIRM_DEFAULT_METHOD = os.getenv("SURFACE_CONFIRM_DEFAULT_METHOD", "implicit") SURFACE_CONFIRM_DEFAULT_SMOOTH = ( diff --git a/resources/tester/test_637_lidar.py b/resources/tester/test_637_lidar.py index 8e0d81183..ab63aad3b 100644 --- a/resources/tester/test_637_lidar.py +++ b/resources/tester/test_637_lidar.py @@ -263,7 +263,7 @@ def test_B_뿌리_짓기_수치지형도_그대로_덮임(tmp_path: Path, monkey assert kept["meta"]["selection"] == target assert {m["source_filter"] for m in kept["models"]} == {"classification"} # 갈음 = 안 지은 필터(앞서 자동으로 지은 csf)는 옛 LAS 것 → 지움 · 수치지형도 그대로(637-3) - assert "B04_PreProcess/models/dtm_csf.npz" in kept["dropped"] + assert "B04_PreProcess/models/dtm_ptd.npz" in kept["dropped"] assert not list((tmp_path / b05.MODELS).glob("*_csf*")) and sheet.read_bytes() == b"sheet" diff --git a/resources/tester/test_640_lidar_default.py b/resources/tester/test_640_lidar_default.py index 6c2a776ef..fce1413c6 100644 --- a/resources/tester/test_640_lidar_default.py +++ b/resources/tester/test_640_lidar_default.py @@ -38,17 +38,17 @@ def test_확정_기본값은_implicit_평활_끔() -> None: assert cfg.SURFACE_AUTO_METHODS == ("dtm",) # D03 자체 라이다는 dtm 만 그대로 -def test_일부만_분류된_LAS_는_자동_기본에서_csf() -> None: +def test_일부만_분류된_LAS_는_자동_기본에서_ptd() -> None: points = _plane(100.0) partial = np.ones(len(points), dtype=np.uint8) partial[(points[:, 0] < 30) & (np.arange(len(points)) % 4 == 0)] = 2 # 비율 7 % · 덮임 30 % assert classified_coverage(_structured(points, partial)) < 0.5 - assert resolve_auto_source_filters(_structured(points, partial)) == ["csf"] + assert resolve_auto_source_filters(_structured(points, partial)) == ["ptd"] spread = np.ones(len(points), dtype=np.uint8) spread[::37] = 2 # 비율 2.7 % · 덮임 100 % assert classified_coverage(_structured(points, spread)) == 1.0 - assert resolve_auto_source_filters(_structured(points, spread)) == ["classification", "csf"] + assert resolve_auto_source_filters(_structured(points, spread)) == ["classification", "ptd"] def test_덮임은_저장본을_다시_씀(tmp_path: Path) -> None: