# 2.2.1 类别设置功能设计说明

## 2.2.1.1. 模块描述

类别设置模块是物流"类别"设置功能的核心模块，负责在模型属性页面新增"物流属性"类别。该模块为后续的物流元素分类和属性管理提供基础支持，通过扩展Navisworks的属性系统，为模型元素添加物流相关的分类信息。

该模块与CategoryAttributeManager和NavisworksComPropertyManager紧密集成，使用COM API在模型元素上创建自定义的"物流属性"类别。

## 2.2.1.2. 功能

### 核心功能
1. **类别创建**：在模型属性页面创建"物流属性"类别
2. **类别管理**：管理物流属性的类别定义和结构
3. **属性扩展**：为类别添加自定义属性字段
4. **持久化存储**：将类别信息持久化存储在模型中

### 子功能
| 功能编号 | 功能名称 | 功能描述 |
|---------|---------|---------|
| 2.2.1.F1 | 类别初始化 | 初始化物流属性类别结构 |
| 2.2.1.F2 | 类别检查 | 检查元素是否已有物流属性 |
| 2.2.1.F3 | 类别添加 | 为元素添加物流属性类别 |
| 2.2.1.F4 | 类别移除 | 从元素移除物流属性类别 |
| 2.2.1.F5 | 类别查询 | 查询具有特定类别的元素 |

## 2.2.1.3. 性能

### 性能指标
| 指标名称 | 目标值 | 说明 |
|---------|-------|------|
| 类别添加时间 | < 100ms | 为单个元素添加类别的时间 |
| 批量添加时间 | < 1秒 | 为100个元素批量添加类别 |
| 类别查询时间 | < 500ms | 查询特定类别元素的时间 |
| 内存占用 | < 50MB | 类别管理的额外内存占用 |

### 性能优化策略
1. 批量COM API调用减少开销
2. 类别缓存避免重复查询
3. 延迟加载策略

## 2.2.1.4. 输入输出项

### 1. 字段输入输出

#### 输入字段
| 字段名 | 类型 | 必填 | 说明 |
|-------|------|-----|------|
| Items | ModelItemCollection | 是 | 要添加类别的模型元素 |
| CategoryName | string | 否 | 类别名称，默认"物流属性" |

#### 输出字段
| 字段名 | 类型 | 说明 |
|-------|------|------|
| SuccessCount | int | 成功添加类别的元素数量 |
| HasCategory | bool | 元素是否已有物流属性 |

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

#### 界面输入
- 类别名称设置
- 元素选择确认
- 类别添加/移除操作

#### 界面输出
- 类别添加结果提示
- 元素属性面板更新
- 类别统计信息

## 2.2.1.5. 算法

### 类别添加算法
```
算法：为元素添加物流属性类别
输入：模型元素集合
输出：添加结果

1. 初始化COM API
2. 对于每个元素：
   3. 检查元素是否已有物流属性
   4. 如果已有，跳过
   5. 创建"物流属性"类别
   6. 添加类别到元素的属性集合
7. 提交更改
8. 返回统计结果
```

### 类别查询算法
```
算法：查询具有物流属性的元素
输入：搜索范围
输出：元素列表

1. 创建搜索条件
2. 设置搜索条件：PropertyCategory = "物流属性"
3. 执行搜索
4. 返回匹配的元素集合
```

## 2.2.1.6. 流程逻辑

```
开始
  │
  ▼
┌─────────────────┐
│  选择模型元素    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐      是
│  已有物流属性？  │──────────┐
└────────┬────────┘          │
         │否                 │
         ▼                   │
┌─────────────────┐          │
│  创建物流属性类别 │          │
└────────┬────────┘          │
         │                   │
         ▼                   │
┌─────────────────┐          │
│  添加类别到元素  │          │
└────────┬────────┘          │
         │                   │
    ┌────┴───────────────────┘
    │
    ▼
┌─────────────────┐
│  更新属性面板    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  显示操作结果    │
└────────┬────────┘
         │
         ▼
        结束
```

## 2.2.1.7. 接口

### 公共接口
```csharp
/// <summary>
/// 类别属性管理器
/// </summary>
public class CategoryAttributeManager
{
    /// <summary>
    /// 添加物流属性类别
    /// </summary>
    /// <param name="items">模型元素集合</param>
    /// <returns>成功添加的数量</returns>
    public int AddLogisticsCategory(ModelItemCollection items);
    
    /// <summary>
    /// 检查元素是否有物流属性
    /// </summary>
    /// <param name="item">模型元素</param>
    /// <returns>是否有物流属性</returns>
    public bool HasLogisticsCategory(ModelItem item);
    
    /// <summary>
    /// 移除物流属性类别
    /// </summary>
    /// <param name="items">模型元素集合</param>
    /// <returns>成功移除的数量</returns>
    public int RemoveLogisticsCategory(ModelItemCollection items);
    
    /// <summary>
    /// 获取所有具有物流属性的元素
    /// </summary>
    /// <returns>元素列表</returns>
    public List<ModelItem> GetAllLogisticsItems();
}
```

## 2.2.1.8. 注释设计

### 代码注释规范
```csharp
/// <summary>
/// 物流类别定义
/// </summary>
public static class LogisticsCategories
{
    /// <summary>
    /// 物流属性类别显示名称
    /// </summary>
    public const string LOGISTICS = "物流属性";
    
    /// <summary>
    /// 物流属性类别内部名称
    /// 用于COM API操作
    /// </summary>
    public const string CATEGORY_INTERNAL_NAME = "物流属性_Internal";
}
```

## 2.2.1.9. 数据结构

### LogisticsCategories 常量
| 常量名 | 值 | 说明 |
|-------|---|------|
| LOGISTICS | "物流属性" | 类别显示名称 |
| CATEGORY_INTERNAL_NAME | "物流属性_Internal" | 类别内部名称 |

### CategoryResult 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| SuccessCount | int | 成功数量 |
| FailCount | int | 失败数量 |
| ProcessedItems | List<ModelItem> | 处理的元素 |
