# 终点反推的直线装配路径设计

## 背景

当前空轨路径已经扩展出轨上/轨下、顶面对接/底面对接、局部姿态等能力，但用户进一步澄清了真实业务：

- 已知箱体最终安装后的准确位置和空间方向
- 该场景只需要一条起点到终点的直线运动
- Navisworks 里用户无法点击空气中的点，必须点击到某个实际对象

因此，这类路径不应继续建模为“轨道识别”问题，而应建模为“已知终点位姿的直线装配运动”问题。

## 核心思路

### 1. 终点位姿作为主输入

由用户选择终点处已经组装好的箱体，系统读取：

- 包围盒
- 当前朝向
- 终点构件中心 / 顶面中心 / 底面中心

终点位姿是整个运动仿真的主基准。

### 2. 生成可点击的参考杆

为了满足 Navisworks 的点击限制，系统不只绘制一条渲染线，而是生成一个临时参考实体：

- 形态：细长杆体
- 初版建议：直接复用 `unit_cube.nwc`，通过缩放生成细长方杆
- 作用：
  - 可视化直线参考路径
  - 允许用户点击取点
  - 为起点吸附提供稳定对象

### 3. 用户点击参考杆确定起点

用户在三维视图中点击参考杆上的某个位置后：

- 获取点击坐标
- 将点击点投影到参考杆轴线
- 该投影点作为真实起点

### 4. 生成最终直线路径

系统根据：

- 起点
- 终点位姿
- 轨上/轨下
- 顶面对接/底面对接

生成直线路径点列，并继续复用现有：

- 动画
- 通行空间
- 碰撞检测

## 与当前 Rail 方案的关系

### 保留

- `RailMountMode`
- `RailPayloadAnchorMode`
- `RailPathDefinitionMode`
- `RailPathPoseHelper`
- 动画完整姿态支持

这些都仍然有价值，因为终点和路径参考点之间仍需要姿态推导。

### 弱化 / 退出主路径

- 轨道几何识别
- 双轨自动分析
- 基于轨道装置的中心线提取

这些能力可保留为辅助模式，但不再作为该场景的主生成逻辑。

## 最小可行实现

### Phase 1

新增“终点反推参考杆”基础能力：

- 选择终点箱体
- 读取终点包围盒和朝向
- 生成参考杆临时实体
- 支持显示 / 隐藏 / 更新参考杆

### Phase 2

新增“点击参考杆生成直线路径”：

- 用户点击参考杆
- 起点投影到参考线
- 终点由终点箱体位姿推导
- 自动生成两点直线路径

### Phase 3

补齐 UI 与持久化：

- 在 PathEditingViewModel / PathEditingView 中新增入口
- 保存终点箱体引用、参考线方向、参考杆长度等参数

## 推荐复用点

- `VirtualObjectManager`
  - 复用 `unit_cube.nwc` 的加载、缩放、隐藏逻辑
- `ModelItemTransformHelper`
  - 复用带缩放的位姿变换
- `NavisworksSelectionHelper`
  - 复用当前选择对象读取
- `PathPlanningManager`
  - 复用点击工具和路径点落点链路

## 需要新增的能力

建议新增一个专用管理器，而不是继续塞进 `VirtualObjectManager`：

- `AssemblyReferencePathManager`

职责：

- 管理参考杆临时实体
- 根据终点箱体位姿生成参考轴线
- 提供点击点到参考线的投影
- 输出最终直线路径点

## 结论

本需求的主问题是“箱体的直线装配运动仿真”，不是“轨道识别”。  
推荐将实现重心切换为：

`终点箱体位姿 -> 参考杆 -> 点击起点 -> 直线路径 -> 动画/碰撞`

这条路线比轨道几何分析更稳定、更符合 Navisworks 交互约束，也更贴近用户真实使用方式。

## 当前实现状态

当前 worktree 中已经完成一版可试用实现，核心能力包括：

