NavisworksTransport/doc/introduction/2.1.1_模型切分功能设计说明.md

7.5 KiB
Raw Blame History

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<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 状态消息