Commit Graph

74 Commits

Author SHA1 Message Date
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
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
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
84f67dbd79 fix: 自由路径姿态改为平面旋转(只绕垂直轴yaw,不绕前进轴滚动)
用户反馈:自由路径动画起点物体沿前进轴旋转90°(侧滚),
期望像地面路径一样只转向前进方向、仅绕垂直轴旋转。

根因:TryCreateFreePathRotationForFrame/AtStart 用了
CanonicalRailPoseBuilder(完整三维姿态,forward=3D切线),
会绕前进轴滚动。改为 CanonicalPlanarPoseBuilder
(forward=切线水平投影,up=世界up,只转yaw)。
撤销此前 ShouldPreservePathRotationForFrames 让 Free 保留姿态的改动。
同步更新 FreePathTests 断言(斜路径投影水平、纯垂直无水平方向返回false)。
257 单测全过。
2026-07-31 16:50:35 +08:00
4f0723f56f fix: 修正过弯检测测试期望值 + FreePathTests 加入csproj
过弯检测 CornerTurnCheckHelper 代码正确(maxLength 均为正),
但 6 个测试期望值与公式不符(7e71387 改算法时测试未同步)。
已按公式修正测试:补充 maxLength 断言,调整长度阈值。
另修复 FreePathTests 一处断言(斜路径 forward/up 分量)。
并将 FreePathTests.cs 显式加入 UnitTests.csproj(此前未编译运行)
2026-07-31 16:10:32 +08:00
002618f371 feat: 自由路径(Free Path)一级路径类型
- PathType 新增 Free=3,显示'自由'
- 动画:统一包围盒中心对齐,方案1姿态(forward=切线,up=世界up正交化)
  复用 CanonicalRailPoseBuilder,新增 TryCreateFreePathRotationForFrame/AtStart
- 渲染:通行空间垂直偏移0(路径点即物体中心)
- 路径管理器:StartCreatingNewRoute/FinishEditing 支持 Free
- UI:PathEditingView 新增'自由'按钮 + NewFreePathCommand
- 数据库:枚举存 int 无需 schema 变更
- 迁移:加载时 IsTwoPointVertical 吊装路径 → Free
- 单测:新增 FreePathTests(6个全通过)

注:CornerTurnCheckHelperTests 6个失败为分支起点已存在的 pre-existing 问题,与本次无关
2026-07-31 16:02:25 +08:00
7e71387fce fix: 过弯检测三分搜索方向错误, 文章公式 L(θ) = (C₁-W·cosθ)/sinθ + (C₂-W·sinθ)/cosθ 2026-07-08 13:06:17 +08:00
4f9206da2a feat: 过弯检测工具(纯解析几何公式) 2026-07-08 12:55:47 +08:00
5308552b40 修改贴合后,路径宽度和通行空间高度不正确的问题 2026-06-24 20:42:51 +08:00
66e68c6bd1 fix: 贴合地面后正确回写 correction 和 lift,确认/动画不再偏移
贴地后 overrideQ 是绝对旋转,但 _objectRotationCorrection 语义是
相对于 baseline(pathYaw) 的增量,且 PathAnimationManager 增量链从
CAD 姿态出发:finalQ = qup(pathYaw-currentYaw) * correctionHostQ * cadQ。
之前直接转 overrideQ 导致确认/动画时重复旋转。

核心改动:
- ComposeHostCorrection 接受 cadQ,从中提取 currentYaw,
  correctionHostQ = qup(currentYaw - pathYaw) * overrideQ
- HostQuaternionToCanonical 用相似变换 R_canon = M^-1 * R_host * M
  (非列向量映射,保证 Identity 不变性)
- CanonicalQuaternionToHostEulerCorrection 加 hostType 参数重载,
  去除全局 CoordinateSystemManager 依赖
- ComputeGroundLiftForCorrection:与自动调整同方法实测底边算 lift,
  finally 用新 correction+lift 完整重建(skipCadRestore=false),
  使物体停留在贴地等价姿态
- 新增 5 个增量链闭环单测(含 CAD 歪斜场景)
2026-06-24 08:24:38 +08:00
cf6b2ef959 fix: 修复 7 个 pre-existing 单测失败(optimizer 初始候选 + ZUp 测试语义)
ObjectPassageProjectionOptimizer.OptimizeWithEvaluator:
- 初始化 bestScore 评估 correction=Zero 作为初始候选
- 旧逻辑 bestScore=Invalid 导致 Zero 从未被评估,
  当 baseline 已对齐路径时随机采样必然替换它,refine 收敛不回 0
- 影响 3 个 Optimize 测试:baseline 已对齐时找不到 correction=0

ZUp 测试语义修正(4 个):
- LocalEulerRotationCorrection 语义:Y=up轴/yaw, Z=non-up轴
- ZUp 下 up=Z, non-up=Y,绕 Z(up) 转应使用 YDegrees 不是 ZDegrees
- 旧测试在 ZUp 下把 ZDegrees 当字面 Z 轴,与实现语义矛盾
2026-06-23 23:18:42 +08:00
7f3be8495c fix(tests): 修复 AliasTreeTests 编译错误并更新过时旧格式兼容测试
- SetAlias 调用补全缺失的 alias 参数(DeleteByPathPrefix 测试)
- 移除 4 个旧格式兼容测试,改为期望抛 FormatException
  (FromKey 已按 AGENTS.md "不向后兼容" 原则移除旧格式支持)
