253 lines
7.5 KiB
Markdown
253 lines
7.5 KiB
Markdown
# 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 | 状态消息 |
|