NavisworksTransport/doc/working/2026-08-04-sectionbox-batch-detection-plan.md
tian aa8e9e55c5 docs: 剖面盒导出+批处理自动检测方案评估与实施计划
- 可行性结论:可行(E4 实验验证多实例+加载小模型)
- 架构:主 NW 批处理 + 副 NW 无头检测 worker + HTTP 驱动 + 报告 JSON 回传
- E4 实验新发现:副实例无 .db 跳过数据库连接、HTTP 端口冲突需隔离
- 实施清单:E4 完整链路实验 → 批处理状态机 → 映射表/清理/大模型实测
2026-08-05 10:51:40 +08:00

93 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 剖面盒导出 + 批处理自动检测方案(评估与实施计划)
> **状态**评估完成2026-08-05E4 核心实验已验证,待实施。
> 跟踪checkbox 标记实施进度。
---
## 1. 背景与目标
生产环境大模型(几十条路径 × 每条小时级)无法直接做全模型动画碰撞检测,目前只能做"指定碰撞对象"模式。
**目标**:非指定碰撞对象模式的任务,通过剖面盒导出缩小模型,在导出的小模型上做动画检测(分钟级),与批处理结合自动化。
---
## 2. 可行性结论
**可行**E4 实验已证明核心前提)。架构 = 主 NW 批处理 + 副 NW 作为"无头检测 worker" + HTTP 驱动 + 报告 JSON 显式回传。
---
## 3. 已验证前提(含 E4 实验 2026-08-05
| 前提 | 验证结果 |
|---|---|
| 剖面盒导出真正剔除盒外对象 | ✅ 代码确认(`NwdExportHelper` 用 `ExcludeHiddenItems = true` |
| 导出后坐标不变 | ✅ 用户经验确认 |
| 多 Navisworks 实例可同时打开 | ✅ E4 实测:主 NW 运行中 `Start-Process Roamer.exe -ArgumentList 模型路径` 创建独立第二实例,两实例并行加载不同模型 |
| 副实例插件正常加载 | ✅ E4 实测:坐标系检测/模型加载事件正常触发 |
| 之前集成测试 Start-Process 失败根因 | ✅ 恢复弹窗拦截(已被 AutoSave 清理方案解决),非多实例/参数问题 |
| 小模型检测快 | ✅ 集成测试验证57 对象秒级) |
| 对象标识 | ❌ InstanceGuid 大部分为空(用户经验)→ 用树结构索引 PathId |
### E4 实验新发现
| 发现 | 影响 | 对策 |
|---|---|---|
| 副实例打开的导出模型**无 .db** 时插件跳过数据库连接(当前代码不自动建库) | 检测记录/报告无法落副实例库 | 副实例**无头检测**:结果 JSON 回传不依赖 .db或显式指定库路径环境变量 |
| HTTP 端口:两实例都绑 18777 冲突 | 副实例测试服务不可用 | 端口隔离:`TestAutomationHttpService` 端口常量改读环境变量(如 `TRANSPORTPLUGIN_TEST_PORT` |
---
## 4. 架构设计(定稿)
```
主 NW 批处理(非指定碰撞对象模式任务)
→ 1. 路径包围盒 + 膨胀(物体尺寸 + 安全间隙 + 检测容差)
→ 2. 导出局部 NWDExcludeHiddenItems=true+ 导出路径文件XML/JSON
+ 记录盒内对象映射表主模型PathId ↔ 导出模型PathId含显示名/位置)
→ 3. Process.Start 启动副 Roamer.exeUseShellExecute注入 TRANSPORTPLUGIN_TEST_PORT=18778
打开导出 NWD
→ 4. 主 NW 轮询 http://127.0.0.1:18778ping 就绪)
→ 5. HTTP 驱动副实例import-route-file路径→ run-virtual-collision-test动画参数
→ 6. 副实例报告 JSON 导出(含 PathId/显示名/位置/碰撞统计)→ 主 NW 读取
→ 7. 主 NW 按映射表写入主库 → 关闭副实例 → 清理临时 .db/导出文件 → 下一条
```
**约束(用户经验)**
- 大模型每次打开几分钟 → 禁止单 NW 内切文档,必须独立实例
- InstanceGuid 不可用 → 树结构索引PathId+ 映射表
- 报告回传必须显式(副实例 .db 主 NW 不读)
---
## 5. 实施清单checkbox 跟踪)
### E4 完整链路实验(下一步)
- [ ] **E4-1 端口隔离**`TestAutomationHttpService` 端口改读环境变量(默认 18777可覆盖 18778
- [ ] **E4-2 副实例无头检测**:副实例(无 .db上 import 路径 + 运行动画 + 获取检测结果 JSON
- [ ] **E4-3 报告 JSON 导出端点**:副实例导出最近检测报告完整 JSON碰撞对象 PathId/名字/位置/统计)
- [ ] **E4-4 端到端**:脚本/代码模拟批处理项:主 NW 导出 → 启动副实例 → 驱动检测 → 回传 JSON → 主库写入
### 正式功能
- [ ] **F1 批处理状态机**`ExecuteQueueItemAsync` 扩展(非指定碰撞对象模式 → 导出→副实例检测→回传流程)
- [ ] **F2 映射表**:导出时记录 主PathId ↔ 副PathId 映射,报告写主库
- [ ] **F3 清理与恢复**:临时 .db/导出文件清理、副实例异常退出检测、批处理失败恢复
- [ ] **F4 大模型实测**:真实大模型验证收益(小时级 → 分钟级)
---
## 6. 相关现有基础
| 能力 | 位置 |
|---|---|
| 剖面盒导出bbox 模式) | `SectionBoxExporter` + `/api/test/export-section-box`T16 |
| 路径导入 | `/api/test/import-route-file` |
| 动画碰撞检测(可配参数) | `/api/test/run-virtual-collision-test`frameRate/durationSeconds |
| 检测记录查询 | `/api/test/detection-record` |
| 批处理队列 | `BatchQueueManager` + `/api/test/batch-queue-add`T14 |
| 启动脚本弹窗处理 | `start-navisworks.ps1`AutoSave 清理 + 文件关联) |