2.1.1 模型切分功能设计说明
2.1.1.1. 模块描述
模型切分模块是通道选择及路径点规划功能的基础模块,负责将大型BIM模型按照楼层和区域进行分层切分,以便进行后续的物流路径规划。该模块通过多软件模型轻量化工具箱实现全模型的分层切分,支持忽略编组站区域楼层间上下贯穿模块的特殊处理需求。
该模块主要解决以下问题:
- 大型BIM模型数据量大,直接处理效率低下
- 需要按楼层隔离,便于分层路径规划
- 编组站等特殊区域存在跨楼层结构,需要特殊处理
2.1.1.2. 功能
核心功能
- 自动楼层检测:基于模型几何信息和属性自动识别楼层高度和边界
- 分层切分:将完整模型按楼层切分为独立的逻辑层
- 区域识别:识别编组站等特殊区域的上下贯穿模块
- 忽略配置:支持配置需要忽略的模型元素类型
子功能
| 功能编号 |
功能名称 |
功能描述 |
| 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原生支持 |
性能优化策略
- 使用空间索引加速楼层检测
- 采用延迟加载策略处理大型模型
- 切分结果缓存,避免重复计算
2.1.1.4. 输入输出项
1. 字段输入输出
输入字段
| 字段名 |
类型 |
必填 |
说明 |
| Document |
Document |
是 |
Navisworks文档对象 |
| FloorHeightTolerance |
double |
否 |
楼层高度容差(米),默认0.3米 |
| IgnoreCategories |
List |
否 |
需要忽略的类别列表 |
| ManualFloorHeights |
List |
否 |
手动指定的楼层高度 |
输出字段
| 字段名 |
类型 |
说明 |
| FloorInfos |
List |
楼层信息列表 |
| SplitModels |
Dictionary<int, ModelItemCollection> |
分层后的模型集合 |
| 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. 接口
公共接口
/// <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();
}
事件接口
/// <summary>
/// 切分进度事件
/// </summary>
public event EventHandler<SplitProgressEventArgs> SplitProgress;
/// <summary>
/// 楼层检测完成事件
/// </summary>
public event EventHandler<FloorDetectedEventArgs> FloorsDetected;
2.1.1.8. 注释设计
代码注释规范
/// <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);
}
配置文件注释
# 模型切分配置
[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<int, ModelItemCollection> |
分层模型字典 |
| ThroughModules |
List |
贯穿模块列表 |
| SplitTime |
DateTime |
切分时间 |
SplitProgressEventArgs 结构
| 字段名 |
类型 |
说明 |
| CurrentFloor |
int |
当前处理楼层 |
| TotalFloors |
int |
总楼层数 |
| ProgressPercentage |
double |
进度百分比 |
| StatusMessage |
string |
状态消息 |