# 2.3.2 物流元素筛选功能设计说明

## 2.3.2.1. 模块描述

物流元素筛选模块是层级创建功能的重要模块，负责支持通过预设的物流分类属性筛选出物流路径相关元素。该模块使用户能够快速定位和查看具有特定物流属性的模型元素，便于进行路径规划前的元素检查和管理。

该模块与CategoryAttributeManager、NavisworksSelectionHelper和搜索系统紧密集成，实现基于属性的高效元素筛选。

## 2.3.2.2. 功能

### 核心功能
1. **按类型筛选**：按物流元素类型筛选（门、电梯、楼梯、通道等）
2. **按属性筛选**：按可通行性、优先级等属性筛选
3. **组合筛选**：支持多条件组合筛选
4. **筛选结果高亮**：高亮显示筛选结果
5. **筛选保存**：保存常用的筛选条件

### 子功能
| 功能编号 | 功能名称 | 功能描述 |
|---------|---------|---------|
| 2.3.2.F1 | 类型筛选 | 按物流元素类型筛选 |
| 2.3.2.F2 | 可通行筛选 | 按是否可通行筛选 |
| 2.3.2.F3 | 优先级筛选 | 按优先级范围筛选 |
| 2.3.2.F4 | 组合筛选 | 多条件组合筛选 |
| 2.3.2.F5 | 结果高亮 | 高亮显示筛选结果 |
| 2.3.2.F6 | 结果选择 | 将筛选结果添加到选择集 |
| 2.3.2.F7 | 筛选保存 | 保存筛选条件 |
| 2.3.2.F8 | 筛选加载 | 加载已保存的筛选条件 |

## 2.3.2.3. 性能

### 性能指标
| 指标名称 | 目标值 | 说明 |
|---------|-------|------|
| 筛选响应时间 | < 1秒 | 执行筛选操作的响应时间 |
| 支持元素数量 | > 10000 | 支持筛选的最大元素数量 |
| 结果高亮时间 | < 500ms | 高亮显示结果的时间 |
| 内存占用 | < 100MB | 筛选过程的额外内存占用 |

### 性能优化策略
1. 使用Navisworks搜索API进行高效筛选
2. 筛选结果缓存
3. 增量筛选减少重复计算

## 2.3.2.4. 输入输出项

### 1. 字段输入输出

#### 输入字段
| 字段名 | 类型 | 必填 | 说明 |
|-------|------|-----|------|
| ElementTypes | List<LogisticsElementType> | 否 | 要筛选的类型列表 |
| IsTraversable | bool? | 否 | 可通行性筛选条件 |
| MinPriority | int? | 否 | 最小优先级 |
| MaxPriority | int? | 否 | 最大优先级 |

#### 输出字段
| 字段名 | 类型 | 说明 |
|-------|------|------|
| FilteredItems | List<ModelItem> | 筛选结果的元素列表 |
| FilterCount | int | 筛选结果数量 |
| FilterTime | TimeSpan | 筛选耗时 |

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

#### 界面输入
- 类型多选框选择
- 可通行性单选/复选
- 优先级范围滑块
- 筛选条件保存名称输入

#### 界面输出
- 筛选结果列表
- 统计信息显示
- 结果高亮显示
- 操作提示信息

## 2.3.2.5. 算法

### 属性筛选算法
```
算法：基于属性的元素筛选
输入：筛选条件
输出：筛选结果

1. 创建搜索对象
2. 构建搜索条件：
   a. 如果指定了类型：
      - 添加类型条件
   b. 如果指定了可通行性：
      - 添加可通行性条件
   c. 如果指定了优先级范围：
      - 添加优先级条件
3. 执行搜索
4. 返回匹配的元素集合
```

### 组合筛选算法
```
算法：多条件组合筛选
输入：多个筛选条件
输出：筛选结果

1. 对于每个筛选条件：
   2. 执行单条件筛选
   3. 获取中间结果
4. 根据组合逻辑（与/或）合并结果
5. 返回最终筛选结果
```

## 2.3.2.6. 流程逻辑

