feat: 算法升级、整车配准集成与性能分析文档

算法更新: delivery v1.2.1、平整度v1.5、测距v2.2、整车配准v1.3
适配器: vehicle-registration 新增、各算法 manifest 和 adapter 更新
后端: taskCadFiles/source 字段迁移、derivedPointClouds 注册、取消任务联动
前端: ElapsedTime 时长显示、两步算法流程、canRun 逻辑修复
文档: 新增5份算法性能分析报告
This commit is contained in:
2026-06-25 08:22:20 +00:00
parent cec0766e67
commit 29f1d45d66
266 changed files with 1311475 additions and 2846 deletions

View File

@@ -43,19 +43,49 @@ def emit_progress(percent: float, message: str = "") -> None:
def write_result(out_dir: str | os.PathLike, payload: dict[str, Any]) -> Path:
"""写 result.json 到 outDir,并强制 schemaVersion / status 字段存在。
NaN/Infinity 会被替换为 null,确保输出合法 JSON。
自动发现 outDir 下的 Excel 产物(*.xlsx / *.xls),以相对路径写入
payload["files"],前端据此展示下载入口(适配器也可自行预置 files)。
"""
import math
def _sanitize(obj: Any) -> Any:
# numpy 标量 → Python 原生类型
try:
import numpy as np # type: ignore
if isinstance(obj, np.ndarray):
return _sanitize(obj.tolist())
if isinstance(obj, (np.floating,)):
f = float(obj)
return None if (math.isnan(f) or math.isinf(f)) else f
if isinstance(obj, (np.integer,)):
return int(obj)
if isinstance(obj, (np.bool_,)):
return bool(obj)
except ImportError:
pass
if isinstance(obj, float) and (math.isnan(obj) or math.isinf(obj)):
return None
if isinstance(obj, dict):
return {k: _sanitize(v) for k, v in obj.items()}
if isinstance(obj, list):
return [_sanitize(v) for v in obj]
if isinstance(obj, tuple):
return [_sanitize(v) for v in obj]
return obj
out_path = Path(out_dir) / "result.json"
out_dir = Path(out_dir)
excel_files: list[str] = list(payload.get("files") or [])
for pattern in ("*.xlsx", "*.xls"):
for f in sorted(out_dir.rglob(pattern)):
rel = str(f.relative_to(out_dir))
if rel not in excel_files:
excel_files.append(rel)
if excel_files:
payload["files"] = excel_files
out_path = out_dir / "result.json"
payload.setdefault("schemaVersion", 1)
payload.setdefault("status", "completed")
out_path.write_text(json.dumps(_sanitize(payload), ensure_ascii=False, indent=2), encoding="utf-8")