# 2.2.2 属性设置功能设计说明

## 2.2.2.1. 模块描述

属性设置模块是物流"类别"设置功能的核心模块，负责支持通过选择树和三维视图选择的方式，选择物流路径相关的元素（如门、电梯、楼梯、通道等），设置为特定的物流分类，并支持类型、可通行性、速度限制、宽度限制、优先级等属性的设置。同时支持在工具箱中进行识别和筛选，支持物流分类属性的添加、编辑和清除。

该模块与CategoryAttributeManager、LogisticsControlPanel和ConfigManager紧密集成，实现完整的物流属性管理功能。

## 2.2.2.2. 功能

### 核心功能
1. **元素选择**：通过选择树或三维视图选择物流元素
2. **分类设置**：设置元素的物流分类（门、电梯、楼梯、通道等）
3. **属性配置**：配置类型、可通行性、速度限制、宽度限制、优先级等属性
4. **工具箱集成**：在工具箱中进行识别和筛选
5. **属性编辑**：支持物流分类属性的添加、编辑和清除

### 子功能
| 功能编号 | 功能名称 | 功能描述 |
|---------|---------|---------|
| 2.2.2.F1 | 选择树选择 | 通过选择树面板选择元素 |
| 2.2.2.F2 | 三维视图选择 | 在三维视图中点选元素 |
| 2.2.2.F3 | 分类设置 | 设置元素的物流分类类型 |
| 2.2.2.F4 | 可通行性设置 | 设置元素是否可通行 |
| 2.2.2.F5 | 优先级设置 | 设置元素的优先级（1-10） |
| 2.2.2.F6 | 速度限制设置 | 设置元素的速度限制 |
| 2.2.2.F7 | 宽度限制设置 | 设置元素的宽度限制 |
| 2.2.2.F8 | 高度限制设置 | 设置元素的高度限制 |
| 2.2.2.F9 | 属性清除 | 清除元素的物流属性 |
| 2.2.2.F10 | 工具箱筛选 | 在工具箱中按分类筛选元素 |

## 2.2.2.3. 性能

### 性能指标
| 指标名称 | 目标值 | 说明 |
|---------|-------|------|
| 属性设置响应 | < 200ms | 设置单个元素属性的响应时间 |
| 批量设置时间 | < 2秒 | 批量设置100个元素属性的时间 |
| 筛选查询时间 | < 500ms | 按分类筛选元素的查询时间 |
| 内存占用 | < 100MB | 属性管理的额外内存占用 |

### 性能优化策略
1. 批量COM API调用减少开销
2. 属性缓存机制
3. 异步处理大批量操作

## 2.2.2.4. 输入输出项

### 1. 字段输入输出

#### 输入字段
| 字段名 | 类型 | 必填 | 说明 |
|-------|------|-----|------|
| Items | ModelItemCollection | 是 | 选中的模型元素 |
| ElementType | LogisticsElementType | 是 | 物流元素类型 |
| IsTraversable | bool | 否 | 是否可通行，默认true |
| Priority | int | 否 | 优先级（1-10），默认5 |
| HeightLimit | double | 否 | 高度限制（米），默认3.0 |
| SpeedLimit | double | 否 | 速度限制（米/秒），默认0.8 |
| WidthLimit | double | 否 | 宽度限制（米），默认3.0 |

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

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

#### 界面输入
- 元素选择操作
- 分类类型下拉选择
- 属性值输入
- 批量操作确认

#### 界面输出
- 选中元素高亮显示
- 属性设置结果提示
- 当前属性值显示
- 统计信息面板

## 2.2.2.5. 算法

### 属性设置算法
```
算法：设置物流元素属性
输入：模型元素集合，属性参数
输出：设置结果

1. 准备属性字典
   - 类型：ElementType.ToString()
   - 可通行：IsTraversable ? "是" : "否"
   - 优先级：Priority.ToString()
   - 高度限制：HeightLimit + " m"
   - 速度限制：SpeedLimit + " m/s"
   - 宽度限制：WidthLimit + " m"

2. 准备内部名称字典

3. 调用COM API批量设置属性

4. 如果是空轨类型，预计算基准路径

5. 返回应用统计
```

### 分类筛选算法
```
算法：按物流分类筛选元素
输入：分类类型
输出：匹配的元素列表

1. 创建搜索条件
2. 设置搜索条件：
   - PropertyName = "类型"
   - Condition = Equal
   - Value = 分类类型.ToString()
3. 执行搜索
4. 返回匹配的元素集合
```

## 2.2.2.6. 流程逻辑

```
开始
  │
  ▼
┌─────────────────┐
│  选择模型元素    │
└────────┬────────┘
         │
    ┌────┴────┐
    ▼         ▼
┌────────┐  ┌────────┐
│选择树  │  │三维视图│
└───┬────┘  └───┬────┘
    │           │
    └─────┬─────┘
          │
          ▼
┌─────────────────┐
│  显示选中预览    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  设置分类类型    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  配置属性参数    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  应用属性设置    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  显示设置结果    │
└────────┬────────┘
         │
         ▼
        结束
```

## 2.2.2.7. 接口

### 公共接口
```csharp
/// <summary>
/// 类别属性管理器
/// </summary>
public class CategoryAttributeManager
{
    /// <summary>
    /// 添加物流属性（使用配置默认值）
    /// </summary>
    public static int AddLogisticsAttributes(
        ModelItemCollection items,
        LogisticsElementType elementType);
    
    /// <summary>
    /// 添加物流属性（指定所有参数）
    /// </summary>
    public static int AddLogisticsAttributes(
        ModelItemCollection items,
        LogisticsElementType elementType,
        bool isTraversable,
        int priority,
        double heightLimit,
        double speedLimit,
        double widthLimit);
    
    /// <summary>
    /// 清除物流属性
    /// </summary>
    public static int ClearLogisticsAttributes(ModelItemCollection items);
    
    /// <summary>
    /// 按类型获取物流元素
    /// </summary>
    public static List<ModelItem> GetLogisticsItemsByType(string typeName);
    
    /// <summary>
    /// 获取所有可通行物流元素
    /// </summary>
    public static List<ModelItem> GetAllTraversableLogisticsItems();
}
```

### 物流元素类型枚举
```csharp
public enum LogisticsElementType
{
    空洞 = 0,      // 不可通行
    障碍物 = 1,    // 不可通行
    楼板 = 2,      // 基础可通行，权重1.0
    门 = 3,        // 可通行，权重1.2
    电梯 = 4,      // 可通行，权重2.0
    楼梯 = 5,      // 可通行，权重3.0
    通道 = 6,      // 可通行，优先路径，权重0.5
    走廊 = 7,      // 可通行，权重0.6
    装卸区 = 8,    // 可通行，权重0.8
    停车位 = 9,    // 可通行，权重0.9
    空轨 = 10,     // 可通行，权重0.7
    无关项 = 11    // 不参与网格生成
}
```

## 2.2.2.8. 注释设计

### 代码注释规范
```csharp
/// <summary>
/// 物流属性定义
/// </summary>
public static class LogisticsProperties
{
    /// <summary>
    /// 物流元素类型
    /// </summary>
    public const string TYPE = "类型";
    
    /// <summary>
    /// 是否可通行
    /// </summary>
    public const string TRAVERSABLE = "可通行";
    
    /// <summary>
    /// 优先级（1-10）
    /// </summary>
    public const string PRIORITY = "优先级";
    
    /// <summary>
    /// 高度限制（米）
    /// </summary>
    public const string HEIGHT_LIMIT = "高度限制";
    
    /// <summary>
    /// 速度限制（米/秒）
    /// </summary>
    public const string SPEED_LIMIT = "速度限制";
    
    /// <summary>
    /// 宽度限制（米）
    /// </summary>
    public const string WIDTH_LIMIT = "宽度限制";
}
```

## 2.2.2.9. 数据结构

### LogisticsElementType 枚举
| 值 | 名称 | 说明 | 权重 |
|---|------|------|-----|
| 0 | 空洞 | 没有任何几何覆盖，不可通行 | - |
| 1 | 障碍物 | 墙体、柱子、设备等，不可通行 | - |
| 2 | 楼板 | 基础可通行区域 | 1.0 |
| 3 | 门 | 可通行 | 1.2 |
| 4 | 电梯 | 可通行 | 2.0 |
| 5 | 楼梯 | 可通行 | 3.0 |
| 6 | 通道 | 可通行，优先路径 | 0.5 |
| 7 | 走廊 | 可通行 | 0.6 |
| 8 | 装卸区 | 可通行 | 0.8 |
| 9 | 停车位 | 可通行 | 0.9 |
| 10 | 空轨 | 空中运输路径 | 0.7 |
| 11 | 无关项 | 不参与网格生成 | - |

### LogisticsAttribute 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| ElementType | LogisticsElementType | 元素类型 |
| IsTraversable | bool | 是否可通行 |
| Priority | int | 优先级 |
| HeightLimitMeters | double | 高度限制（米） |
| SpeedLimitMetersPerSecond | double | 速度限制（米/秒） |
| WidthLimitMeters | double | 宽度限制（米） |
