基于IFC标准的BIM模型空间结构组成与程序解析

2018-05-03 06:07
计算机应用与软件 2018年4期
关键词:空间结构实例构件

陈 远 逯 瑶

(郑州大学土木工程学院 河南 郑州 450001)

0 引 言

由buildingSMART International[1]制定和维护的IFC标准,为面向建筑全生命周期的信息交换和信息共享提供了数据定义和数据模型。IFC是一个开放,标准化、支持扩展的通用数据模型标准,从IFC2x3版本开始,加入了GIS数据信息,目前的最新版本是IFC4。IFC标准包含600多个实体定义,300多个类型定义,实体之间关系复杂,逻辑层次繁多。因此,对建筑工程信息的标准化表达和结构化管理,是IFC标准实施的关键。目前众多BIM工具采用不同数据标准,不同软件间互操作性差,随着我国土木建筑工程信息化的发展,已不能满足当下需求。运用基于IFC的BIM技术,能够将建设项目所有专业所需的专业模型以IFC 标准进行提取和存储,解决“信息孤岛”问题。通过此研究,能够使相关专业人员认识到在BIM技术中采用通用的IFC数据存储格式的必要性,从而加速BIM技术在各领域中的应用。使用计算机编程语言解析基于IFC标准的BIM模型空间结构组成,以及读取空间结构所包含的建筑构件的建筑信息,是开发基于IFC标准的土木建筑工程BIM应用软件的基础和关键,是BIM技术解决土木建筑工程信息化的关键。相应研究包括IFC模型浏览器[2],基于IFC标准的BIM模型格式检查与验证[3],基于IFC标准的几何模型的解析[4],基于IFC的图形数据模型的拓扑分析[5]等。

1 基于IFC标准的BIM模型空间结构组成

在IFC标准中,空间结构被定义为“根据空间布局将项目分解为可管理的子集”,项目是所有空间信息的最顶层容器,其包含四个层次:场地、建筑、楼层和空间[6]。如图1所示。空间结构层次对应的IFC实体分别为:IfcProject、IfcSite、IfcBuilding、IfcBuildingStorey、IfcSpace。对于一个IFC模型,IfcProject,IfcBuillding和IfcBuildingStorey是必须有的层次结构,而IfcSite和IfcSpace属于可选择的层次结构。

图1 建筑项目的空间结构

一个建筑项目使用最基础的空间分解关系将不同的空间结构连接起来,而IfcRelAggreates实例被用来连接不同的IfcProject、IfcSite、IfcBuilding、IfcBuildingStorey,以及IfcSpace等空间层次实例,并建立起IFC项目模型的空间层次结构。具体的连接方式是通过IfcRelAggreates实体的RelatingObject属性连接一个高一层次的空间结构实例,通过RelatedObject属性连接一个或多个低一层次的空间结构实例。图2为使用IfcRelAggreates实例来连接不同的空间层次并定义一个建筑项目的空间结构。可以看到建筑项目包含一个场地、一个建筑,而这个建筑又被进一步分解为两个建筑分部:第一个建筑分部包含两个楼层,第二个建筑分部包含三个楼层。图3为相对应的建筑空间结构布局。

图2 IFC标准建筑空间结构分解

图3 基于IFC标准的建筑空间结构布局

在建筑空间结构中,场地对应的IFC实体为IfcSite,其主要提供建筑场地和场地地形信息。例如,场地实体的可选择属性RefLatitude、RefLongitude和RefElevation可以提供了建筑场地参照点的纬度、经度和基准高程数据。而场地地形信息可以通过IfcShapeRepresentation实体用三种方法进行描述:测量点和隔断线、多边形以及B-Rep几何形状。

建筑对应的IFC实体为IfcBuilding,其主要提供建筑本身的一些信息,可以通过IfcRelAggreates实例连接到上一层次的IfcSite,或者直接连接到IfcProject,也可以连接到下一层次的建筑分部或者直接连接IfcBuildingStorey。IfcBuilding除了可以包括名字、描述、类型等继承的信息,还可以包括相对标高、相对地形高程、建筑地址等信息。

楼层对应的IFC实体为IfcBuildingStorey,通常可以连接到上一层的建筑或建筑分部,也可以连接到下一层次的空间。除了继承的信息,IfcBuildingStorey还可以包括高程信息,以用来确定建筑中每一层的标高。IfcBuildingStorey实体非常重要,除了包括空间实体IfcSpace,几乎所有的建筑构件,例如墙、梁、柱、板、门、窗、屋顶等,都通过IfcRelContainedInSpatialStructure实例与对应的IfcBuildingStorey实例相连接。如图4所示。因此,通过IFC标准的这种空间层次关系以及不同的IFC关系实例,建筑的整体结构信息和包含的所有建筑构件信息,都能够被有效地组织和管理,也为基于IFC的BIM模型提供了标准化的信息描述和信息交换的框架。

