From 773544e5cbad357c1b809ab8e28e61a1e4a46856 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Sun, 1 Nov 2026 23:08:18 +0900 Subject: [PATCH] =?UTF-8?q?feat(642):=20=EB=B6=84=EB=A5=98=20=EC=97=86?= =?UTF-8?q?=EC=9D=84=20=EB=95=8C=20=ED=99=95=EC=A0=95=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=20=C2=B7=20B04=20=EC=B2=98=EC=9D=8C=20=EA=B3=A0=EB=A6=84=20=3D?= =?UTF-8?q?=20ptd(=EC=A0=90=EC=A7=84=20TIN)=20=E2=80=94=20=EC=9D=B4?= =?UTF-8?q?=EC=9D=8C=20=EB=AA=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SURFACE_CONFIRM_DEFAULT_FILTER csf → ptd · B04 DEFAULT_FILTER csf → ptd(확정본 있으면 확정 필터가 먼저 = 분류 LAS 는 classification 그대로) - Engine_Ground resolve_auto_source_filters 설명 글 csf → ptd - 낡은 시험 고침 — test_640_lidar_default · test_637_lidar 의 자동 필터 · 지워지는 모델 이름 csf → ptd(요구 559 사용자 확정) Co-Authored-By: Claude Opus 5.5 --- B04_PreProcess/B04_PreProcess_Engine_Ground.py | 4 ++-- B04_PreProcess/B04_PreProcess_UI_Page.ts | 4 ++-- config/config_system_terrain.py | 2 +- resources/tester/test_637_lidar.py | 2 +- resources/tester/test_640_lidar_default.py | 6 +++--- 5 files changed, 9 insertions(+), 9 deletions(-) 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: