- CloseSecondaryInstance:Kill 后 WaitForExit(释放模型文件句柄) - 工作目录清理带重试(3 次×1.5s,兼容副实例文件锁未释放) - 计划文档 F1/F2/F3 勾选完成,F4 待大模型实测
101 lines
5.6 KiB
Markdown
101 lines
5.6 KiB
Markdown
# 剖面盒导出 + 批处理自动检测方案(评估与实施计划)
|
||
|
||
> **状态**:评估完成(2026-08-05),E4 核心实验已验证,待实施。
|
||
> 跟踪: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. 导出局部 NWD(ExcludeHiddenItems=true)+ 导出路径文件(XML/JSON)
|
||
+ 记录盒内对象映射表(主模型PathId ↔ 导出模型PathId,含显示名/位置)
|
||
→ 3. Process.Start 启动副 Roamer.exe(UseShellExecute,注入 TRANSPORTPLUGIN_TEST_PORT=18778)
|
||
打开导出 NWD
|
||
→ 4. 主 NW 轮询 http://127.0.0.1:18778(ping 就绪)
|
||
→ 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 副实例无头检测**:副实例(导出模型无 .db)PathPlanningManager 仍初始化;import 路径 + 运行动画检测成功(75 帧/15fps×5s,碰撞 1)
|
||
- [x] **E4-3 报告 JSON 导出**:`run-virtual-collision-test` report 扩展 `collidedObjects`(碰撞对象名字列表)
|
||
- [x] **E4-4 端到端**:主实例 bbox 导出局部 NWD(57 对象)→ 外部启动副实例(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 清理 + 文件关联) |
|