图4 基于IFC标准的建筑空间结构关系

2 基于IFC的BIM模型文件分析

IFC标准是基于EXPRESS语言描述的开放性的建筑信息数据格式。EXPRESS语言是一种面向对象的、规范化的数据描述语言,重点在数据及其关系的描述和定义。基于IFC的BIM模型可以通过两种方式获取。一种是通过标准格式的中性文本文件, 另一种是通过标准格式的程序接口访问程序或数据库,目前第一种方法在实际工程中应用比较多。IFC文本文件可以通过普通的文本编辑器查看和编辑,文件以“ISO-10303-21”开始,以“END-ISO-10303-21”结束,中间具体的文本内容包括文件头部分和数据部分。文件头部分包括中性文件本身信息,例如文件描述、文件名称、IFC标准版本等。数据部分是整个文件的核心,包括了工程项目的所有建筑模型信息。

IFC文本文件中实例数据与IFC标准实体定义的对应关系如下:

#743=IFCBEAM('3iFOdnkqD4vxXLEZB7MJrj′, #1, ′M_K-Series Bar Joist-Rod Web:14K1:14K1:160855′, $, ′M_K-Series Bar Joist-Rod Web:14K1:154794′, #130102, #131426, ′160855′);

ENTITY IfcBeam

GlobalId: IfcGloballyUniqueId;

OwnerHistory: OPTIONAL IfcOwnerHistory;

Name: OPTIONAL IfcLabel;

Description: OPTIONAL IfcText;

ObjectType: OPTIONAL IfcLabel;

ObjectPlacement: OPTIONAL IfcObjectPlacement;

Representation: OPTIONAL IfcProductRepresentation;

Tag: OPTIONAL IfcIdentifier;

END_ENTITY;

在IFC2x3标准中,IfcBeam定义了包括反转属性在内的26个属性,而IFC标准的中性文件中所有的反转属性和约束都不在文件中表示,中性文件只按照定义顺序显示一般属性的具体值。IFC标准中实体的一般属性也分为强制属性和可选属性,带有“OPTIONAL”关键字的为可选属性,而没有“OPTIONAL”关键字的为强制属性。在实例数据中强制属性必须要赋值,例如“Globalid”属性必须要赋值,而“OwnerHistory”为可选属性,可以不赋值。

可以看出,IfcBeam实体有8个一般属性,其中1个强制属性和7个可选属性,IFC中性文件中的IfcBeam实例中有8个数据值与实体定义中的一般属性一一对应起来。通过具体分析中性文件中IfcBeam实例可以看出,“#743”为这个梁实例的实例名,“IfcBeam”为实例关键字,后面括号内为实例的属性值,属性值用逗号隔开,其顺序按照实体定义中的属性顺序排列。如果某个属性为可选属性没有赋值,则用占位符“$”表示。如果某个属性引用了其他的实例,则在相应位置上用被引用的实例名表示。

3 IFC模型的计算机语言解析原理

基于EXPRESS语言的IFC模型是开放性的建筑信息数据格式。EXPRESS语言不是计算机编程语言,不能被计算机执行和编译。EXPRESS语言是一种规范化的、面向对象的数据描述语言,重点在数据的定义和描述。因此基于EXPRESS语言的IFC模型需要首先被解析,生成对应的IFC实体对象,建立实体对象之间的层次结构关系,在此基础上通过具体编程来实现不同的应用功能。

通过解析方法可以将EXPRESS定义的IFC模型与计算机语言进行绑定,形成可供计算机调用的程序。主要的解析方法包括早绑定、晚绑定和混合绑定。早绑定指在计算机编程语言中为IFC模型中的每一个实体创建具体的数据结构,并且能够通过编程访问具体的数据。晚绑定指通过EXPRESS数据字典来访问具体的数据,优点是实现简单,缺点为缺乏类型检查以及编程接口API不够友好。混合绑定指结合了两者的特点,但在具体软件开发中使用较少。

本文利用IFC Tools Project插件,提供了一个面向对象的早绑定Java插件,用来解析基于IFC2x3和IFC4的BIM模型。这个插件可以方便地读取、写入、更改和添加IFC文件,将IFC实体映射为Java类,并且对应的Java类包含了IFC实体的所有属性,以及支持IFC实体的反转属性。

