# 2.1.1 模型切分功能设计说明

## 2.1.1.1. 模块描述

模型切分模块是通道选择及路径点规划功能的基础模块，负责将大型BIM模型按照楼层和区域进行分层切分，以便进行后续的物流路径规划。该模块通过多软件模型轻量化工具箱实现全模型的分层切分，支持忽略编组站区域楼层间上下贯穿模块的特殊处理需求。

该模块主要解决以下问题：
- 大型BIM模型数据量大，直接处理效率低下
- 需要按楼层隔离，便于分层路径规划
- 编组站等特殊区域存在跨楼层结构，需要特殊处理

## 2.1.1.2. 功能

### 核心功能
1. **自动楼层检测**：基于模型几何信息和属性自动识别楼层高度和边界
2. **分层切分**：将完整模型按楼层切分为独立的逻辑层
3. **区域识别**：识别编组站等特殊区域的上下贯穿模块
4. **忽略配置**：支持配置需要忽略的模型元素类型

### 子功能
| 功能编号 | 功能名称 | 功能描述 |
|---------|---------|---------|
| 2.1.1.F1 | 楼层检测 | 自动分析模型，检测楼层高度和边界框 |
| 2.1.1.F2 | 模型分层 | 根据检测结果将模型切分为多层 |
| 2.1.1.F3 | 贯穿模块处理 | 识别并标记跨楼层的贯穿结构 |
| 2.1.1.F4 | 分层预览 | 提供分层的可视化预览功能 |
| 2.1.1.F5 | 切分配置 | 支持手动调整楼层高度和切分参数 |

## 2.1.1.3. 性能

### 性能指标
| 指标名称 | 目标值 | 说明 |
|---------|-------|------|
| 楼层检测时间 | < 5秒 | 对于100MB以下的模型 |
| 切分操作响应 | < 1秒 | 切分配置应用后的响应时间 |
| 内存占用 | < 500MB | 切分过程中的额外内存占用 |
| 支持模型大小 | 无限制 | 依赖Navisworks原生支持 |

### 性能优化策略
1. 使用空间索引加速楼层检测
2. 采用延迟加载策略处理大型模型
3. 切分结果缓存，避免重复计算

## 2.1.1.4. 输入输出项

### 1. 字段输入输出

#### 输入字段
| 字段名 | 类型 | 必填 | 说明 |
|-------|------|-----|------|
| Document | Document | 是 | Navisworks文档对象 |
| FloorHeightTolerance | double | 否 | 楼层高度容差（米），默认0.3米 |
| IgnoreCategories | List<string> | 否 | 需要忽略的类别列表 |
| ManualFloorHeights | List<double> | 否 | 手动指定的楼层高度 |

#### 输出字段
| 字段名 | 类型 | 说明 |
|-------|------|------|
| FloorInfos | List<FloorInfo> | 楼层信息列表 |
| SplitModels | Dictionary<int, ModelItemCollection> | 分层后的模型集合 |
| ThroughModules | List<ModelItem> | 识别的贯穿模块列表 |

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

#### 界面输入
- 楼层高度参数设置
- 忽略的模型类别勾选
- 切分预览确认

#### 界面输出
- 分层预览显示
- 楼层统计信息
- 切分进度状态

## 2.1.1.5. 算法

### 楼层检测算法
```
算法：基于高度聚类的楼层检测
输入：模型所有元素的包围盒集合
输出：楼层高度列表

1. 收集所有水平面元素的高度值
2. 使用DBSCAN聚类算法对高度值进行聚类
3. 计算每个聚类的中心高度作为楼层高度
4. 根据容差合并相近的楼层
5. 返回排序后的楼层高度列表
```

### 模型分层算法
```
算法：基于包围盒的模型分层
输入：模型元素集合，楼层高度列表
输出：分层后的模型集合

1. 对于每个楼层i：
   2. 计算楼层高度范围 [H_i - T, H_{i+1} + T]
   3. 遍历所有模型元素：
      4. 如果元素包围盒与楼层范围相交：
         5. 将元素加入该楼层集合
6. 识别贯穿模块（跨越多层的元素）
7. 返回分层结果
```

## 2.1.1.6. 流程逻辑

```
开始
  │
  ▼
┌─────────────────┐
│  加载模型文档    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐     否
│  检测楼层高度？  │────────► 手动输入楼层高度
└────────┬────────┘
         │ 是
         ▼
┌─────────────────┐
│  显示楼层预览    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  识别贯穿模块    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  应用切分配置    │
└────────┬────────┘
         │
         ▼
┌─────────────────┐
│  生成分层结果    │
└────────┬────────┘
         │
         ▼
        结束
```

## 2.1.1.7. 接口

### 公共接口
```csharp
/// <summary>
/// 模型切分管理器
/// </summary>
public class ModelSplitterManager
{
    /// <summary>
    /// 自动检测楼层
    /// </summary>
    /// <param name="tolerance">高度容差（米）</param>
    /// <returns>楼层信息列表</returns>
    public List<FloorInfo> AutoDetectFloors(double tolerance = 0.3);
    
    /// <summary>
    /// 执行模型切分
    /// </summary>
    /// <param name="floorInfos">楼层信息</param>
    /// <returns>切分结果</returns>
    public SplitResult SplitModel(List<FloorInfo> floorInfos);
    
    /// <summary>
    /// 获取贯穿模块
    /// </summary>
    /// <returns>贯穿模块列表</returns>
    public List<ModelItem> GetThroughModules();
}
```

### 事件接口
```csharp
/// <summary>
/// 切分进度事件
/// </summary>
public event EventHandler<SplitProgressEventArgs> SplitProgress;

/// <summary>
/// 楼层检测完成事件
/// </summary>
public event EventHandler<FloorDetectedEventArgs> FloorsDetected;
```

## 2.1.1.8. 注释设计

### 代码注释规范
```csharp
/// <summary>
/// 楼层信息类
/// 存储单个楼层的基本信息
/// </summary>
public class FloorInfo
{
    /// <summary>
    /// 楼层编号（从1开始）
    /// </summary>
    public int FloorNumber { get; set; }
    
    /// <summary>
    /// 楼层高度（模型单位）
    /// </summary>
    public double Height { get; set; }
    
    /// <summary>
    /// 楼层高度（米）
    /// </summary>
    public double HeightInMeters => UnitsConverter.ConvertToMeters(Height);
}
```

### 配置文件注释
```toml
# 模型切分配置
[model_splitter]
# 楼层检测高度容差（米）
floor_height_tolerance_meters = 0.3
# 是否自动检测楼层
auto_detect_floors = true
# 忽略的类别列表
ignore_categories = ["地基", "基础"]
```

## 2.1.1.9. 数据结构

### FloorInfo 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| FloorNumber | int | 楼层编号 |
| Height | double | 楼层高度（模型单位） |
| Bounds | BoundingBox3D | 楼层包围盒 |
| ElementCount | int | 楼层元素数量 |
| IsThroughFloor | bool | 是否包含贯穿模块 |

### SplitResult 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| Floors | List<FloorInfo> | 楼层信息列表 |
| LayerModels | Dictionary<int, ModelItemCollection> | 分层模型字典 |
| ThroughModules | List<ModelItem> | 贯穿模块列表 |
| SplitTime | DateTime | 切分时间 |

### SplitProgressEventArgs 结构
| 字段名 | 类型 | 说明 |
|-------|------|------|
| CurrentFloor | int | 当前处理楼层 |
| TotalFloors | int | 总楼层数 |
| ProgressPercentage | double | 进度百分比 |
| StatusMessage | string | 状态消息 |
