From b371a707f28dab781a23f2cf973c43b716bf1dfe Mon Sep 17 00:00:00 2001 From: umsangdon Date: Tue, 27 Oct 2026 21:24:23 +0900 Subject: [PATCH] =?UTF-8?q?feat(567-4):=20E04=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=EB=B3=B8=20=EA=B8=B0=EB=91=A5=20=EC=88=98=20=C2=B7=20100=20?= =?UTF-8?q?=EB=AF=B8=EB=A7=8C=20=EA=B2=BD=EA=B3=A0=20=EC=98=AE=EA=B9=80=20?= =?UTF-8?q?+=20=EA=B2=B0=EA=B3=BC=20=EC=B9=B8=20=E3=80=8C=ED=99=9C?= =?UTF-8?q?=EB=8F=99=EC=B2=B4=20=EA=B8=B0=EB=91=A5=20=EC=88=98=E3=80=8D=20?= =?UTF-8?q?=EC=A4=84=20=C2=B7=20=EB=B0=B0=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- E04_Stab3D/E04_Stab3D_Run.py | 4 ++++ E04_Stab3D/E04_Stab3D_UI_Page.ts | 5 +++++ E04_Stab3D/logic/E04_Stab3D_Raster.ts | 3 +++ resources/tester/test_533_3_e04_router.py | 3 ++- ui_template/ui_template_locale_e04.ts | 2 ++ 5 files changed, 16 insertions(+), 1 deletion(-) diff --git a/E04_Stab3D/E04_Stab3D_Run.py b/E04_Stab3D/E04_Stab3D_Run.py index 2b40fcaaf..9569498ee 100644 --- a/E04_Stab3D/E04_Stab3D_Run.py +++ b/E04_Stab3D/E04_Stab3D_Run.py @@ -285,6 +285,8 @@ def run_engine( "truncated_ratio": float(best["truncated_ratio"]), "floor": _floor(strata, best), "cells": [int(i) for i in best["cells"]], + "columns": int(best.get("columns") or len(best["cells"])), + "few_columns": bool(best.get("few_columns")), }, "trials": int(res.trials), "reference_fs": reference_fs(ground, settings["condition"]), @@ -355,6 +357,8 @@ def pack( }, "chainage_m": float(_nearest_chainage(stations, *where)), "cells": int(np.isfinite(f).sum()), + "columns": best.get("columns"), + "few_columns": bool(best.get("few_columns")), "trials": int(raw.get("trials") or 0), }, } diff --git a/E04_Stab3D/E04_Stab3D_UI_Page.ts b/E04_Stab3D/E04_Stab3D_UI_Page.ts index d855b06a8..bf8562983 100644 --- a/E04_Stab3D/E04_Stab3D_UI_Page.ts +++ b/E04_Stab3D/E04_Stab3D_UI_Page.ts @@ -11,6 +11,7 @@ import "./E04_Stab3D_UI_Style.css"; import { API_BASE_URL, CURRENT_PROJECT_ID_KEY, ROUTES } from "@config/config_frontend"; import { attachCollapsible, createPanelCard } from "@ui/ui_template_collapsible"; +import { createBadge } from "@ui/ui_template_badge"; import { createBanner } from "@ui/ui_template_banner"; import { createButton, el, showToast } from "@ui/ui_template_elements"; import { createEmpty } from "@ui/ui_template_empty"; @@ -341,6 +342,7 @@ export function renderE04Stab3D(root: HTMLElement): void { ["E04_Result_Hovland", s.by_method.hovland.toFixed(3)], ["E04_Result_Where", station(nearest?.chainage_m ?? s.chainage_m)], ["E04_Result_Cells", s.cells.toLocaleString()], + ["E04_Result_Columns", s.columns == null ? "-" : s.columns.toLocaleString()], ["E04_Result_Trials", s.trials.toLocaleString()], ["E04_Result_Time", `${result.elapsed_s.toFixed(1)} s`], ]; @@ -352,6 +354,9 @@ export function renderE04Stab3D(root: HTMLElement): void { cell.append(chip); } cell.append(value); + if (key === "E04_Result_Columns" && s.few_columns) { + cell.append(" ", createBadge(t("E04_Result_FewColumns"), "warning", { size: 18 })); + } return { label: t(key), value: cell, diff --git a/E04_Stab3D/logic/E04_Stab3D_Raster.ts b/E04_Stab3D/logic/E04_Stab3D_Raster.ts index 7cbb809bf..4c8023fd7 100644 --- a/E04_Stab3D/logic/E04_Stab3D_Raster.ts +++ b/E04_Stab3D/logic/E04_Stab3D_Raster.ts @@ -40,6 +40,9 @@ export interface Summary3d { method: string; chainage_m: number; cells: number; + /** 임계 활동체 기둥 수 · 100 미만이면 few_columns (옛 저장본은 없음) */ + columns?: number | null; + few_columns?: boolean; trials: number; condition: string; reference_fs: number; diff --git a/resources/tester/test_533_3_e04_router.py b/resources/tester/test_533_3_e04_router.py index 1b418129e..a07ebcc30 100644 --- a/resources/tester/test_533_3_e04_router.py +++ b/resources/tester/test_533_3_e04_router.py @@ -38,7 +38,7 @@ def _fake_engine(root, stations, ground, settings, on_progress, should_stop): "x": 101.0, "y": 201.0, "z": 505.0, "r": 6.0, "ratio": 1.0, "azimuth_deg": 0.0, "f": 0.9, "volume": 120.0, "method": 0, "hovland": 0.85, "bishop": 0.9, "janbu_corrected": 0.95, "truncated_ratio": 0.0, - "floor": [], + "floor": [], "columns": 42, "few_columns": True, }, "trials": 7, "reference_fs": 1.5, @@ -111,6 +111,7 @@ def test_analyze_cached_force_and_result(client, project, monkeypatch): done = _wait(client) assert done["error"] is None and done["percent"] == 100 assert done["summary"]["cells"] == 5 and done["summary"]["verdict"] == "ng" + assert done["summary"]["columns"] == 42 and done["summary"]["few_columns"] is True assert done["summary"]["by_method"] == {"hovland": 0.85, "bishop": 0.9, "janbu_corrected": 0.95} # 같은 입력 = 셈하지 않음 again = client.post(f"/api/projects/{PID}/stab/analyze3d", json=BODY).json() diff --git a/ui_template/ui_template_locale_e04.ts b/ui_template/ui_template_locale_e04.ts index 73d26b435..5997a9cfd 100644 --- a/ui_template/ui_template_locale_e04.ts +++ b/ui_template/ui_template_locale_e04.ts @@ -71,6 +71,8 @@ export const ui_locales_e04 = { E04_Result_Method: ["다스린 방법", "Governing method"], E04_Result_Where: ["위치 (가까운 측점)", "Location (nearest station)"], E04_Result_Cells: ["셀 수", "Cells"], + E04_Result_Columns: ["활동체 기둥 수", "Slip-body columns"], + E04_Result_FewColumns: ["100 미만 경고", "Under 100 - warning"], E04_Result_Trials: ["시험 활동면 수", "Trial surfaces"], E04_Result_Time: ["계산 시간", "Run time"], E04_Result_None: ["이 구간 결과가 없습니다 — [해석]을 누르세요.", "No result for this section."],