Commit Graph

770 Commits

Author SHA1 Message Date
ce4b2a0c06 chore: 状态栏左侧空白缩小,显示更多信息 2026-07-16 10:38:09 +08:00
b179adb2a0 chore: 实验特性区改名为高级,移除emoji前缀 2026-07-16 10:34:11 +08:00
80bd7b7c65 chore: 预计算高亮按钮移至折叠的实验特性区 2026-07-16 10:30:29 +08:00
b00f0093ab fix: 坐标系检测按钮移至快速取面的空位 2026-07-16 10:25:41 +08:00
5e0af1def7 chore: 功能测试区更名为实验特性,移除快速取面按钮 2026-07-16 10:22:30 +08:00
c35138ef25 feat: 坐标系检测按钮加入 Fragment 矩阵分析法(选一个水平物体后可用) 2026-07-16 10:14:07 +08:00
00afbeec73 chore: 坐标系检测按钮移至功能测试区 2026-07-16 10:06:44 +08:00
823c2de74d refactor: 合并坐标系设置——FragmentUp 自动从 CoordinateSystemManager 派生,删除独立的 FragmentUp 控件和检测按钮 2026-07-16 10:03:03 +08:00
0629384639 feat: 包围盒按钮图标替换为线框立方体;过弯检测按钮图标增强为L形通道+方块 2026-07-16 09:41:47 +08:00
a0a0687bde feat: 包围盒图标改为双立方体线框样式,与剖面盒图标风格统一 2026-07-16 09:09:38 +08:00
c379eb1bed feat: 替换包围盒信息和过弯检测按钮图标为更合适的几何图形 2026-07-16 08:52:08 +08:00
86abf2bf8d fix: 别名树重启后显示错误 — EnsurePathLoaded 硬编码 siblingIndex=0 导致同名兄弟节点映射到同一 key;SetDataStore 补刷别名;别名明细日志改为 DEBUG 2026-07-14 10:28:22 +08:00
69bf5d6e39 fix: 剖面盒聚焦按钮在无选中/无路径时不应清除或操作剖面盒,部署脚本加入管理员提权 2026-07-14 09:56:52 +08:00
9012461d59 feat: Ribbon 多语言支持,新增 en-US/zh-CN 本地化 XAML 2026-07-12 13:05:39 +08:00
6666d30413 fix: 别名树右键菜单移除冗余的「在视图中聚焦」,统一术语为「子树别名」 2026-07-12 11:34:23 +08:00
5341fa145d fix: 别名树 _nodeMap key 格式不统一导致导入/粘贴后显示错误 2026-07-12 11:19:48 +08:00
ad4067cf1c fix: 过弯检测公式判断方向、对话框文案、三分搜索方向 2026-07-08 13:18:32 +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
70fee3cf3a fix: 碰撞报告容差单位错误 & 导入路径增量刷新; docs: AGENTS.md 构建脚本 2026-07-07 20:38:59 +08:00
ef22e49491 feat: 别名树子树别名导出/导入/复制/粘贴功能 2026-07-07 20:00:08 +08:00
b53471c022 chore: 移除状态栏临时性" 恢复剖面\按钮 2026-07-07 07:36:32 +08:00
809df425ee fix: 剖面盒关闭时恢复 Planes 剖面不切换模式,修复 UI 指示器不显示
根因:ClearClipBox() 发送的是 Box 模式 JSON + Enabled:false,
将 ClipPlaneSet 模式从 Planes 切到 Box。后续再应用 Planes JSON
时模式又切回来,Navisworks 在该切换过程中未刷新 Planes 指示器。

修复:清除时不调用 ClearClipBox()(Box JSON),改为:
1. 发 Planes 模式 + Enabled:false(保持模式,仅禁用)
2. 发 Planes 模式 + Enabled:true(保持模式,仅切换启用)
全程模式不变,指示器正常显示。

移除已不需要的注释和调试日志。
2026-06-30 20:49:48 +08:00
17d774154d fix: 关闭剖面盒后恢复剖面状态时同时显示UI指示器
JSON 透传方式不触发 Navisworks 剖面工具 UI 指示器。
改为解析保存的 JSON 自动识别 Box/Planes 模式:
- Box 模式:提取包围盒,用 ApplyClipBox 重建(已知能显示指示器)
- Planes 模式:提取平面数据 (Normal/Distance),重建 Planes JSON
移除旧注释中关于手动对齐的说明
2026-06-30 20:37:29 +08:00
0d4498e03d chore: bump version to 0.16.1, update changelog 2026-06-28 17:48:56 +08:00
6ef866d1dc fix: 路径切换保留 lift 避免物体浮空,物体参数同步优先读 AABB 缓存
路径切换问题:
- 切换路径时 lift 被重置为 0,GetAnimatedObjectGroundContactHeight
  用 correction 投影算出错误高度(~4.27m),物体浮空
- 改为保留 lift(离地高度不变),路径切换后物体保持正确位置

可视化宽度问题:
- 路径切换后物体参数同步(SyncAnimationViewObjectParameters)
  调用 TryGetCurrentRouteRealObjectPlanarProjectedExtents,
  用 correction 投影算失真尺寸覆盖正确值
- 改为优先读 AnimationControlViewModel 的 _autoAabbSx 缓存
  (由 MeasureXAlignedAabbAndSetCache 实测得到)
