当前位置:首页 期刊杂志

基于IFC标准的存储格式优化研究

时间:2024-05-04

张毅 赵京胜 神洲

关键词 标准 存储格式 优化

1引言

BIM 全称“Building Information Modeling”,即建筑信息模型,其是建筑学、工程学及土木工程的新工具,由Autodesk 公司率先提出,已经在全球范围的建筑业内得到广泛认可。它可以形容以三维图形为主,与物件导向、建筑学有关的电脑辅助设计。在BIM 建筑数据传递的过程中,各种专业和各种BIM 数据描述形式都存在差异,如IFC 格式数据中的一种交换格式被广泛应用于各种建筑领域的数据传递[1] 。

三维模型轻量化主要包含两个方面,即模型轻量化显示和模型文件转换[2] 。常见的模型处理方法有:(1) 图元合并,其应用于大模型结构比较复杂,顶点、面比较数据比较大,可以通过算法和根据权重剔除相应的顶点、面,从而到达轻量化模型效果;(2)场景八叉树划分,八叉树可以快速剔除不可见图元,减少进入渲染区域的绘制对象;(3)几何对象构件对象化,即相同形状的几何对象不做多次拷贝,大模型相同几何体只做一个加载,只做相同模型构件移动、旋转、缩放,最终模型文件和浏览器内存得以明显减小;(4)Lod,即模型可以设置Lod,根据距离、级别差异加载不同复杂度的结构模型;(5)模型文件压缩,即三维模型stl、obj、3ds、obj、json 等文件格式算法压缩。

2IFC在建筑领域中的应用

目前,IFC 标准格式文件通常为特定的商业交易双方交换信息[3] 。同时,IFC 标准格式文件可以归档项目信息,它的应用频率会在设计、采购和施工阶段逐步增加,并作为长期保存和运营目的的“竣工”信息集合。建筑信息建模工具软件供应商包括模型创作、设计、模拟和分析、查看等,將为最终用户提供接口,以某种IFC 格式导出、导入和传输数据[4] 。国内在基于IFC 标准的基础上做了大量工作,如4D 施工管理系统、智能建筑消防管理系统、IFC 建筑几何表达等。此外,也有不少学者探索利用WebGL 技术建设建筑平台,如拱坝工程的三维可视化网络平台、WebGL 与IFC 的建筑可视化分析方法等。

3IFC格式说明

若对IFC 文件进行存储上的优化,首先就要了解IFC 文件的构成。IFC 模型文件存储的层次结构与DIKW 体系类似,其中包含资源层(Resource Layer)、核心层(Kernel Layer)、交互层(Shared Layer)和领域层(Domain Layer)四个层次。各层次结构内的实体之间既可以相互引用属性,也可以被上层结构引用,但一般不允许下层结构引用,即引用实体资源原则上只能自上而下,或在同层进行。

资源层(Resource Layer)是IFC 文件存储中的基础层。其主要存储在建造建筑过程中产生的基本实体对象和具体结构数据。核心层(Kernel Layer) 是IFC 文件存储中的第二层。其是实体与实体之间的数据进行描述的关键。交互层(Shared Layer)是IFC 模型文件存储的第三层。其是实现不同的建筑三维设计软件的数据交换的关键,相关数据只可被同属于该层的数据引用或是被领域层引用,而交互层不能直接引用核心层和资源层的相关数据。领域层(DomainLayer)是IFC 文件存储中的顶层。其属于专业性的数据层,具有各个专业的特征和属性,如在IFC 手册中就定义了建筑、电力、基础、结构、设备等9 个专业化的数据领域集的数据。

4优化算法的实现

优化IFC 文件的主要目的是减小IFC 文件的大小,因为在实际的存储中IFC 文件非常大[5] 。造成该问题的主要原因是重复的实体实例的出现。为了优化算法,本文采用几何对象构件化,且相同形状的几何对象不做多次拷贝,大模型相同几何体只做一个加载,只做相同模型构件的移动、旋转、缩放。

首先,对任一IFC 文件进行IFC 实体出现频率分析,并绘制实体频率直方图(图1)。根据实体频率直方图,明显可以看出存在大量的重复出现的IFC 实体对象。

为了分析该IFC 文件,可以抽取任一相同实体,如抽取的实体为零件加劲板IfcDiscreteAccessory,其除了ID 和位置信息外与其他实体的属性都相同(图2),换言之所有实体都可以简化为三个实体,然后进行不同的坐标转化,即为另外一个实体。

根于上述特性,我们可以选用图3 的拓扑排序(Topological sort) 根据节点的依赖关系对图进行排序。这表明在图层次结构中没有父节点或父节点最高的节点将是已排序列表的第一个节点。因此,由于一些节点可以是兄弟节点,所以同一个图有几种可能的拓扑排序,并且它们在图中具有相同的层次位置。

对IFC 文件中的实体实例进行逐行定义(图4),节点引用其他节点,保持“依赖性较低”的实体排序,以消除重复的实体是一个很好的解决方案。因此,最独立的实体被排在第一位,下一个实例便可以引用它们。

我们参照IFC 文件里的一个实体之间的引用关系,文件行中的#1 和#3 的IFCCARTESIANPOINT 的内容一致,可以相互替换使用,通过实例的id 来调用它们,#1 将被存储并添加到新文件中。当#3 出现时,它将被映射到已经注册的类似实例,所以是#1。在#4处,使用#3 作为实例映射中的键,该键被映射到#1,因此在存储文件的过程中,就可以减少一个存储的IFC实体对象,此方法基于拓扑排序的逻辑处理。因此,由于一些节点可以是兄弟节点,所以同一个图有几种可能的拓扑类型,并且由于它们在图中具有相同的层次位置(或程度),因此它们仍然属于排序的思想。

在IfcOpenShell 中,map_value 函数允许递归遍历实体实例的属性值。它接受一个IFC 实例的属性作为输入:如果属性是一个列表或元组,那么它将递归地调用自己;如果属性是python 值,那么它将输出该值,属性则引用另一个IFC 实例。

首先,map_value 函数可以是一个等价于基本python 类型的IFC 实例,如IfcBoolean 或IfcInteger。在该情况下,通过重新创建索引为0 的实体及其值来返回。在其他情况下,当属性是一个IFC 实例时,map_value 函数将创建该属性。但是,map_value 函数是通过在instance_mapping 映射变量中取其值来创建的,由于实体已经按照拓扑排序进行了排序,因此可以肯定引用已经注册。否则,若没有拓扑排序,实体将不能确定地注册。#1 将被存储并添加到新文件中,#2 相同与其一致。当#3 出现时,它将被映射到已经注册的类似实例,所以是#1。在#4 处,map_value 函数将使用#3 作为实例映射中的键,该键被映射到#1,因此#1 将被添加到新文件中,而不是#3。

按照上述方法处理IFC 文件来对比实体出现频率,该IFC 文件过滤了大量的冗余实体,因此文件存储体积减小。

5结论

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!