- 在路径编辑页新增“直线装配参考”区域
- 支持捕获终点处已安装箱体
- 支持选择 `轨上安装 / 轨下安装`
- 支持选择 `顶面对接 / 底面对接`
- 根据终点箱体位姿生成一根可点击的参考杆
- 在三维中渲染终点对接点标记
- 用户点击参考杆后，自动吸附到参考线并生成两点直线路径
- 新生成路径仍使用 `PathType.Rail`，因此可继续复用现有 Rail 动画、通行空间和碰撞检测链路

说明：

- 顶部原有“空轨路径”入口仍保留，但已改名为“传统空轨路径”
- 当前推荐优先使用“直线装配参考”流程

## 当前操作流程

### 1. 选择终点箱体

先在 Navisworks 三维视图中选中终点处已经安装好的箱体，然后在路径编辑页点击：

- `捕获终点箱体`

系统会记录：

- 箱体名称
- 包围盒中心与尺寸
- 当前选择的安装方式
- 当前选择的对接基准
- 推导出的终点对接点

### 2. 设置装配构型

在“直线装配参考”区域中设置：

- `安装方式`
  - `轨下安装`
  - `轨上安装`
- `对接基准`
  - `顶面对接`
  - `底面对接`

这两个参数会直接写入最终生成的 `PathRoute`：

- `RailMountMode`
- `RailPayloadAnchorMode`

### 3. 生成参考杆

设置参考杆参数后点击：

- `生成参考杆`

当前实现会：

- 从终点对接点沿箱体前向反推出参考杆
- 在三维场景中生成一根可点击的细长参考杆
- 同时渲染终点对接点标记，便于确认当前到底是顶面中心还是底面中心

参考杆资源优先使用：

- `resources/unit_cylinder.nwc`

如果该资源暂未放入，则会临时退回：

- `resources/unit_cube.nwc`

### 4. 点击参考杆生成路径

点击：

- `取起点并生成路径`

然后在三维中点击参考杆附近任意可拾取位置。系统会：

- 获取点击坐标
- 投影到参考杆轴线
- 将投影点作为真实起点
- 将终点对接点作为真实终点
- 自动创建一条两点直线路径

生成后的路径名称形如：

- `直线装配_1`

## 当前界面入口

相关界面位于：

- `路径编辑页 -> 直线装配参考`

当前主要按钮：

- `捕获终点箱体`
- `生成参考杆`
- `取起点并生成路径`
- `隐藏参考杆`

传统模式入口：

- `传统空轨路径`

## 当前已知边界

### 1. 终点对接点依赖包围盒和当前朝向

当前终点对接点通过以下信息推导：

- 世界包围盒
- 当前变换的局部 Z 方向
- 估算出的局部箱体高度

这对规则箱型构件是可行的，但如果对象几何明显偏离箱体、或包围盒受附属零件影响较大，终点锚点可能仍需进一步校核。

### 2. 参考杆方向当前取箱体前向

当前参考杆方向来自：

- 箱体变换后的局部 X 轴

这适合“装配移动方向与构件主朝向一致”的场景。  
如果后续遇到“箱体朝向正确，但装配退让方向不是局部 X 轴”的场景，需要再补一个“参考方向选择”输入。

### 3. 仍然复用 Rail 路径类型

当前新路径仍记为：

- `PathType.Rail`

这是有意为之，目的是复用已有 Rail 动画和通行空间逻辑。  
如果未来这类路径越来越多，可以再考虑单独抽象成新的路径类型，例如 `LinearAssembly`。

## 建议测试用例

建议至少验证以下组合：

1. `轨下安装 + 顶面对接`
2. `轨下安装 + 底面对接`
3. `轨上安装 + 顶面对接`
4. `轨上安装 + 底面对接`

每组建议检查：

- 终点对接点标记是否落在预期位置
- 参考杆是否从终点沿正确方向反推
- 点击参考杆后起点是否吸附到参考线上
- 生成路径后，动画位置和通行空间偏移是否符合构型

## 后续建议

下一阶段建议优先做这几项：

1. 增加“参考方向来源”选项
   例如允许用户直接指定反推方向，而不只使用箱体局部 X 轴。
2. 为直线装配路径增加更明确的导出字段
   便于区分“传统空轨路径”和“终点反推的直线装配路径”。
3. 补一份面向最终用户的简短操作说明
   可以从本节内容提炼成更短的 UI 使用指南。