```
开始
  │
  ▼
┌─────────────────┐
│  设置筛选条件    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐      是
│  多条件组合？    │──────────┐
└────────┬────────┘          │
         │否                 │
         ▼                   │
┌─────────────────┐          │
│  单条件筛选      │          │
└────────┬────────┘          │
         │                   │
         │                   ▼
         │         ┌─────────────────┐
         │         │  多条件分别筛选  │
         │         └────────┬────────┘
         │                  │
         │                  ▼
         │         ┌─────────────────┐
         │         │  合并筛选结果    │
         │         └────────┬────────┘
         │                  │
         └────────┬─────────┘
                  │
                  ▼
┌─────────────────┐
│  显示筛选结果    │
└────────┬────────┘
         │
    ┌────┴────┐
    ▼         ▼
┌────────┐  ┌────────┐
│高亮显示│  │添加到  │
└───┬────┘  │选择集  │
    │       └───┬────┘
    │           │
    └─────┬─────┘
          │
          ▼
┌─────────────────┐
│  保存筛选条件？  │────否────┐
└────────┬────────┘          │
         │是                 │
         ▼                   │
┌─────────────────┐          │
│  保存筛选条件    │          │
└────────┬────────┘          │
         │                   │
         └─────────┬─────────┘
                   │
                   ▼
                  结束
```

## 2.3.2.7. 接口

### 公共接口
```csharp
/// <summary>
/// 物流元素筛选器
/// </summary>
public class LogisticsElementFilter
{
    /// <summary>
    /// 按类型筛选
    /// </summary>
    /// <param name="types">类型列表</param>
    /// <returns>筛选结果</returns>
    public List<ModelItem> FilterByTypes(List<LogisticsElementType> types);
    
    /// <summary>
    /// 按可通行性筛选
    /// </summary>
    /// <param name="isTraversable">是否可通行</param>
    /// <returns>筛选结果</returns>
    public List<ModelItem> FilterByTraversability(bool isTraversable);
    
    /// <summary>
    /// 按优先级范围筛选
    /// </summary>
    /// <param name="minPriority">最小优先级</param>
    /// <param name="maxPriority">最大优先级</param>
    /// <returns>筛选结果</returns>
    public List<ModelItem> FilterByPriorityRange(int minPriority, int maxPriority);
    
    /// <summary>
    /// 执行组合筛选
    /// </summary>
    /// <param name="criteria">筛选条件</param>
    /// <returns>筛选结果</returns>
    public FilterResult ApplyFilter(FilterCriteria criteria);
    
    /// <summary>
    /// 高亮显示筛选结果
    /// </summary>
    /// <param name="items">要突出显示的元素</param>
    public void HighlightResults(List<ModelItem> items);
}
```

### 数据结构接口
```csharp
/// <summary>
/// 筛选条件
/// </summary>
public class FilterCriteria
{
    public List<LogisticsElementType> ElementTypes { get; set; }
    public bool? IsTraversable { get; set; }
    public int? MinPriority { get; set; }
    public int? MaxPriority { get; set; }
    public FilterCombinationMode CombinationMode { get; set; }
}

/// <summary>
/// 筛选组合模式
/// </summary>
public enum FilterCombinationMode
{
    And,    // 与 - 满足所有条件
    Or      // 或 - 满足任一条件
}
```

## 2.3.2.8. 注释设计

### 代码注释规范
```csharp
/// <summary>
/// 筛选结果
/// </summary>
public class FilterResult
{
    /// <summary>
    /// 筛选匹配的元素列表
    /// </summary>
    public List<ModelItem> Items { get; set; }
    
    /// <summary>
    /// 匹配元素数量
    /// </summary>
    public int Count => Items?.Count ?? 0;
    
    /// <summary>
    /// 筛选耗时
    /// </summary>
    public TimeSpan ElapsedTime { get; set; }
    
    /// <summary>
    /// 应用的筛选条件
    /// </summary>
    public FilterCriteria AppliedCriteria { get; set; }
}
```

## 2.3.2.9. 数据结构

### FilterCriteria 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| ElementTypes | List<LogisticsElementType> | 要筛选的元素类型 |
| IsTraversable | bool? | 可通行性条件（null表示不限制） |
| MinPriority | int? | 最小优先级 |
| MaxPriority | int? | 最大优先级 |
| CombinationMode | FilterCombinationMode | 条件组合模式 |

### FilterResult 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| Items | List<ModelItem> | 筛选结果的元素 |
| Count | int | 结果数量 |
| ElapsedTime | TimeSpan | 筛选耗时 |
| AppliedCriteria | FilterCriteria | 应用的筛选条件 |

### SavedFilter 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| Id | string | 保存的筛选ID |
| Name | string | 筛选名称 |
| Criteria | FilterCriteria | 筛选条件 |
| CreateTime | DateTime | 创建时间 |
