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:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user