这个插件主要由三部分组成:

1) 每个IFC实体都有相对应的Java类。每个Java类都提供能够读取和设置对应IFC实体属性的方法,利用这些类的方法可以非常方便地读取和设置包括反转属性在内的所有属性。IFC框架体系中所有实体的继承结构都体现到了相对应的Java类的继承结构。IFC框架体系中所有定义类型和实体类型都映射为相应的接口。

2) IFC文件解析器,可以解析IFC STEP文件和IFC Zip文件。

3) 核心IFC模型IfcModel,用来读取IFC文件,操作IFC模型中所包含的IFC实体,增加与删除IFC 实体。

4 IFC模型空间结构解析实现方法

本文选取BuildingSMART提供的IFC文件作为验证文件,版本为IFC2x3,BIM模型如图5所示。

图5 IFC测试文件对应的BIM模型

IFC文件中建筑模型空间结构及部分建筑构件如下:

#165126=IFCPROJECT('1trXgJhnr0DuT_DyrHBhoI',#1,'Project',$,$,'','Project Status',(#6,#53130),#165600);

#54030=IFCSITE('1trXgJhnr0DuT_DyrHBhoG',#1,'Site',$,'',#53131,$,$,.ELEMENT.,(42,21,30,344238),(-71,-3,-35,-194702),-0.0,$,$);

#12577=IFCBUILDING('1trXgJhnr0DuT_DyrHBhoJ',#1,$,$,$,#10814,$,$,.ELEMENT.,$,$,#59257);

#3419=IFCBUILDINGSTOREY('1trXgJhnr0DuT_DyskqK9L',#1,'Level 1',$,$,#43,$,$,.ELEMENT.,0.0);

#3420=IFCBUILDINGSTOREY('1trXgJhnr0DuT_Dyskqr19',#1,'Roof',$,$,#12555,$,$,.ELEMENT.,7.924820999999096);

#3421=IFCBUILDINGSTOREY('1trXgJhnr0DuT_Dyskqqtq',#1,'Foundation',$,$,#67,$,$,.ELEMENT.,-1.0);

#3422=IFCBUILDINGSTOREY('1trXgJhnr0DuT_DyskqK7K',#1,'Level 2',$,$,#53,$,$,.ELEMENT.,4.267220999999097);

#184429=IFCRELCONTAINEDINSPATIALSTRUCTURE('33Gt4MsRv8WxaDEzmZ5eO1',#1,$,$,(#1100,#1099,#1098),#3420);

#1100=IFCROOF('10jPkmJhLAlOZD3FPexHvb',#1,'Basic Roof:EPDM Membrane on Rigid Insul on Metal Deck:160924',$,'Basic Roof:EPDM Membrane on Rigid Insul on Metal Deck', #53139, $, '160924',.NOTDEFINED.);

#1099=IFCROOF('10jPkmJhLAlOZD3FPexH$U',#1,'Basic Roof:EPDM Membrane on Rigid Insul on Metal Deck:161063',$,'Basic Roof:EPDM Membrane on Rigid Insul on Metal Deck',#53140,$,'161063',.NOTDEFINED.);

#1098=IFCROOF('10jPkmJhLAlOZD3FPexHtX',#1,'Basic Roof:Standing Seam Metal Roof:161560',$, 'Basic Roof:Standing Seam Metal Roof', #48574, $, '161560',.NOTDEFINED.);

可以看出模型中包含一个IfcProject实例、一个IfcSite实例、一个IfcBuilding实例,建筑包含有三个楼层即三个IfcBuildingStorey实例。通过IfcRelContainedInSpatialStructure实例可以将建筑构件和对应的楼层连接起来,如在#184429的属性中将#3420楼层和三个屋顶(#1100,#1099,#1098)连接起来。

IFC标准是基于EXPRESS语言描述的开放性的数据格式。EXPRESS语言是一种面向对象的、规范化的数据描述语言,不是计算机编程语言,不能被计算机直接编译和执行。因此基于EXPRESS语言的IFC中性文件需要首先被解析,并且通过C#、C++或者Java等计算机语言来读取IFC中性文件所描述的建筑信息。本文使用IFC Tools Project[7]插件解析IFC中性文件,并使用Java语言编程来读取IFC模型的空间结构组成和与其连接的建筑构件信息。Java开发环境为Java 8,Eclipse Luna,SWT/JFace,RCP[8]等。

通过调用IfcModel类的文件读取方法,将IFC模型加载到内存并初始化所有IFC实体。IFC文件读取与加载方法如下:

private IfcModel createIfcModel() {

//创建IfcModel类的对象

IfcModel ifcModel = new IfcModel();

//从文件系统装载IFC文件

File stepFile = new File("d: evitpracticeexample.ifc");

try {

ifcModel.readStepFile(stepFile);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return ifcModel;

}

创建IfcProject实例,其包括项目、场地、建筑、楼层、空间等建筑空间结构信息。具体方法如下:

//创建IfcProject类的对象

IfcProject ifcProject = ifcModel.getIfcProject();

//获得所有IFC实体对象的集合

Collection ifcObjects = ifcModel.getIfcObjectss();

因为建筑空间结构是通过IfcRelAggreates实例进行连接,因此调用IfcProject类的getIsDecomposedBy_Inverse()方法获得IfcRelDecomposes实例(IfcRelDecomposes为IfcRelAggreates抽象父类)。通过调用IfcRelDecomposes类的getRelatedObjects()方法,获得与项目相连接的结构层次,并判断是否是场地或者直接和建筑相连接。因为getIsDecomposedBy_Inverse()方法和getRelatedObjects()方法的返回值都为SET,因此需要使用循环和迭代器来读取所有值。具体代码如下:

if (ifcProject instanceof IfcProject.Ifc2x3) { //判断IFC版本

if (((IfcProject.Ifc2x3) ifcProject).getIsDecomposedBy_Inverse() == null) {

return;}

localObject1 = ((IfcProject.Ifc2x3) ifcProject)

.getIsDecomposedBy_Inverse(); //调用方法获得IfcRelDe-

//composes实例

for (Iterator localIterator1 = ((SET) localObject1).iterator(); localIterator1.hasNext();) {

for (Iterator localIterator2 = ((IfcRelDecomposes.Ifc2x3) localIterator1

.next()).getRelatedObjects().iterator(); localIterator2.hasNext();) { //调用方法获得与项目相连接的结构层次

Object localObject = localIterator2.next();

if (localObject instanceof IfcSite) { //判断项目是否与

//场地连接

siteNode = new Ifc3DSiteNode((IfcSite) localObject);

siteNode.setChildren(createIfc2x3Site((IfcSite.Ifc2x3) localObject));

localArrayList.add(siteNode); }

else if (localObject instanceof IfcBuilding) { //判断项目是

//否直接与建筑连接

buildingNode = new Ifc3DBuildingNode( (IfcBuilding) localObject);

buildingNode.setChildren(createIfc2x3Building((IfcBuilding.Ifc2x3) localObject));

localArrayList.add(buildingNode);

通过调用IfcBuilding类的getIsDecomposedBy_Inverse()方法获得IfcRelDecomposes实例,调用IfcRelDecomposes类的getRelatedObjects()方法,获得与建筑相连接的楼层。具体代码如下:

for (Iterator localIterator1 = ((SET) paramIfcBuilding

.getIsDecomposedBy_Inverse()).iterator(); localIterator1.hasNext();) { //获得IfcRelDecomposes实例

for (Iterator localIterator2 = ((IfcRelDecomposes.Ifc2x3) localIterator1.next()).getRelatedObjects().iterator(); localIterator2.hasNext();) { //获得与建筑相连接的楼层

Object localObject = localIterator2.next();

if (localObject instanceof IfcBuildingStorey) { //判断建

//筑是否和楼层链接

buildingStoreyNode = new Ifc3DBuildingStoreyNode(

(IfcBuildingStorey) localObject);

buildingStoreyNode.setChildren(createIfc2x3BuildingStorey((IfcBuildingStorey.Ifc2x3) localObject));

localArrayList.add(buildingStoreyNode);

}

}

通过调用IfcBuildStory类的getContainsElements_Inverse()方法,获得IfcRelContainedInSpatialStructure实例,调用IfcRelContainedInSpatialStructure类的getRelatedElements()方法,获得与楼层相连接的建筑构件。具体代码如下:

if (!(paramIfcBuildingStorey.getIsDecomposedBy_Inverse() == null)) {

for (Iterator localIterator1 = ((SET) paramIfcBuildingStorey

.getIsDecomposedBy_Inverse()).iterator(); localIterator1.hasNext();) {

//获得IfcRelContainedInSpatialStructure实例

for (Iterator localIterator2 = ((IfcRelDecomposes.Ifc2x3) localIterator1.next()).getRelatedObjects().iterator(); localIterator2.hasNext();) {

//获得与楼层相连的建筑构件

Object localObject = localIterator2.next();if (localObject instanceof IfcProduct) {

localArrayList.add(createIfc2x3Product((com.ifctp.ifctoolbox.ifc.IfcProduct.Ifc2x3) localObject));

}

}

}

5 IFC模型空间结构解析方法实例验证

本文对IFC模型解析方法的验证所选用的BIM模型为三层框架结构的建筑,并给出基于IFC标准的用EXPRESS语言描述的文本文件部分内容。而整体的IFC文件定义和描述了建筑物全部的建筑信息,包括建筑结构、建筑构件、构件尺寸、楼层标高、建筑构件的形状等信息。验证的主要目的是通过本文提出的IFC模型空间结构的解析方法,来读取、分类和查找这些建筑信息。

本研究的编程环境为JAVA SDK8,Eclipse Luna,Elclipse 4 RCP。通过进一步编程对IFC模型的结构体系进行深入解析,读取IFC中性文件的数据,将数据保存在Java容器中。最后用Java JFace 中的TreeViewer将IFC模型的空间结构组成及相连接的包括梁、柱、板等建筑构件的信息进行分类和显示。图6显示了建筑的整体结构为一个建筑项目、一个场地、一个建筑、三层楼层、一层基础。其中屋顶包括4块顶板,两块立缝焊接钢板屋顶,两块EPDM覆膜绝缘钢板平屋顶。而第二层包括138个建筑结构构件,例如墙、梁、板、柱等,而每一个构件都可以读取其构件信息。如图7所示,可以看到实例名为“#45”的结构墙的所有建筑信息。例如墙的体积为3.135立方米,面积11.5平方米,高2.3米,长5米,热传导系数0.24等。通过编程可以验证,本文提出的基于IFC标准的BIM模型解析方法是切实可行的。

图6 IFC模型空间结构信息

图7 IFC模型建筑构件信息

6 结 语

IFC标准使用空间结构的方式来组织和管理建筑模型信息,空间结构包含众多建筑构件,空间层次之间逻辑关系复杂。因此,对建筑工程信息的标准化表达和结构化管理,是IFC标准实施的关键。IFC标准是基于EXPRESS语言描述的一种建筑信息模型数据表达格式,EXPRESS不能被计算机编译和执行。本文利用Java插件解析IFC中性文件,并使用Java语言编程来读取IFC模型的空间结构组成信息和与其连接的建筑构件信息。在此基础上,可以利用Java语言进一步编程实现不同的应用功能,为下一步的基于IFC标准的土木建筑工程BIM软件开发奠定了基础。

[1] buildingSMART,Industry Foundation Classes IFC Official Release[OL].2015.http://www.buildingsmart-tech.org.

[2] Nakamura K,Otoshi A,Babaguchi N.Development of an Industry Foundation Classes Assembly Viewer[J].Journal of Computing in Civil Engineering,2006,20(2):121-131.

[3] Zhang C,Beetz J,Weise M.Model view checking:automated validation for IFCbuilding models.eWork and eBusiness in Architecture[C]//Proceedings of the 10th European Conference on Product and Process Modelling (ECPPM 2014),Vienna, Austria,17-19 September 2014.Boca Raton:CRC Press,2014:123-128.

[4] Zhang J P,Zhang Y,Xin Z.Methodology of 3D geometric modeling and model conversion of IFC-based BIM[J].Journal of Information Technology in Civil Engineering and Architecture,2009,1(1):40-50.

[5] Khalili A,Chua D K H.IFC-Based Graph Data Model for Topological Queries on Building Elements[J].Journal of Computing in Civil Engineering,2013,29(3):04014046.

[6] Thomas Liebich.IFC 2x edition 3 model implementation guide[S/OL].buildingSMART International Modeling Support Group.Version2.0,2009.http://www.buildingsmart-tech.org/.

[7] IFC Tools Project,Getting Started-Java Toolbox IFC2x3/IFC4[OL].2016.http://www.ifctoolsproject.com/.

[8] Vogel L.Eclipse 4 RCP:The complete guide to Eclipse application development[Z].2nd ed.2013.

猜你喜欢
空间结构实例构件
钢筋混凝土构件裂缝控制
基于角尺度模型的林业样地空间结构分析
国内历史文化街区研究综述
道路绿化带的不同空间结构对污染物扩散的影响
运用弗洛伊德人格结构理论浅析《被占的宅子》的空间结构
基于构件的软件工程技术与理论方法探讨
完形填空Ⅱ
完形填空Ⅰ
基于构件的软件开发实践
基于复合连接器的插拔式构件组装方法研究