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
44214baa00
feat: 集成测试补 T05/T06 + 动画加速与多项基础设施修复
...
测试新增:
- T05 Free 自由路径(FreePathAutomationTests:完整动画 + 逐帧位置=路径点)
- T06 碰撞报告内容断言(CollisionReportAssertions 接入虚拟/真实物体测试)
服务端增强:
- list-model-items 端点(枚举物体:DisplayName/PathId/包围盒中心/祖先链)
- run-virtual-collision-test 支持 frameRate/durationSeconds(测试动画加速:15fps/5s)
- 测试执行串行锁(SemaphoreSlim,防客户端超时后任务占用 UI 线程并发污染)
- 标准路径清单/XML 增加自动测试_Free
Bug 修复:
- AnimationControlViewModel.InvalidateLastGeneratedReport(跨测试碰撞报告残留)
- 真实物体身份校验 ReferenceEquals→InstanceGuid(NW ModelItem 实例不保证同引用)
- 真实物体动态解析(ModelPath 跨会话不稳定,禁止硬编码 PathId)
- PathImportValidity 测试点 Id 随机化(PathPoints.Id 全局主键,p1/p2 固定会冲突)
- start-navisworks.ps1:启动前清理 AutoSave(避免恢复弹窗拦截)、文件关联打开模型、dismiss 兜底、启动 15s→4.4s
验证:集成测试 13/13 通过,完整集 6min→59.6s(动画 15fps/5s)
2026-08-04 18:13:26 +08:00
8f477c0e1c
feat: 集成测试新增动画逐帧状态验证(P0 T04)
...
- 服务端新增 probe-animation-frames 端点:生成动画后 SeekToProgress 到多个进度点,返回物体跟踪位置/yaw
- 新增 AnimationFrameProbeAutomationTests:
- Ground:起点/终点 XZ 匹配路径点、高度恒定(平面链)、中间帧在起终点之间
- Hoisting:吊装剖面(起吊地面→悬挂升高→下降落地)+ 水平平移
- 集成测试 11/11 通过(P0 高风险区全部完成:真实物体 + 逐帧状态)
2026-08-04 17:11:57 +08:00
b5cfcbf8ac
feat: 集成测试新增真实物体动画验证(P0 T01-T03)
...
- 服务端 run-virtual-collision-test 支持 useVirtualObject=false + animatedObjectPath(ModelPath 定位,解决 DisplayName 重名)
- ResolveAnimatedObjectFromQuery 支持按 CreatePathId 的 PathId 精确匹配
- 修复 ModelItem 身份校验:ReferenceEquals 对 NW API 同一逻辑对象不同实例不可靠,改用 InstanceGuid 比较
- 新增 RealObjectAnimationAutomationTests:Ground/Hoisting/Rail 真实物体动画完整流程
(42" Diameter=0/0/660/0,25" x 25"=0/0/769/0)
- 集成测试 9/9 通过(3 虚拟碰撞 + 1 autoPath + 2 导入 + 3 真实物体)
2026-08-04 16:52:37 +08:00
454590ae26
docs: 新增集成测试覆盖补充计划跟踪文档
...
- 记录现有集成测试覆盖(6 个测试)与核心功能缺口(15 项待补,分 P0/P1/P2 优先级)
- P0 高风险区:真实物体动画(Ground/Hoisting/Rail)、动画逐帧状态验证
- P1 功能面:Free 路径、碰撞内容验证、自动路径障碍绕行/多策略、网格诊断、持久化
- P2 需新增端点:路径编辑/导出、播放控制、批量任务、路径分析
- 附带测试服务端点支撑能力清单与完成记录表(checkbox 跟踪)
2026-08-04 16:42:05 +08:00
d04c37a7a5
vendor Navisworks 2026 API DLL into repo, use relative references
...
- Add libs/navisworks-2026/ with 6 API DLLs + 3 XML doc files copied
from local Navisworks Manage 2026 install (Api/Timeliner/Clash/
Controls/ComApi/Interop.ComApi)
- Change TransportPlugin.csproj and UnitTests csproj HintPaths from
absolute Program Files paths to relative libs paths (build no longer
depends on the Navisworks installation directory)
- Keep Private=False semantics for plugin (NW loads its own DLLs at
runtime) and Private=True for unit tests
- Record the libs reference rule in AGENTS.md to prevent regression
Verified: compile successful, 255/255 unit tests pass
2026-08-04 11:57:20 +08:00
5bdfa8281d
docs: 强化 AGENTS.md 单位原则——模型单位≠米(取决于文档单位),补充测试警示
...
- 新增三层单位语义表(模型单位/米/配置项)
- 强调模型单位取决于当前 NW 文档单位(如 Floor2 为英尺,1米=3.281模型单位),禁止假设等于米
- 明确 TotalLength 等长度属性返回米,禁止二次换算
- 新增 §6.4 测试警示:集成测试断言长度必须按文档单位因子换算,涉及单位换算的断言不放单测
- 排查指引新增'长度/尺寸偏差约 3.28 倍'条目(源于本次集成测试单位踩坑)
2026-08-02 21:22:31 +08:00
c9c29c7170
refactor: 依赖 Navisworks 的路径导入验证从单测迁移至集成测试
...
- 删除 UnitTests/Core/PathPersistenceTests.cs:单测进程无法初始化 Navisworks API,
Rail/Hoisting 路径导入必经的长度计算(Point3D 访问)必然失败,测试'假通过'且每次产生 ERROR 日志噪音
- 新增集成测试 PathImportValidityAutomationTests:验证完整流程
JSON/XML 导入 → Rail 属性映射 → 长度计算(含文档单位换算)→ 切换路径 → 完整动画/碰撞流程
- TestAutomationHttpService 新增 /api/test/import-route-file 端点(overwrite 语义保证可重复执行)
- NavisworksTestAutomationClient 新增 ImportRouteFileAsync/SelectRouteAsync/routeName 重载
- 修正 auto-test-routes.xml Rail 属性为有效枚举值(UnderRail/RailCenterLine,与原路径一致)
验证:单测 255/255 且 API must be initialized 错误日志归零;集成测试 6/6 通过
2026-08-02 21:19:23 +08:00
43df07c84d
feat: 集成测试标准路径自动导入机制
...
- 新增 resources/auto-test-routes.xml 标准测试路径资源(自动测试_Ground/Hoisting/Rail + 测试基准),缺失时由插件自动导入,无需人工维护数据库
- TestAutomationHttpService 新增 EnsureAutoTestRoutesImported(),挂接在 ResolveVirtualCollisionRoute 与 SelectDefaultRoutePayload 找不到路径时;资源定位用 Assembly.GetExecutingAssembly().Location
- csproj 添加 auto-test-routes.xml 复制配置(构建→部署目录 resources/)
- 标准 Hoisting 路径改为 4 点含水平平移段,修复 2 点纯垂直路径触发'平面路径第 0 帧未能生成完整姿态'的动画生成失败
- 集成测试套件 4/4 通过(Ground/Hoisting/Rail 碰撞 + AutoPath)
2026-08-02 21:02:15 +08:00
488e69d27a
fix: 脚本统一用 pwsh 替代 powershell,MSTest adapter 动态查找
...
- start-navisworks.bat / run-ground-virtual-collision-test.bat:
powershell → pwsh(避免依赖 shim/PS5.1,UTF-8 中文输出更可靠)
- deploy-plugin.bat 提权兜底:PowerShell → pwsh(内外一致)
- run-unit-tests.bat:MSTest adapter 路径硬编码 3.0.4 → 通配符动态查找
(包升级后不再失效)
2026-08-02 20:41:18 +08:00
8ee06586af
docs: Shell规范更新——rg/fd等读取命令用bash直接执行
...
历史:早期默认shell有UTF-8乱码才统一用pwsh;现已配置Git Bash
(shellPath),原生支持UTF-8。更新规范:
- rg/fd/读日志等搜索读取 → bash 直接执行
- .bat 部署/编译/测试流水线 → 仍走 pwsh
2026-08-02 20:33:38 +08:00