NavisworksTransport/doc/working/2026-08-04-sectionbox-batch-detection-plan.md
tian 9cc9c56362 feat: F3 清理与恢复(副实例退出等待+工作目录清理重试)+ 计划文档更新
- CloseSecondaryInstance:Kill 后 WaitForExit(释放模型文件句柄)
- 工作目录清理带重试(3 次×1.5s,兼容副实例文件锁未释放)
- 计划文档 F1/F2/F3 勾选完成,F4 待大模型实测
2026-08-05 12:46:17 +08:00

101 lines
5.6 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 完整链路实验2026-08-05 完成 ✅)
- [x] **E4-1 端口隔离**`TestAutomationHttpService` 端口改读环境变量 `TRANSPORTPLUGIN_TEST_PORT`(默认 18777实测主实例 18777 + 副实例 18778 并行可用
- [x] **E4-2 副实例无头检测**:副实例(导出模型无 .dbPathPlanningManager 仍初始化import 路径 + 运行动画检测成功75 帧/15fps×5s碰撞 1
- [x] **E4-3 报告 JSON 导出**`run-virtual-collision-test` report 扩展 `collidedObjects`(碰撞对象名字列表)
- [x] **E4-4 端到端**:主实例 bbox 导出局部 NWD57 对象)→ 外部启动副实例18778→ import 路径 → 动画检测 → 报告 JSON 回传(碰撞对象 25" x 25"
**E4 结论**方案全部技术点验证通过可直接进入正式功能实施F1-F4
### 正式功能
- [x] **F1 批处理状态机**2026-08-05 完成):`ExecuteQueueItemAsync` 扩展(非指定碰撞对象 → 导出→副实例检测→回传);真实物体运动体(层级链匹配)
- [x] **F2 映射表**2026-08-05 完成导出时构建盒内对象映射chain去根→主PathId碰撞对象按层级链映射回主模型实测 4/4副实例 report collidedObjects 带 PathId+层级链
- [x] **F3 清理与恢复**2026-08-05 完成):副实例进程定位+Kill+WaitForExit、工作目录清理带重试
- [ ] **F4 大模型实测**:真实大模型验证收益(小时级 → 分钟级)
### F1/F2/F3 稳定性修复记录
- UnitsConverter 缓存 NaN 兜底(显式 ActiveDocument.Units副实例导出 NWD 单位不稳定)
- 副实例数据库时序IsDatabaseReady 轮询,导入前确保建库(修复路径丢失→检测记录外键失败)
- batch-queue-process 后台化(模态进度条不阻塞 HTTP轮询数据库状态
---
## 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 清理 + 文件关联) |