- 新增 TryGetCachedAabbSizes 公开缓存给外部
2026-06-28 12:50:28 +08:00
da6b6cb481 chore: remove temporary wpftmp csproj files 2026-06-26 09:20:45 +08:00
105061bade feat: 贴合地面功能 + 通行空间尺寸准确化 + UI修复 (0.16.0)
贴合地面:点选物体表面自动贴地+搜索最小截面对齐路径
- AlignToGroundMinCrossSectionYawSearcher 搜索yaw
- ComposeHostCorrection 扣除CAD yaw+pathYaw避免重复旋转
- ComputeGroundLiftForCorrection 实测底边算lift

通行空间尺寸:实际旋转物体到X轴方向测AABB再转回
- MeasureXAlignedAabbAndSetCache 自动调整和贴合地面共用
- ObjectRotationCorrection setter 清空缓存修复手动改角度不同步

UI:调整物体窗口按钮区改Grid布局真正居中
版本号 0.15.8 -> 0.16.0
2026-06-26 09:17:46 +08:00
3cb5d8d423 fix: 贴地后用实际旋转物体到X轴方向测AABB获取准确通行空间尺寸
路径斜向时世界AABB投影偏大,纯数学旋转AABB也会膨胀。
改为用Navisworks API实际旋转物体到X轴方向测量AABB,再转回来:
- 算路径方向相对X轴的夹角 angleToX
- 绕hostUp旋转物体 -angleToX 使路径对齐X轴
- 测AABB:X=沿路径长度,up轴=高度,非up轴=宽度
- 转回来恢复姿态

清理STEP1-STEP6诊断日志,保留STEP7为正式日志。
2026-06-25 08:53:14 +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
75afba7670 docs: 去掉UTF-8显式设置,已配好pwsh profile 2026-06-10 17:48:48 +08:00
020e265918 docs: pwsh 命令加 UTF-8 输出编码设置 2026-06-10 17:45:16 +08:00
e9fb47d9ad docs: shell命令统一用pwsh执行 2026-06-10 17:44:43 +08:00
82caa3e155 feat: 贴合地面加入路径yaw补偿,物体旋转后长边对齐路径方向 2026-06-09 11:37:03 +08:00
63b59890e4 refactor: 贴合地面改为独立操作(选面即生效),确认按钮去分支,上下偏移默认物流车高度 2026-06-09 11:25:50 +08:00
999fffcaa7 fix: 贴合地面:恢复git版本旋转逻辑 + 底边贴地高度修正 2026-06-09 10:06:12 +08:00
034acb1d65 fix: 贴合地面旋转修正 — 路径起点法向量→CAD空间算对齐,直接 OverridePermanentTransform 施压
- 读路径起点 ActiveTransform 取 psQ,复位 CAD 后取 cadQ
- 路径起点世界法向量→inv(psQ)→局部→cadQ→CAD 世界法向量
- CAD 世界法向量→-hostUp 算 overrideQ
- 直接 OverridePermanentTransform 施加,不走 ApplyRotationCorrectionInPlace
- 待加平移
2026-06-09 08:42:42 +08:00
f75dcb1f50 refactor: use PathAnimationManager.ApplyQuaternionRotationInPlace
- New method mirrors proven ApplyRotationCorrectionInPlace pattern
- ViewModel only calls existing project APIs, no raw OverridePermanentTransform
2026-06-09 03:39:56 +08:00
3634551e53 fix: use incremental transform to preserve path start position
- Don't ResetPermanentTransform (keeps path placement)
- Apply rotation around object center as incremental transform
- T(-center) * R * T(center) via Transform3D.Multiply
2026-06-09 03:37:35 +08:00
c8d48755db fix: apply face-to-ground rotation directly via quaternion, skip Euler decomposition
- Use existing OverridePermanentTransform pattern from PathAnimationManager
- Compute quaternion from face normal → ground direction
- Apply directly as Rotation3D with center-preserving translation
- Sync tracked state after application
2026-06-09 03:32:26 +08:00
10a0ad754c fix: move face-to-ground mate logic from modal dialog to ViewModel
- Modal ShowDialog blocks Navisworks ToolPlugin message loop
- Now: '贴地面' sets MateToGroundRequested flag, closes dialog
- AnimationControlViewModel handles FaceInferToolPlugin activation
- OnFaceToGroundInferred computes rotation and applies directly
2026-06-09 03:22:50 +08:00
2f16ec0d43 fix: add debug log, use NavisApplication alias in EditRotationWindow 2026-06-09 03:18:20 +08:00
9ea3cc0e02 feat: add '贴地面' face-to-ground mate in EditRotationWindow
- New button activates FaceInferToolPlugin to pick face on object
- Computes rotation from face normal to ground direction
- Decomposes to ZYX Euler angles, fills X/Y/Z fields
- User can preview and confirm as usual
2026-06-09 03:12:22 +08:00
2e959c16c9 chore: bump version to 0.15.8, update changelog 2026-06-09 03:01:18 +08:00
ea0ea1c3ca refactor: remove old 2-click installation point code
- Remove ExecuteSelectAssemblyInstallationPointAsync
- Remove OnAssemblyInstallationMouseClicked
- Remove BeginAssemblyInstallationSelection
- Remove BuildAndRenderAssemblyInstallationReference
- Single-click '选安装面' is now the only way
2026-06-09 02:57:45 +08:00
d3b2906169 feat: add FailureReason to FaceInferResult for specific error messages
- FaceInferToolPlugin now returns specific reasons: '未命中模型' or '表面过窄'
- ViewModel handlers show FailureReason instead of generic '未命中有效表面'
- Catch exceptions still pass through BuildFromFaceNormal error messages
2026-06-09 02:53:41 +08:00