|
|
75ade5ad08
|
chore: 版本 0.18.4 — F1 批处理碰撞结果落库 + 纯 PathId 映射 + 批处理性能优化
|
2026-08-06 23:47:17 +08:00 |
|
|
|
033b639121
|
perf: 副实例关闭改直接 Kill(消除'模型已修改'弹窗 10 秒阻塞)
根因:副实例检测(动画/高亮)修改了文档 → 优雅关闭(CloseMainWindow)
触发 NW 原生'模型文件已修改,是否保存'模态弹窗 → WaitForExit(10s) 超时
→ Kill——每任务浪费约 10 秒。
修复:副实例是临时检测进程(检测已完成、报告已回传)——直接 Kill
(TerminateProcess 不触发弹窗);进程退出后句柄释放(WaitForExit 5s),
工作目录清理重试机制不受影响。
验证:F1 任务 60 秒完成(含副实例启动+就绪+检测),关闭秒级无弹窗
|
2026-08-06 23:46:00 +08:00 |
|
|
|
1700eeaa52
|
fix: 报告对话框碰撞数对齐历史表格(碰撞对 vs 唯一对象语义明确)
数字来源分析:
- 历史表格/批处理列表 = 碰撞对总数(ClashDetectiveCollisionCount——副实例
Clash 确认的碰撞事件数,同一物体多帧/多次碰撞计多对)
- 报告对话框原显示 = 重建对象明细数(去重后的唯一对象列表——
每对象一条明细,数量 < 碰撞对)
修复:CollectAllCollisionData 优先使用检测记录 CollisionCount
(与历史表格一致);报告对话框两个数字语义明确:
- 总碰撞数 = 碰撞对(7/23)
- 碰撞构件 = 唯一对象(5/8)
|
2026-08-06 23:38:39 +08:00 |
|
|
|
4ced5eb77b
|
fix: F2 映射改为纯 PathId(段序列直查,删除全部名字/链匹配)
根因(经导出代码 + 固定文件树对比验证):
- 导出 = document.ExportToNwd(ExcludeHiddenItems=true)(临时隐藏 itemsToHide)
- 导出树段序列 = 主模型树跳过 itemsToHide 的可见子编号(模拟 vs 副实例实际树完全一致)
- 此前链(名字)匹配在重名模型(Revit 嵌套实例)中映射到错误实例,
导致聚焦错误对象触发 NW 原生视角崩溃
修复:
- 导出时 BuildSegmentMap:全树深度优先遍历,跳过 itemsToHide,
段序列 → 主 PathId(CreatePathId)映射(2112 条)
- 副实例碰撞对象 PathId(段序列)直查表 → 主 PathId/ModelIndex
- 删除 TryMatchChainTail/链尾部匹配/名字候选等全部名字相关代码
(TrimRootFromChain/BuildAncestorChain 保留——移动物体副实例解析用)
验证:Factory 实测映射 1/1、4/4(纯 PathId,无名字);集成测试 25/25
|
2026-08-06 23:20:20 +08:00 |
|
|
|
68b75b5941
|
fix: F2 映射覆盖盒内对象祖先链(嵌套实例容器碰撞对象映射 0/5 → 4/4)
根因(经树结构实验确认):
- 副实例碰撞对象可能是盒内几何对象的祖先节点(IsComposite 嵌套实例
容器——如 Revit 门/窗实例——不在 ObjectsInBox 但可被碰撞)
- 盒内映射原只覆盖 ObjectsInBox(238 条)——碰撞对象链无匹配(近候选=0)
修复:盒内映射构建覆盖三类节点:
1) ObjectsInBox 自身 + DescendantsAndSelf(嵌套子节点)
2) 沿祖先链向上到模型根(嵌套实例容器层)
→ 映射 238 → 619 条;Factory 实测映射率 0/5 → 4/4,
落库明细全部带主模型 PathId(1/1/21/0/0/7/0 等,真正可定位)
诊断:F2映射诊断日志(等长/末3/名字候选对比,映射失败时定位用)
验证:集成测试 25/25
|
2026-08-06 22:46:23 +08:00 |
|
|
|
54255516fd
|
fix: F1 碰撞对象明细落库(报告页面可定位)+ F2 映射率提升
问题:F1 副实例检测结果只回写碰撞总数,碰撞对象明细未落库 →
报告页面数据全 0(无法知道碰撞了哪些物体);且 F2 层级链精确
匹配率低(1/9)——主链根=文档名+模型根、副链根=导出模型根,
去根后差一层导致匹配失败。
修复:
- F1 分支把碰撞对象明细写入 ClashDetectiveCollisionObjects
(对象名 + F2 映射的主 ModelIndex/PathId——真正可定位的物体)
- F2 映射增强:精确匹配失败后尾部匹配(末 2-6 层逐级加深,
唯一候选才映射,避免重名误配)
- 盒内映射/映射结果携带 ModelIndex(多模型正确定位)
验证:F1 测试 30 秒通过;映射率 1/9 → 3/3;主库明细含
PathId(Chair-Stacking→0/0/679/0/1 等)
|
2026-08-06 19:22:31 +08:00 |
|
|
|
6b13e3126b
|
fix: F1 批处理回写主库检测记录(历史表格碰撞数 0 问题)+ 通道排除诊断
问题1(历史表格碰撞数 0):
- F1 副实例检测结果只更新队列表,主库 CollisionDetectionRecords
未更新(批处理创建快照时 CollisionCount=0)→ 动画检测历史表格显示 0
- 修复:F1 完成后 UpdateCollisionDetectionResult 回写主库记录
(testName=F1副实例检测_{route}_{itemId})
- 配套:测试端点 batch-queue-add 创建检测记录(与 UI 一致);
UpdateBatchQueueItemAsync 的 UPDATE 补 DetectionRecordId 列
问题2(通道被碰撞):
- 副实例通道缓存正常(3 个可通行 = 用户设置),非通道对象 689 个
- 增加通道诊断日志:副实例检测完成后打印通道对象/碰撞对象/
碰撞中含通道对比(验证楼板等通道是否被正确排除)
- 测试模型验证:碰撞中含通道 0 个(排除正常)
验证:F1 测试 30 秒通过,回写日志确认(Id=534 碰撞 12)
|
2026-08-06 18:33:42 +08:00 |
|
|
|
68776ef22e
|
fix: 副实例导出文件加时间戳后缀(避免同名冲突)
同一 itemId 重复执行(残留 Running 状态重置重跑)时,旧副实例可能
仍持有旧文件句柄——同名覆盖/加载会触发 NW 原生加载失败弹窗。
model/route/secondary db 三个文件统一加 yyyyMMddHHmmssfff 后缀:
- 每次执行文件唯一,不与旧执行冲突
- 工作目录按 item-{Id} 目录清理(不受影响)
验证:F1 批处理 30 秒完成;日志确认新格式
model-item-119-20260806115052022.nwd
|
2026-08-06 11:51:50 +08:00 |
|
|
|
0f7d44dc76
|
fix: 副实例启动前导出文件校验(避免 NW 原生加载失败弹窗)
背景:model-item-116.nwd 无法打开弹窗为 NW 原生错误对话框(插件无法拦截)。
根因:队列残留项被重置重跑时,旧副实例孤儿进程仍占用导出文件 →
新副实例加载被占用文件失败 → 原生弹窗。
修复:SectionBoxBatchDetector.RunAsync 启动副实例前校验:
1) 导出文件存在且非空
2) 文件未被占用(FileStream 独占探测,IOException = 残留进程持有)
→ 失败时明确错误信息(提示检查残留 Roamer 进程),不启动副实例
验证:F1 批处理正常路径 30 秒完成(无回归)
|
2026-08-06 11:49:59 +08:00 |
|
|
|
e92a01df25
|
fix: 撤销自动模式对业务逻辑的扩大(窗口自动关闭只改显示行为)
原则:窗口自动关闭只修改窗口显示行为,不修改业务逻辑。
恢复两处为环境变量判断(历史语义,不再扩大到批处理):
- AnalyzeAndHighlightPrecomputedCollisionsAsync:预计算碰撞分析
流程完整执行(热点计算/排除列表/记录保存);分析窗口由
自动模式机制自动关闭(默认动作 Continue)
- SaveCollisionDetectionRecord:重复配置检查流程完整执行;
重复配置对话框自动模式自动选择默认动作(创建新记录)
验证:F1 批处理业务日志完整(检测记录 Id=532 创建、碰撞测试汇总生成、
报告数据落库仅跳过显示),窗口零残留,集成测试 25/25
|
2026-08-06 11:45:42 +08:00 |
|
|
|
2a4ba28fa0
|
fix: 测试 HTTP 请求全程进入自动模式(集成测试窗口零残留)
TestAutomationHttpService.HandleClientAsync 每个请求用
AutomationModeContext.EnterAutomaticMode() 包裹——所有测试端点
(动画/碰撞/批处理)窗口自动选择默认动作并立即关闭:
- CollisionReportDialog(碰撞检测报告):自动跳过(此前仅批处理生效,
集成测试动画完成后弹报告窗口残留)
- CollisionAnalysisDialog / 重复配置 / MessageBox 等:统一自动处理
验证:集成测试 25/25,跑完后 EnumWindows 确认 NW 仅主窗口(零残留)
|
2026-08-06 11:39:55 +08:00 |
|
|
|
5f15eeeb26
|
fix: 碰撞报告/分析窗口自动模式处理 + 预选排除清除
CollisionAnalysisDialog(预计算结果分析):
- 自动关闭时清除所有预选排除(智能预选可能选中唯一候选项,
导致排除全部 → 无检测对象);默认动作 = 去掉选择 + 继续生成动画
- 日志记录清除数量
CollisionReportDialog(碰撞检测报告):
- ShowReport 自动模式下跳过窗口(数据已落库/日志),返回 null;
调用方区分自动模式 null(正常)与非自动模式 null(错误)
验证:F1 批处理跑完 NW 零残留窗口(EnumWindows 确认仅主窗口);
日志确认'自动模式下已清除 1 个预选排除';集成测试 25/25
|
2026-08-06 11:32:16 +08:00 |
|
|
|
0d43cda5d7
|
feat: AutomationModeContext 统一自动模式(窗口自动选择默认动作并立即关闭)
新增 src/Utils/AutomationModeContext.cs:
- 自动模式统一入口(运行时计数 EnterAutomaticMode + 环境变量
TRANSPORTPLUGIN_TEST_AUTOMATION 兼容,可嵌套)
- 自动模式下窗口自动选默认动作/跳过弹窗,保证自动测试与批处理流畅
接入点:
- BatchQueueManager.ProcessQueueAsync 全程自动模式:
排除列表确认框 → 默认继续;完成汇总弹窗 → 跳过(日志保留)
- ClashDetectiveIntegration.ShowCancellationMessage → 跳过
- CollisionAnalysisDialog.Loaded 自动关闭(并入统一机制)
- AnimationControlViewModel:重复配置对话框默认创建新记录、
预计算分析跳过、重复检查跳过(3 处统一)
- DialogHelper.ShowAutoClosingMessageBox → 统一判断
验证:集成测试 25/25、F1 批处理 2 分钟跑完 NW 零残留窗口
(EnumWindows 确认仅主窗口)
|
2026-08-06 11:22:03 +08:00 |
|
|
|
f13e60c979
|
refactor: ClashDetectiveIntegration 几何缓存构建迁移 ModelItemTreeWalker
BuildNonHidddenGeometryItemsCache 栈式 DFS → ModelItemTreeWalker.WalkModels:
- IsHidden 剪枝 / IsComposite、HasGeometry 收集 / 空节点深入 / visibleCount 统计 /
双重检查锁 / 异常空缓存 全部语义保持
业务等价验证(Ground 虚拟物体碰撞测试,干净 NW):
- 新旧版 totalCollisions 均为 12(stash 前后对比,对象集合一致)
- 消费方(GetNonChannelGeometryItemsCache → SpatialHashGrid)为集合语义,顺序无关
- 集成测试 25/25(含 3 个碰撞测试)
注:脏 NW 状态(集成测试残留)下碰撞数会波动(5 vs 12)——非迁移引入,重启后稳定
|
2026-08-06 11:09:17 +08:00 |
|
|
|
818a5e0ad7
|
refactor: ModelItemTreeWalker 通用遍历工具(统一 IsHidden 剪枝 + 聚合盒剪枝 + 后序传播)
新增 src/Utils/ModelItemTreeWalker.cs:
- WalkVisible/WalkModels:深度遍历,IsHidden 剪枝内置(父隐藏 → 整棵子树跳过)
- 回调返回 ModelItemWalkAction(Prune/Continue/Hit)——剪枝条件与深入策略由调用方决定
- Hit 触发父级后序传播(postHitVisit)——共享祖先只上传一次(消除 K×D 枚举)
- onHidden 回调(隐藏节点统计)
迁移:
- SectionBoxExporter.TraverseAndCollect → walker(聚合盒剪枝 + 后序传播语义不变)
- ModelItemAnalysisHelper.GetAllVisibleGeometryItems → walker(栈式循环替换,统计保留)
修复:
- run-unit-tests.bat 过滤器排除 NavisworksIntegrationF1(F1 测试此前会被单元测试集选中,
无主 NW 环境时失败)
验证:单元 244/244、集成 25/25(SectionBox 61ms)、Architecture 111ms(无回退)、对象 228 一致
|
2026-08-06 10:53:18 +08:00 |
|
|
|
da81672782
|
merge: 剖面盒遍历优化(组节点剪枝 + 后序传播,大模型 ~2.1 倍提速)
|
2026-08-06 10:43:12 +08:00 |
|
|
|
8e16d28d45
|
chore: 版本 0.18.3 — 剖面盒遍历优化(剪枝 ~1.8x + 后序传播 ~15%)
|
2026-08-06 10:43:12 +08:00 |
|
|
|
636defc959
|
perf: AncestorsAndSelf 后序传播(命中路径祖先逐层上传,消除 K×D 次枚举)
TraverseAndCollect 改为返回 bool(子树是否有盒内对象):
- 命中时只 visibleSet.Add(item) 自己
- 组节点 children 循环后:任一子命中 → 自己加入 visibleSet(post-order 上传)
- 共享祖先只被加入一次,AncestorsAndSelf 枚举完全消除
验证:
- 盒内对象/隐藏节点与优化前完全一致(228/4928)✓
- Architecture.nwd:~273ms → ~265ms(命中数小时收益小;大模型命中数大时更明显)
- 集成测试 25/25
|
2026-08-06 10:37:48 +08:00 |
|
|
|
539e4a9f2c
|
perf: 剖面盒遍历组节点聚合盒剪枝(大型模型 ~1.8 倍提速)
SectionBoxExporter:
- TraverseAndCollect 对非几何节点(组节点)先查聚合包围盒,
与剖面盒不相交 → 整棵子树跳过(NW BoundingBox 为文档级缓存 O(1),
已用 Architecture.nwd 2 万节点 + 全厂模型 403MB 验证)
- GetObjectsAndHiddenItems 增加 prune 参数(默认 true,false 供性能对比)
验证(全厂设备模型 403MB,100x100x40 测试盒):
- 剪枝 72.9s vs 无剪枝 129.9s(~1.8 倍)
- 盒内对象/隐藏节点完全一致(3521/80043,正确性无变化)
- Architecture.nwd(2 万节点):273ms vs 580ms(~2.1 倍)
- 集成测试 25/25
测试基础设施:
- export-section-box 端点加 prune 参数 + traversalMs 计时
- bbox-profiling 端点加 enum=false 模式(根盒查询,避免大模型全枚举 10+ 分钟)
- BatchQueueF1ProcessAutomationTests 末尾等待后台批处理完全退出
(修复 F1 后台任务残留导致后续 BatchQueue_AddItems isExecuting 断言失败)
- batch-queue-status 端点加 isExecuting 字段
|
2026-08-06 10:28:59 +08:00 |
|
|
|
f38bae137a
|
feat: F1 批处理端到端测试 + batch-queue-status 端点
服务端:
- 新增 GET /api/test/batch-queue-status(查询队列项状态:
id/status/errorMessage/collisionCount/detectionRecordId,供测试轮询)
- BatchQueueManager 增加 internal GetDatabase() 访问器
客户端:
- NavisworksTestAutomationClient 新增 BatchQueueStatusAsync /
BatchQueueProcessAsync
测试:
- BatchQueueF1ProcessAutomationTests(TestCategory=NavisworksIntegrationF1,
不在默认全量内):add(虚拟物体 F1 场景)→ process → 轮询 status
至 Completed → 断言碰撞报告。单独跑约 30 秒。
AGENTS.md:记录 F1 测试用法(bat 参数含 = 会截断,用 FullyQualifiedName~)
|
2026-08-06 00:29:58 +08:00 |
|
|
|
869bfd3787
|
refactor: 清理 fragment/参考姿态残留命名(默认轴约定一致性)
RealObjectRailAxisConventionResolver:
- 头注释改为默认轴约定语义,参数 referenceAxisX/Y/Z → defaultAxisX/Y/Z
PathAnimationManager:
- 字段 _realObjectReference* → _realObjectDefault*(默认轴约定)
- 方法 RealObjectReferenceRotation → RealObjectDefaultConvention、
ReferenceBasedRealObjectPlanarPose → DefaultConventionRealObjectPlanarPose
- ResolveCurrentRotationBaseline 参数 hasReferenceRotation/referenceRotation → hasDefaultRotation/defaultRotation
RealObjectPlanarPoseSolver:
- TryCreatePlanarPoseFromReferencePose → FromDefaultPose、
参数 referenceRotation → defaultRotation、fixedReferenceAxis → fixedDefaultAxis
- 属性 SelectedReferenceAxis* → SelectedDefaultAxis*(含测试同步)
测试: 方法名/局部变量 referenceRotation → defaultRotation 同步
(VirtualObjectReferencePose 虚拟物体资产参考姿态为有效概念,保留)
TestAutomationHttpService: 过时错误文案(fragment 姿态解析失败)→ 盒内/层级链描述
验证: 单元 185/185、集成 25/25
|
2026-08-06 00:16:00 +08:00 |
|
|
|
29da68f6d3
|
refactor: 清理方法5 fragment 矩阵分析依赖链(保留坐标系检测其余方法)
删除(fragment 矩阵分析诊断链):
- SystemManagementViewModel: 方法5 文本块、AnalyzeFragmentOrientations、
AppendFragmentAnalysis、FragmentOrientationAnalysis 类
- FragmentRepresentativePoseHelper.cs(TryGetRepresentativeFrame 无调用者)
- RealObjectReferencePoseResolver.cs(TryDetectDefaultUpAxis 只被方法5 用)
- FragmentRepresentativePoseHelperTests.cs
- FragmentDefaultUpContext: 删 GetCurrentHostUpAxis / GetCurrentDocumentFragmentDefaultUpAxis /
IsSupportedAxis(均无调用者)
保留:
- 坐标系检测 方法1/2/3/4/6(文档级检测)
- 真实物体变换诊断(TransformDiagnosticInfo 保留,轴可视化 fallback
到几何后代/选中节点 Transform,不再用 fragment)
- FragmentDefaultUpContext 改名 DocumentKeyContext(仅文档 key 缓存,
用于模型根旋转提示;名字不再含 fragment)
验证:单元测试 185/185、集成测试 25/25
|
2026-08-06 00:09:08 +08:00 |
|
|
|
e0b01247ab
|
chore: 新增 run-integration-tests.bat 集成测试脚本(支持过滤器参数)
- 无参数 = 全量集成测试(TestCategory=NavisworksIntegration)
- 带参数 = 子集,如 FullyQualifiedName~RealObjectAnimation
- 自动:编译测试项目、查找 MSBuild/VSTEST/MSTest adapter、追加 Navisworks API PATH
- 主实例就绪检查(HTTP 18777 ping),未就绪明确报错
- AGENTS.md 记录用法与 bat 编码约束(CRLF + GBK)
验证:子集 3/3、全量 25/25 通过
|
2026-08-05 23:57:36 +08:00 |
|
|
|
7c4783dca6
|
refactor: 清理 fragment 参考姿态残留代码(0.18.2 默认轴约定后的死代码)
删除:
- RealObjectReferencePoseResolver: TryResolveFromModelItem / TryResolveFromFragmentMatrices
(fragment 代表姿态解析链,已无调用者;保留诊断用 TryDetectDefaultUpAxis)
- RealObjectReferencePose.cs(无引用死文件)
- PathAnimationManager: _realObjectReferenceHostSemantic* 字段(无消费)
- FragmentRepresentativePoseHelper: TryGetRepresentativeRotation(ModelItem/矩阵集合)
与 TryInterpretRepresentativeFrame(仅死链使用;保留诊断用 TryGetRepresentativeFrame)
- 测试:RealObjectReferencePoseResolverTests(测死链)、
FragmentRepresentativePoseHelperTests 缩减至在用方法
保留(非残留):
- GeometryHelper/GeometryCacheManager fragment(几何三角形生成)
- FragmentDefaultUpContext / RealObjectRailAxisConventionResolver(在用)
- TestAutomationHttpService(集成测试服务)
验证:单元测试 187/187、集成真实物体动画 3/3、F1 Rail+42" Completed
|
2026-08-05 23:53:39 +08:00 |
|
|
|
10e93b1c32
|
chore: 版本 0.18.2 — 去掉 fragment 依赖(默认轴约定替代)+ CHANGELOG
|
2026-08-05 23:47:46 +08:00 |
|
|
|
e99de7059a
|
merge: 去掉真实物体 fragment 参考姿态依赖(默认轴约定替代)
|
2026-08-05 23:46:41 +08:00 |
|
|
|
48d7714131
|
chore: 版本 0.19.0 — 去掉 fragment 依赖(默认轴约定替代)+ CHANGELOG
|
2026-08-05 23:46:41 +08:00 |
|
|
|
7551647538
|
feat: 去掉真实物体 fragment 参考姿态依赖(默认轴约定替代)
背景:fragment 参考姿态提供的是物体在模型里的原始摆放(CAD 朝向),
不代表物流 forward(哪根局部轴沿路径由用户定义)。且 fragment 有隐患:
盒内部分几何时代表帧漂移(42" 4/64 → 103°)、嵌套实例不稳定。
修改:TryCaptureRealObjectReferenceRotation 不再解析 fragment,
改用默认轴约定(forward=+X,up=宿主 up)。用户通过'调整物体'手工指定最终朝向。
收益:
- 消除全部 fragment 相关隐患(盒内不完整/嵌套实例漂移/AutoDetect 坐标系)
- F1 Rail + 42"(此前'无法解析真实物体'失败)现可正常检测
- 集成测试 25/25 通过(真实物体动画 Ground/Hoisting/Rail 正常)
影响:真实物体初始姿态基准从 fragment 改为默认约定,
已保存的角度修正(ObjectRotationCorrection)需重新调整。
|
2026-08-05 23:40:43 +08:00 |
|
|
|
10be0a5e4f
|
chore: 版本 0.18.1 — F1 导出前恢复移动物体 + 坐标系强制注入 + 记录 fragment 依赖已知问题
- F1 导出前恢复移动物体到路径起点(解决盒外物体'无法解析'失败)
- 副实例坐标系强制注入(极小导出模型 AutoDetect 误判 ZUp)
- 真实物体选择失败错误信息明确化
- 已知问题记录:Rail + 管道/嵌套实例类真实物体 fragment 不完整→代表帧漂移;后续去掉 fragment 依赖
|
2026-08-05 17:45:59 +08:00 |
|
|
|
4acd7e4846
|
fix: F1 导出前恢复移动物体到路径起点(确保导出包含,解决盒外物体失败)
- 加入批处理时物体移到起点,但后续操作会将其移回 CAD 原位置(甚至不在路径剖面盒内)
- F1 导出前:按批处理项记录的 MovingObject PathId 解析移动物体 → MoveObjectToPathStart 恢复到路径起点 → 再导出
- 验证:96"(CAD 位置 Z=-35 盒外)现可正常检测(碰撞 17,此前'无法解析真实物体'失败)
|
2026-08-05 17:39:29 +08:00 |
|
|
|
a79e68732b
|
fix: 副实例坐标系强制注入(修复 Rail 等真实物体姿态链依赖 YUp/ZUp 正确)
- CoordinateSystemManager 支持环境变量 TRANSPORTPLUGIN_TEST_COORD_SYSTEM 强制坐标系
(极小导出模型 AutoDetect 可能失败/误判,如 UpVector 丢失时默认 ZUp 错误)
- InstanceManager 启动副实例时注入主 NW 的 ResolvedType
- 清理排查用的诊断代码(fragment-diagnostics 端点、过度日志),只保留真正修复
验证:F1 Ground + Chair 正常(28 碰撞);副实例日志确认强制 YUp 生效
|
2026-08-05 17:18:30 +08:00 |
|
|
|
9d9d64dd7e
|
fix: 真实物体选择失败错误信息明确化(fragment 姿态原因)
副实例局部模型中嵌套实例物体(如 42" Diameter)fragment 姿态解析失败时,
错误信息明确提示(原为笼统的'动画视图模型未保留选中的对象')
|
2026-08-05 16:43:47 +08:00 |
|
|
|
e26ced742b
|
docs: 批处理多进程开关文案简化(使用多进程)
|
2026-08-05 16:27:48 +08:00 |
|
|
|
db77b80cf7
|
feat: 批处理并发配置化 + 多进程 UI 开关
- config.toml 新增 [batch] 段(use_multi_process 默认 true、max_parallel_instances 默认 3)
- SystemConfig.BatchConfig 模型 + ConfigManager 解析/回写
- ResolveMaxParallelInstances 完全由配置驱动(无硬编码默认值):配置缺失/无效明确报错;
use_multi_process=false 时并发 1(串行);环境变量可临时覆盖
- 批处理页签新增"使用多进程并行执行"开关(默认开启,绑定配置并保存)
- 部署目录 config.toml 手动追加 [batch] 段(default_config 是模板)
验证:2 项并行(配置并发 3)约 40s Completed,日志确认从 config 读取
|
2026-08-05 16:25:32 +08:00 |
|
|
|
72d256e68e
|
fix: UnobservedTaskException + processMonitorTask 死锁
- processMonitorTask 取消时 Task.Delay(token) 抛 OperationCanceledException 未被观察 → UnobservedTaskException 弹窗;lambda 内 catch OCE
- finally await processMonitorTask 死锁:正常完成时 cts 未取消 → 无限循环等待;finally 先 cts.Cancel() 再 await(快速退出 + 观察残余异常)
验证:2 项并行 ~35s 全部 Completed(此前卡 250s+),F2 映射 4/4
|
2026-08-05 16:16:15 +08:00 |
|
|
|
54fef0916c
|
Merge branch 'feature/e4-sectionbox-batch-detection' into stable
剖面盒自动检测(F1-F3)+ NavisworksInstanceManager 多实例管理 + 批处理并行执行
版本 0.18.0
|
2026-08-05 13:18:15 +08:00 |
|
|
|
047834df58
|
chore: 版本 0.18.0 — 剖面盒自动检测 + 多实例并行批处理
- F1-F3 剖面盒自动检测(大模型全模型检测加速到局部模型分钟级)
- NavisworksInstanceManager 独立模块(多实例端口池/进程管理/日志隔离)
- 批处理多实例并行(默认 3 副实例,可调)
- F2 碰撞对象映射回主模型(层级链)
- 修复:UnitsConverter NaN、副实例数据库时序、多实例日志冲突、PID 定位错位
- 集成测试 25/25 通过
|
2026-08-05 13:18:10 +08:00 |
|
|
|
336210d612
|
feat: 批处理多实例并行执行(ProcessQueueAsync 改造)
- ProcessQueueAsync 并行化:SemaphoreSlim 限并发(默认 3,TRANSPORTPLUGIN_MAX_PARALLEL 可调 1-20)
- F1 项(副实例检测)天然并行;非 F1 项(主 NW 检测)mainDetectionGate 串行保护(共享动画/渲染状态)
- 统计用 Interlocked/lock 线程安全;进度条后台更新
- 修复 InstanceManager LaunchInstance 并发 PID 定位错位(启动+定位加 _launchLock 串行,3 实例 PID 独立)
验证:3 个 Ground 项并行(3 副实例 18778/18779/18780),全部 Completed,PID 独立
|
2026-08-05 13:13:53 +08:00 |
|
|
|
2fae6028d1
|
fix: 多实例并行前的单实例假设清理
- LogManager 按端口隔离日志文件(TRANSPORTPLUGIN_TEST_PORT → debug-{port}.log):副实例启动的 ClearLog 不再清空主实例日志,跨进程写不冲突
- SectionBoxBatchDetector 工作文件名加 instanceId 唯一标识(model-{id}.nwd/route-{id}.json/secondary-{id}.db):并行/重试同目录不冲突
- NavisworksInstanceManager.LaunchInstance 前清理 AutoSave(副实例不弹恢复框)
- BatchQueueManager 传 instanceId
验证:F1 正常(28 碰撞 + F2 4/4),副实例日志隔离生效(debug-18778.log)
|
2026-08-05 13:07:32 +08:00 |
|
|
|
1cc348d271
|
refactor: NavisworksInstanceManager 独立模块(多实例管理),SectionBoxBatchDetector 委托
- 新增 NavisworksInstanceManager(src/Core/Services/):端口池分配(18778-18797,20 个并行实例)、
LaunchInstance(环境变量注入+进程定位)、WaitReadyAsync(ping+数据库+进程监控)、
CloseInstance/CloseAll(优雅退出→强杀→释放端口)
- NavisworksInstanceHandle:实例句柄(端口+进程+HTTP),Dispose 自动关闭并释放端口
- SectionBoxBatchDetector 重构:启动/就绪/关闭委托 InstanceManager,业务逻辑(导出/导入/检测/映射)保留
- 设计:独立模块,批处理只是调用方;将来其他模块(映射/批量并行/其他功能)可复用
验证:F1 重构后正常(28 碰撞 + F2 4/4,实例管理日志生效)
|
2026-08-05 13:01:51 +08:00 |
|
|
|
fcd4b34983
|
feat: F1 可靠性——总 deadline + 副实例进程存活监控(防止批处理无限等待)
- 整个 F1 流程 6 分钟硬超时(OverallTimeout),超时强制关闭副实例并失败
- 各阶段(ping/db就绪/导入/解析)传副实例进程:进程退出(HasExited)立即失败,不等待 HTTP 超时
- run 检测请求:CancellationTokenSource 联动总 deadline + 进程监控(进程退出 → cts.Cancel → 立即失败)
- 异常分类:进程退出 vs 总超时 vs HTTP 错误,明确错误信息
解决:副程序已结束但批处理干等(TCP 挂起)的无限等待问题
|
2026-08-05 12:52:11 +08:00 |
|
|
|
9cc9c56362
|
feat: F3 清理与恢复(副实例退出等待+工作目录清理重试)+ 计划文档更新
- CloseSecondaryInstance:Kill 后 WaitForExit(释放模型文件句柄)
- 工作目录清理带重试(3 次×1.5s,兼容副实例文件锁未释放)
- 计划文档 F1/F2/F3 勾选完成,F4 待大模型实测
|
2026-08-05 12:46:17 +08:00 |
|
|
|
98d01595c3
|
feat: F2 碰撞对象映射回主模型(层级链为桥)+ F1 稳定性修复
F2:
- 副实例 report collidedObjects 升级为对象详情(name + 副 PathId + ancestorChain)
- 主 NW 导出时构建盒内对象映射(chain去根 → 主 PathId)
- 碰撞对象按层级链(去根一致)映射回主模型 PathId,报告可定位(实测 4/4 映射成功)
稳定性修复(F1 间歇失败根因):
- UnitsConverter 缓存 NaN 兜底:无参因子方法 NaN 时用显式 ActiveDocument.Units(副实例导出 NWD 单位不稳定,两缓存因子不同步)
- 副实例数据库就绪等待:PathPlanningManager.IsDatabaseReady + status 端点暴露 + F1 导入前轮询(修复'路径先导入、库后创建'导致路径丢失→检测记录外键失败)
- 修复 UnitsConverter 编辑事故(无参/显式 GetMetersToUnitsConversionFactor 重复)
验证:F1 Ground + Chair Lounge Couch Double,碰撞 28/28,F2 映射 4/4
|
2026-08-05 12:33:41 +08:00 |
|
|
|
832caaffef
|
feat: F1 剖面盒自动检测完整链路跑通(真实物体)
- SectionBoxBatchDetector:路径剖面盒(复用 SectionClipHelper.CalculatePathClipBox 产品语义)→ 导出局部 NWD → 副实例检测 → 报告回传
- 移动物体跨实例解析:导出剖面盒保留节点树结构,去掉根后主/副层级链一致,按 ancestorChain 匹配(用户验证结论)
- 副实例临时库:TRANSPORTPLUGIN_TEST_DB_PATH 环境变量显式指定,createIfMissing 时强制创建(解决检测记录无法落库→报告失败)
- 副实例进程定位:cmd start detach 后按新 Roamer PID 定位并关闭
- batch-queue-add:真实物体写入 ModelItemReferences(MovingObject),F1 从引用读移动物体名/PathId/层级链
- batch-queue-process:改后台执行立即返回(模态进度条不阻塞 HTTP),调用方轮询数据库状态
- 集成测试标准场景:自动测试_Ground 更新(用户修改)+ Ground 真实物体改 Chair Lounge Couch Double
验证:F1 Ground + Chair Lounge Couch Double,碰撞 28/28,链路完整
|
2026-08-05 12:11:37 +08:00 |
|
|
|
d99cbd8b5f
|
feat: E4 剖面盒自动检测链路实验完成(分支验证)
- E4-1 端口隔离:TestAutomationHttpService 端口读环境变量 TRANSPORTPLUGIN_TEST_PORT(多实例并行)
- E4-2 副实例无头检测:导出模型无 .db 时 PathPlanningManager 仍可用,import+动画+检测链路通
- E4-3 run-virtual-collision-test report 扩展 collidedObjects(碰撞对象名字列表)
- E4-4 端到端:主实例导出 NWD→副实例(18778)检测→报告 JSON 回传闭环验证
- 文档更新 E4 实验结论(全部通过,进入 F1-F4 正式实施)
|
2026-08-05 10:59:47 +08:00 |
|
|
|
aa8e9e55c5
|
docs: 剖面盒导出+批处理自动检测方案评估与实施计划
- 可行性结论:可行(E4 实验验证多实例+加载小模型)
- 架构:主 NW 批处理 + 副 NW 无头检测 worker + HTTP 驱动 + 报告 JSON 回传
- E4 实验新发现:副实例无 .db 跳过数据库连接、HTTP 端口冲突需隔离
- 实施清单:E4 完整链路实验 → 批处理状态机 → 映射表/清理/大模型实测
|
2026-08-05 10:51:40 +08:00 |
|
|
|
3b31c0c92d
|
chore: 版本 0.17.0 — 集成测试体系完整化(T01-T16,25/25 通过)
- CHANGELOG 记录 0.17.0:集成测试体系(真实物体/逐帧/Free/报告/绕障/多策略/网格诊断/持久化/路径编辑导出/播放控制/批量队列/路径分析/剖面盒导出)
- 测试服务端点 24 个、标准路径自动导入、动画 15fps/5s 加速
- Bug 修复:报告残留/并发污染/InstanceGuid/ModelPath 动态解析/CollisionResults 废弃表/删点链路/PathPoints 主键
- 脚本改进:AutoSave 清理根治恢复弹窗、文件关联打开模型、启动 4.4s
- VERSION.md 0.16.1 → 0.17.0
|
2026-08-04 18:48:40 +08:00 |
|
|
|
ac454196f1
|
feat: 集成测试补 T16 剖面盒导出(25/25 通过)
- 服务端新增 export-section-box 端点:mode=bbox(指定包围盒,测试可控)/ mode=activeView(UI 剖面盒)
- 新增 SectionBoxExportAutomationTests:导出 NWD 文件存在/对象数/文件大小/隐藏节点断言
- 客户端 ExportSectionBoxAsync 方法
|
2026-08-04 18:44:01 +08:00 |
|
|
|
8e5d9e845f
|
feat: 集成测试补 T11-T15(P0+P1+P2 全部完成,24/24 通过)
- T11 路径编辑(PathEditingAutomationTests):删除点/更新位置/正交化/去环
- T12 路径导出(ExportImportRoundTripAutomationTests):XML/JSON 导出→导入回环
- T13 播放控制(AnimationPlaybackControlAutomationTests):pause 验证帧停止/resume 前进
- T14 批量队列(BatchQueueAutomationTests):队列添加/计数递增
- T15 路径分析(PathAnalysisAutomationTests):评分结构验证
- 服务端新增 5 端点:export-route-file/edit-route/animation-playback-control/batch-queue-add/analyze-path
- 产品 bug 修复:PathDatabase.CollisionResults 表已废弃→GetCollisionCount 改查 CollisionReports、
SaveCollisions 异常保护;路径编辑真删点走 PathRoute.RemovePoint(RemovePathPoint 仅 3D 标记)
验证:集成测试 24/24 通过,完整集 74.6s(15fps/5s 动画)
|
2026-08-04 18:39:16 +08:00 |
|
|
|
59e323f9bb
|
feat: 集成测试补 T07-T10(P0+P1 全部完成,18/18 通过)
- T07 障碍绕行(AutoPathObstacleDetourAutomationTests):跨模型起终点直线 11.0m→规划 11.57m 绕行,blocked=0
- T08 多策略(同测试类):Shortest/Straightest 参数回传 + 均规划有效路径
- T09 网格诊断(RouteGridDiagnosticsAutomationTests):网格参数/路径点覆盖/段一致性
- T10 持久化(DetectionRecordPersistenceAutomationTests):检测记录重载验证(动画参数 15fps/5s 落库)
- 服务端:PathPlanningManager.GetDetectionRecordById + /api/test/detection-record 端点
- 客户端:RunAutoPathAsync 支持 strategy、GetRouteGridDiagnosticsAsync、GetDetectionRecordAsync
验证:集成测试 18/18 通过,完整集 65.8s
|
2026-08-04 18:21:18 +08:00 |
|