2026-06-23 23:12:40 +08:00
f86e8c8bf4 fix: 贴合地面后绕垂直轴搜索最小截面 yaw,对齐路径方向
贴地旋转已固定俯仰/翻滚,只剩绕宿主 Up 的 yaw 自由度。
对 CAD 姿态天然歪斜的物体,假设 local +X 是长轴会失败,
改为搜索 [0,360) 使物体在路径方向的截面投影面积最小,
与自动调整同目标但单自由度搜索更稳定。

- 新增 AlignToGroundMinCrossSectionYawSearcher(粗搜5°+细搜1°)
- 复用 ObjectPassageProjectionOptimizer.ProjectExtent 的 AABB 投影公式
- 新增 7 个单测覆盖平地/倾斜/CAD歪斜/垂直退化/立方体
- 经多物体实测验证:Chair Lounge Couch / Chair Sitting Square 均正确对齐
2026-06-23 23:09:59 +08:00
4feb12f6b9 refactor: AliasNodeIdentity dual-field + reuse ModelItemAnalysisHelper
- 新增 IndexPath(COM 树索引路径),复用 ModelItemAnalysisHelper.GetModelItemIndexPaths
- 保留 DisplayPath(父链 DisplayName 拼接)作为降级匹配
- 序列化格式:"IndexPath||DisplayPath",向后兼容纯 DisplayPath
- FindModelItemByNodeKey: IndexPath 优先定位,DisplayPath 降级
- BuildNode: 新增旧格式兼容查找
- 单元测试全面更新覆盖新/旧格式、双字段解析、前缀匹配
2026-05-31 12:52:26 +08:00
3f985aa235 phase 1: data layer for alias tree
- AliasNodeIdentity: stable composite node identifier (path + sibling index)
- AliasDataStore: CRUD operations on SQLite AliasMap table
- PathDatabase: add AliasMap table creation + index
- Unit tests: 30 tests for identity parsing/equality, store CRUD/batch/import
- Both projects compile successfully
2026-05-31 12:46:33 +08:00
7187bcf622 自动最优朝向: 黑盒实测模式
- 新增 ObjectPassageProjectionOptimizer(SO(3)粗搜索+Nelder-Mead)
- EditRotationWindow 加入"自动调整"按钮
- AnimationControlViewModel 实现黑盒实测评估(临时摆位→读BoundingBox→恢复)
- 设计文档和实现计划
2026-05-27 12:24:01 +08:00
454f1e6584 Fix auto path grid restore and validation 2026-04-26 19:11:03 +08:00
28d0708858 Lock selection clip box after activation 2026-04-15 16:02:12 +08:00
1a9d0972f0 Fix auto path obstacle geometry collection 2026-04-14 09:22:01 +08:00
fdb857af17 Refactor auto path planning coordinate semantics 2026-04-13 10:31:14 +08:00
b849bd9aed Add Navisworks automation integration tests 2026-04-13 02:33:29 +08:00
315fa46043 Unify planar collision pose replay 2026-04-12 15:01:33 +08:00
5a03c3aa6c preserve planar collision pose rotations 2026-04-10 22:02:43 +08:00
1a9c9ecd21 fix collision report save timing 2026-04-10 00:16:55 +08:00
da5f8a1ae1 add ground object lift adjustment 2026-04-09 23:53:40 +08:00
6020bfa979 fix hoisting descend point reuse 2026-04-09 23:28:12 +08:00
4fbab52880 clean legacy planar pose branches 2026-04-09 23:08:59 +08:00
3892ddabab Stabilize ground incremental rotation and extent tests 2026-04-09 21:09:43 +08:00
405f721811 Ground real-object incremental path updates 2026-04-08 23:06:42 +08:00
8a7563a4fe Clarify ground tracked-point semantics 2026-04-06 08:55:53 +08:00
348b3a75bf 修复地面倾斜路径偏移的问题 2026-04-05 14:03:41 +08:00
4ec4cf77ee Refine path viewpoint behavior and config editing 2026-04-02 22:14:26 +08:00
24951d4205 Stabilize hoisting start-pose logging and caching 2026-04-02 01:32:31 +08:00
9e8fea3241 Unify real-object override rotation application 2026-04-02 00:19:36 +08:00
7ff510daf0 Use actual hoisting pose without fragment fallback 2026-04-02 00:15:58 +08:00
953306fdb1 Stabilize hoisting pose flow and bounds inspection 2026-04-01 23:53:11 +08:00
e71ea81cdf Fix rail assembly normals and tighten rail camera 2026-04-01 20:12:57 +08:00
2e0b26e032 Refine rail assembly workflow and viewpoint strategies 2026-04-01 10:47:34 +08:00
d4c49fc227 Stabilize hoisting pose adjustment flow 2026-03-31 00:14:18 +08:00
cb56737041 Preserve terminal pose when translating rail objects to path start 2026-03-30 23:35:01 +08:00
9093374399 Use actual hoisting pose baseline for real objects 2026-03-29 23:36:43 +08:00
382923fa32 Relax fragment pose parsing and add fallback 2026-03-29 01:17:06 +08:00
f4735b164e Refine rail real-object pose handling 2026-03-28 22:22:18 +08:00
7851e6affa Map real-object angle adjustments from host axes 2026-03-28 22:21:11 +08:00
7db5a7a201 Add path duplication workflow 2026-03-28 12:36:24 +08:00