# 2.1.2 通道选择功能设计说明

## 2.1.2.1. 模块描述

通道选择模块是物流路径规划系统的核心功能模块，负责支持用户通过选择树或三维视图点选的方式选择通道模型，并将其指定为通道类型。该模块是后续自动路径规划的基础，为A*算法提供可通行的通道区域数据。

通道选择模块与CategoryAttributeManager紧密集成，将选中的模型元素标记为物流属性中的"通道"类型，并设置相应的通行属性。

## 2.1.2.2. 功能

### 核心功能
1. **选择树选择**：通过Navisworks选择树面板选择模型元素
2. **三维点选**：在三维视图中直接点击选择模型元素
3. **通道类型指定**：将选中的模型指定为通道类型
4. **批量选择**：支持框选和批量选择多个元素

### 子功能
| 功能编号 | 功能名称 | 功能描述 |
|---------|---------|---------|
| 2.1.2.F1 | 选择树集成 | 与Navisworks选择树面板集成，支持树形结构选择 |
| 2.1.2.F2 | 三维点选 | 支持在三维视图中点击选择模型 |
| 2.1.2.F3 | 框选支持 | 支持矩形框选多个模型元素 |
| 2.1.2.F4 | 类型指定 | 将选中的模型指定为通道类型 |
| 2.1.2.F5 | 选择预览 | 高亮显示当前选中的模型元素 |
| 2.1.2.F6 | 选择确认 | 确认选择并应用通道属性 |

## 2.1.2.3. 性能

### 性能指标
| 指标名称 | 目标值 | 说明 |
|---------|-------|------|
| 点选响应时间 | < 100ms | 三维视图中点击选择的响应时间 |
| 批量选择支持 | > 1000个 | 单次批量选择的最大元素数量 |
| 属性应用时间 | < 500ms | 通道属性应用到选中元素的时间 |
| 内存占用 | < 100MB | 选择过程中的额外内存占用 |

### 性能优化策略
1. 使用空间索引加速三维点选
2. 批量属性设置，减少COM API调用次数
3. 选择结果缓存，避免重复查询

## 2.1.2.4. 输入输出项

### 1. 字段输入输出

#### 输入字段
| 字段名 | 类型 | 必填 | 说明 |
|-------|------|-----|------|
| SelectedItems | ModelItemCollection | 是 | 选中的模型元素集合 |
| ChannelType | LogisticsElementType | 否 | 通道类型，默认Channel |
| Priority | int | 否 | 优先级，默认5 |
| IsTraversable | bool | 否 | 是否可通行，默认true |

#### 输出字段
| 字段名 | 类型 | 说明 |
|-------|------|------|
| AppliedCount | int | 成功应用属性的元素数量 |
| FailedItems | List<ModelItem> | 应用失败的元素列表 |
| ChannelItems | List<ModelItem> | 当前所有通道元素列表 |

### 2. 界面交互输入输出

#### 界面输入
- 鼠标点击/框选操作
- 选择树节点勾选
- 通道属性参数设置

#### 界面输出
- 选中元素高亮显示
- 选择数量统计
- 通道类型应用结果提示

## 2.1.2.5. 算法

### 三维点选算法
```
算法：基于射线检测的三维点选
输入：鼠标屏幕坐标，相机参数
输出：选中的模型元素

1. 将屏幕坐标转换为射线（Ray）
2. 遍历所有可见模型元素：
   3. 计算射线与元素包围盒的交点
   4. 如果有交点，计算精确交点距离
5. 返回距离最近的元素
```

### 通道属性应用算法
```
算法：批量应用通道属性
输入：选中的模型元素集合
输出：应用结果

1. 初始化COM API
2. 对于每个选中的元素：
   3. 检查元素是否已有物流属性
   4. 如果存在且冲突，记录冲突
   5. 应用通道类型属性
   6. 应用优先级、可通行性等属性
7. 批量提交属性更改
8. 返回应用统计
```

## 2.1.2.6. 流程逻辑

```
开始
  │
  ▼
┌─────────────────┐
│  进入选择模式    │
└────────┬────────┘
         │
    ┌────┴────┐
    ▼         ▼
┌────────┐  ┌────────┐
│选择树  │  │三维点选│
└───┬────┘  └───┬────┘
    │           │
    └─────┬─────┘
          │
          ▼
┌─────────────────┐
│  显示选中预览    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  确认通道类型    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  应用通道属性    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  显示应用结果    │
└────────┬────────┘
         │
         ▼
        结束
```

## 2.1.2.7. 接口

### 公共接口
```csharp
/// <summary>
/// 通道选择管理器
/// </summary>
public class ChannelSelectionManager
{
    /// <summary>
    /// 设置选中元素为通道
    /// </summary>
    /// <param name="items">选中的模型元素</param>
    /// <returns>应用结果</returns>
    public ChannelSelectionResult SetAsChannel(ModelItemCollection items);
    
    /// <summary>
    /// 获取所有通道元素
    /// </summary>
    /// <returns>通道元素列表</returns>
    public List<ModelItem> GetAllChannels();
    
    /// <summary>
    /// 清除元素的通道属性
    /// </summary>
    /// <param name="items">要清除的元素</param>
    /// <returns>清除的元素数量</returns>
    public int ClearChannelAttribute(ModelItemCollection items);
}
```

### 事件接口
```csharp
/// <summary>
/// 选择变更事件
/// </summary>
public event EventHandler<SelectionChangedEventArgs> SelectionChanged;

/// <summary>
/// 通道属性应用完成事件
/// </summary>
public event EventHandler<ChannelAppliedEventArgs> ChannelApplied;
```

## 2.1.2.8. 注释设计

### 代码注释规范
```csharp
/// <summary>
/// 通道选择结果
/// </summary>
public class ChannelSelectionResult
{
    /// <summary>
    /// 成功应用的元素数量
    /// </summary>
    public int AppliedCount { get; set; }
    
    /// <summary>
    /// 应用失败的元素列表
    /// 失败原因可能是元素已被锁定或API调用失败
    /// </summary>
    public List<ModelItem> FailedItems { get; set; }
}
```

### 配置文件注释
```toml
# 通道选择配置
[channel_selection]
# 默认通道类型
default_channel_type = "通道"
# 默认优先级（1-10）
default_priority = 5
# 点选容差（像素）
click_tolerance_pixels = 5
```

## 2.1.2.9. 数据结构

### ChannelSelectionResult 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| AppliedCount | int | 成功应用的元素数量 |
| FailedCount | int | 失败的元素数量 |
| FailedItems | List<ModelItem> | 失败的元素列表 |
| ConflictCount | int | 冲突的元素数量 |

### SelectionChangedEventArgs 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| SelectedItems | ModelItemCollection | 当前选中的元素 |
| SelectionCount | int | 选中元素数量 |
| SelectionBounds | BoundingBox3D | 选中元素的包围盒 |

### ChannelAppliedEventArgs 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| AppliedCount | int | 成功应用的元素数量 |
| ChannelType | LogisticsElementType | 应用的通道类型 |
| ApplyTime | DateTime | 应用时间 |
