# 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 | 否 | 需要忽略的类别列表 | | ManualFloorHeights | List | 否 | 手动指定的楼层高度 | #### 输出字段 | 字段名 | 类型 | 说明 | |-------|------|------| | FloorInfos | List | 楼层信息列表 | | SplitModels | Dictionary | 分层后的模型集合 | | ThroughModules | List | 识别的贯穿模块列表 | ### 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 /// /// 模型切分管理器 /// public class ModelSplitterManager { /// /// 自动检测楼层 /// /// 高度容差(米) /// 楼层信息列表 public List AutoDetectFloors(double tolerance = 0.3); /// /// 执行模型切分 /// /// 楼层信息 /// 切分结果 public SplitResult SplitModel(List floorInfos); /// /// 获取贯穿模块 /// /// 贯穿模块列表 public List GetThroughModules(); } ``` ### 事件接口 ```csharp /// /// 切分进度事件 /// public event EventHandler SplitProgress; /// /// 楼层检测完成事件 /// public event EventHandler FloorsDetected; ``` ## 2.1.1.8. 注释设计 ### 代码注释规范 ```csharp /// /// 楼层信息类 /// 存储单个楼层的基本信息 /// public class FloorInfo { /// /// 楼层编号(从1开始) /// public int FloorNumber { get; set; } /// /// 楼层高度(模型单位) /// public double Height { get; set; } /// /// 楼层高度(米) /// 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 | 楼层信息列表 | | LayerModels | Dictionary | 分层模型字典 | | ThroughModules | List | 贯穿模块列表 | | SplitTime | DateTime | 切分时间 | ### SplitProgressEventArgs 结构 | 字段名 | 类型 | 说明 | |-------|------|------| | CurrentFloor | int | 当前处理楼层 | | TotalFloors | int | 总楼层数 | | ProgressPercentage | double | 进度百分比 | | StatusMessage | string | 状态消息 |