自适应分块的BIM墙体轮廓提取及三维重建研究*
2018-03-12李昌华田思敏周方晓
李昌华,田思敏,周方晓
西安建筑科技大学 信息与控制工程学院,西安 710055
1 引言
建筑信息模型(building information modeling,BIM)在建筑领域发展异常迅猛,受到国内外学者和业界的普遍关注[1]。其包含了建筑的全部信息,不仅可以提供形象可视的二维和三维图纸,而且可以提供工程量清单、施工管理、虚拟建造、造价估算等更加丰富的信息,便于项目各个部门的相互沟通、协同工作[2-4]。在BIM技术中,主要应用的设计软件是Autodesk公司开发的Autodesk Revit。Revit软件除了自身功能强大之外,也提供了丰富的API(application programming interface),为在程序编制技术上加强Revit的功能提供了可能[5-6]。
目前,国内大多数BIM模型的建造依然是根据CAD图纸,手工搭建BIM模型,其工作量庞大,使得效率低下成为阻碍BIM推广使用的障碍之一[7-8]。如何提高BIM建模效率,是当前人们迫切需要解决的问题。本文通过读取CAD图纸生成的DXF文件,提取出图纸中的数据信息,提出一种基于自适应分块的墙体轮廓提取算法,对墙体数据进行处理。利用Revit强大的二次开发接口,开发自动翻模插件,实现墙体快速建模。本文流程框图如图1所示。
Fig.1 Flow chart of this paper图1 课题流程框图
2 建筑平面图的数据提取
2.1 AutoCAD二次开发
AutoCAD是美国Autodesk公司开发的计算机辅助设计软件,可以用于二维和三维的设计和绘制,应用于建筑、机械等多个不同领域。
当前AutoCAD的二次开发工具主要有VisualLisp、VBA、ObjectARX和.NET API等[9]。C#.NET应用程序迅速,语言简洁,方便连接数据库和AutoCAD,是一个完全的面向对象的语言,其功能强大,且支持结构化异常处理。因此,本文将使用C#语言对Auto-CAD进行二次开发。
2.2 DXF文件数据提取
DXF(drawing exchange format)是Autodesk公司开发的用于AutoCAD与其他软件之间进行CAD数据交换的文件格式[10]。DXF分为两类:一类是ASCII格式;一类是二进制格式。二进制格式具有占用的空间小、读取速度快的特点,但是可读性较差;ASCII虽占用的空间较大,但具有良好的可读性,能够用文本编辑器打开、修改,并且易于被其他程序处理,因此选用的建筑平面图是由ASCII码组成的DXF文件格式[11]。
AutoCAD图纸绘制中,图层是标准的几何体分类与分组工具,每个图层上都绘制了不同类型的图形对象[12]。本文所选用的建筑平面图纸均是严格按照绘图标准来绘制的。
在DXF文件中,组码8对应的组值即为图层名[13]。由于图纸的几何数据都在ENTITIES段中,因此只对ENTITIES段的内容进行读取即可。对DXF文件中的数据信息进行提取,算法流程如图2所示。
根据上述算法流程,对图3的建筑平面图进行数据提取。在图纸中,墙体主要是由直线构成。在获取直线数据中,需要获得两个主要信息:一是直线所在的图层;二是直线的两个端点的坐标。获取的数据如图4所示,数据的内容分别为编号、对象名、图层、行号以及直线的起止端点。
Fig.2 Flow chart of algorithm for extracting DXF data图2 DXF数据提取算法流程图
3 建筑构件识别
Fig.3 Floor plan图3 建筑平面图纸
Fig.4 Getting data from DXF file图4 获取DXF文件的数据
在建筑平面图的三维重建过程中,建筑构件的识别是非常重要的。而墙体是建筑结构中最重要的建筑构件,是整个建筑的主体。墙体表达了整个建筑的框架信息,其他建筑构件都与墙体直接连接。墙体的识别是识别其他建筑对象的基础,因此首先对直线墙体进行识别,然后在此基础上对门窗进行识别。
3.1 直线墙体识别
建筑构件的绘制方法在《建筑制图标准》中都有具体的规定,其中墙体具有以下特点:任何一段墙体都是一个封闭的区域,并且构成墙体的线段数大于或等于4的偶数。
在大多数的建筑平面图中,构成墙体的主要图元是直线,由于墙线占有单独的图层,即Wall层,可以通过图层的名称将所有墙线从直线中分离出来,并提取所有线段的起止坐标点。但是,墙线和墙体有本质的区别,在建筑平面图中,墙线只是一条线,而墙体则是由墙线组成的,因此需对直线墙体进行识别。
本文首先将提取到的坐标数据进行链式结构的保存,然后根据提取到的线段坐标数据,选取任意一条线段的坐标点为起点坐标,采用顺时针旋转的深度优先遍历算法,去访问该线段的终点坐标,以该终点坐标为下一条线段的起始坐标去访问下一个终点坐标,依次类推直到访问到最初的起点坐标。此时围成的环路径若为大于等于4的偶数,则此环为墙体。墙体识别的算法流程如图5所示。
3.2 窗识别
窗户的识别相对比较简单,一般都把窗户画成4条等长的平行线,平行线的长度为窗户的长度,窗户处在墙体之间,且4条平行线的间距与墙体的厚度相同,如图6所示。在大多数的平面图中,门和窗户都在同一个图层Window中,因此不能把窗户所在图层的所有线都认为是窗线,必须通过窗户的特点来判断。
Fig.6 Common drawing of window图6 窗的常见画法
通过上述的分析,可以将窗户的识别分为两部分:首先找出图层中所有的直线;然后得到直线端点的坐标,选出能组成同一个窗户的所有直线。窗户识别的步骤如下:
步骤1在块信息中找到图层为Window的所有线段。
步骤2获取这些线段的端点。
步骤3对线段起止端点中的x、y坐标各自进行比较,若起止端点的坐标同时满足x坐标相同,y坐标不同,则可判断为平行线段。若为4条平行线,并且y坐标的最大值与最小值之差与墙体的厚度一致,则可判定为水平方向的窗户。
对线段起止端点中的x、y坐标各自进行比较,若起止端点的坐标同时满足y坐标相同,x坐标不同,则可判断为平行线段。若为4条平行线,并且x坐标的最大值与最小值之差与墙体的厚度一致,则可判定为竖直方向的窗户。
若有部分线段的一个端点的x、y坐标相同,而线段另一个端点都不相同,此时可判定为直角窗户,这类窗户一般在阳台出现。
步骤4根据步骤3判断完墙体后,剩下的线段则为绘制门的直线,便于之后门的识别。
3.3 门识别
一般情况下,标准的门是由一条线段和一个90°的圆弧画成的,圆弧的圆心为线段的一个端点,另一个端点与圆弧的一端相连。因此可根据这个特征对门进行识别。
在3.2节中,由于门窗处于同一个图层Window中,在识别完窗户后,该图层中剩余的线段则为绘制门的线段,而处于该图层中的弧线则为绘制门的弧线。当弧线的一端点与线段的一端点相交,并且圆弧的半径与该相交线段的长度差不多,则可判定组成的图块为门。
4 墙体轮廓提取
定义1设M=(xM,yM)和N=(xN,yN)为xy平面内任意不同的两点,-----→为由M指向N的有向线段,所在的直线把平面分为两个半平面。求z轴的单位矢量与-----→的叉积,得到的矢量所指向的半平面称为的左半平面,而另一个称为的右半平面。如果用齐次坐标表示直线和点,则可以很容易地判断出点与直线的位置关系。
例如,M和N用齐次坐标表示为:
设U=(x,y,1)为平面内任一点,计算U与的点积,可得点与直线的位置判断函数:
根据F的正负号可以判断V与的相对位置关系,如图7所示。
(1)如果F>0,U在的左半平面内;
(2)如果F=0,U在所在的直线上;
(3)如果F<0,U在-----→的右半平面内。
Fig.7 Judgement of relative position of point and line图7 点与直线相对位置判断
利用3.1节中的墙体识别算法对建筑平面图中的墙体进行识别,将得到如图8所示的墙体,此时发现外墙的线段是断开的。然而在实际生活中,外墙是一个封闭的图形,而门窗是镶嵌在墙体中。因此本文提出一种基于自适应分块的墙体轮廓提取算法,对墙体数据进行处理,快速提取到墙体的外轮廓及其中的坐标点。
Fig.8 Effect map of wall recognition图8 墙体识别效果图
数据分块的基本思想是把离散点数据划分成许多大小相同的格网,为便于管理,将对离散点的操作转换为对格网的操作,并且格网的数量远远小于坐标点的数目,从而降低了工作量,提高了效率。文献[14]提出了一种基于格网管理离散点来选取参与凸包构建子集的方法。首先根据x、y坐标最大最小值确定离散点的矩形区域,将区域中的x轴和y轴方向分为m、n等份,从而形成一个m×n的格网,将离散点投入到格网中。虽然提高了效率,但是只适用于均匀分布的离散点。
一般情况下,建筑平面图中坐标点的分布很不均匀,因此本文把格网的大小设置成一个动态变化的值。但是格网过大会导致格网中的点数太多,格网过小会导致许多格网无坐标点或者格网中的坐标点过少,会导致合并次数太多,这都将增加查询次数,降低轮廓提取的效率。因此,每个格网中如何选择适当数量的坐标点成为自适应分块的关键问题。本文获取到的墙体坐标点,如图9所示。
Fig.9 Coordinate points of wall图9 墙体坐标点
墙体轮廓提取算法的步骤如下:
步骤1计算每个格网中的最佳平均坐标点数量M。
给定点集Q,首先分别求出横坐标、纵坐标的最大最小值Wmax、Wmin、Hmax、Hmin围成一个矩形,将横纵坐标的大小差作为矩形的宽和高,如式(4):
在进行自适应分块区域划分时,由于平面图中坐标点不均匀,无法计算每个格网中平均坐标点数,以下假设点数据是随机均匀分布的情况,则满足:
其中,ρ表示坐标点的密度期望;n为点集Q中所有的坐标点数量。
本文根据文献[15]中搜索圆的公式,逆推得到M:
其中,A为点集Q的最小矩形面积,即A=W×H。
由式(7)可得搜索圆的外接正方形面积:
最终求得每个格网中最佳平均坐标点数M:
步骤2对墙体坐标数据进行自适应分块。
将点集Q的矩形区域分为4个相等的子空间,求得每个子空间的坐标点数S。
若S≤M,则停止对该子空间的再次分割;
若S>M,则继续将该子空间区域划分为4个相等的子空间,依次递归,直到满足条件。此时,整个点集S的块都将全部生成。
步骤3找极值点对数据进行区域划分。
根据文献[14]的定义,在步骤1围成的矩形中求出墙体坐标点的8个极值点。分别为N1(Xmin,ymax)、N2(Xmin,ymin)、N3(Xmaxymax)、N4(Xmax,ymin)、N5(xmin,Ymin)、N6(xmax,Ymin)、N7(xmin,Ymax)、N8(xmax,Ymax)。其中N1、N2分别为Xmin子集中,y坐标最小和最大的两个点;N3、N4分别为Xmax子集中,y坐标最小和最大的两个点;N5、N6分别为Ymin子集中,x坐标最小和最大的两个点;N7、N8分别为Ymax子集中,x坐标最小和最大的两个点。这8个点必定在墙体轮廓上。将这8个极值点沿顺时针方向连接成有向线段,将矩形大致分为5个区域I~V,如图10所示。
Fig.10 Dividing from adaptive block zone图10 自适应分块区域划分
步骤4对各个区域的数据进行处理。
将图10中连线所经过的网格中的坐标点以及I~IV子集内的坐标点进行保存,图中阴影所示的区域内的坐标点肯定不在轮廓上,故可以直接删除,从而减少参加轮廓构建的点数,减少计算量。
步骤5处理剩余坐标,提取墙体轮廓。
将步骤4中保留的坐标点,用快速排序算法按x坐标递增的方向进行排序。若存在多个点有相同的x坐标,则只保留具有最大和最小y坐标的两个点,且两点按y坐标增加的方向排列。排序完成后,可得到坐标点集中最左点ML和最右点MR,很显然ML和MR两点在墙体的轮廓上。
步骤6墙体轮廓线的提取。
将步骤5中得到的左右两点连线为LR,将整个点集划分为上下区域,分别为LU和LD。设Q为排列好的坐标点中的任意一点,对点Q与线段MLR相对应子集内的有向线段进行判断。根据定义1,做出如下判断:
若F>0,则表示在线段LR的左边,此时将该点划入LU区域;
若F<0,则表示在线段LR的右边,此时将该点划入LD区域;
若F=0,则表示坐标点在线段LR上,则删除点Q。
将LU区域中的点按x坐标递增的顺序连接起来,再将LD区域中的点按x坐标递减的顺序连接起来,即得到墙体的轮廓。
步骤7根据提取的轮廓提取其平行线。
墙体线是一对平行线段,此时求出的轮廓边界则为最外的一条线,根据墙体的厚度,得到另一条平行线,将相交的点保存在链表中,便于后续的翻模。根据上述流程,可得到图11所示的墙体轮廓图。可看到,图8中断开的外墙线段已经被连接,并且实现了墙体外部轮廓的提取。
Fig.11 Extracted wall contour图11 提取出的墙体轮廓图
5 建筑平面图三维建模
5.1 墙体建模算法
创建墙时,给定的坐标轴是三维的,但一般民用住宅是没有对应的三视图数据的,只有建筑平面图,高度则是按标准的民用住宅高度来设置的,因此此处的高度z设为2 800 mm。并且在生成一面墙时,形状必须是闭合的,否则会抛出异常,导致创建失败。
以下是墙体建模的算法,步骤如下:
步骤1将获取到的所有直线线段存放在一个集合中,对其进行遍历。
步骤2任意选取一条直线,得到起始点坐标(x1,y1),终点坐标(x2,y2),设置高度z为2 800 mm。
步骤3若x1=x2,y1≠y2时,设构成墙体的坐标数组为XYZ[]vertexes=newXYZ[]{newXYZ(x1,y1,0),newXYZ(x1,y2,0),newXYZ(x1,y2,2 800),newXYZ(x1,y1,2 800)};
若x1≠x2,y1=y2时,设构成墙体的坐标数组为XYZ[]vertexes=newXYZ[]{newXYZ(x1,y1,0),newXYZ(x2,y1,0),newXYZ(x2,y1,2 800),newXYZ(x1,y1,2 800)};
若x1≠x2,y1≠y2时,设构成墙体的坐标数组为XYZ[]vertexes=newXYZ[]{newXYZ(x1,y1,0),newXYZ(x2,y2,0),newXYZ(x2,y2,2 800),newXYZ(x1,y1,2 800)}。
步骤4根据步骤3得到的坐标数组,对其进行循环,长度为vertexes.Length,使用Line.CreateBound()函数创建墙体。
5.2 创建基于墙的门窗
墙属于门窗的宿主对象,在创建门窗时,有以下方法[16]:
(1)给定一个标高
NewFamilyInstance(XYZlocation,Family Symbol symbol,Element host,Level level,StructuralType structruralType)
(2)不给定标高
NewFamilyInstance(XYZlocation,Family Symbol symbol,Element host,StructuralType structruralType)
(3)给定一个朝向
NewFamilyInstance(XYZlocation,Family Symbol symbol,XYZreferenceDirection,Element host,Structural-Type structruralType)
5.3 墙体三维建模
本文是基于Revit 2014版本,在.NET 4.5的运行环境下进行二次开发,创建平台为Visual Studio 2012,基于的模板为类库。主要开发工具为Visual Studio 2012、Revit API(application programming interface)和Revit SDK。开发语言为C#,并结合了Revit 2014提供的对外接口(add-in manager),实现在Revit 2014中建筑平面图的三维重建功能。大致路线如图12所示。
6 实验结果及分析
本文实验所使用的PC机的基本配置是Windows 7/64位,酷睿i5处理器,2.93 GHz主频,英伟达1G独立显卡,8 GB内存。本机配置基本满足实验的运行要求。
本文在对墙体三维建模前,对墙体数据进行了处理。图13(a)显示的是提取前的模型图,可以看出墙体与墙体之间没有连接,是断开的,而实际上,墙体与墙体应该是无缝连接,显然提取前的模型图不符合生活中实际情况。相比图13(a),图13(b)为提取墙体轮廓后在进行建模的三维模型效果图,可以看出,图13(b)中断开的墙体连接完好,很好地解决了墙体断开的问题。
Fig.12 Flow chart of 3D reconstruction based on Revit图12 基于Revit三维重建路线图
Fig.13 3D model of wall图13 墙体的三维模型
在墙体轮廓提取的过程中,为证明划分格网的数量影响轮廓提取的效率,在已知平面图中所有坐标点数的情况下,对每个格网中的平均坐标点数量进行了研究。本文在之前提取算法中,利用公式计算每个格网中最佳的平均坐标点数,为了证明该计算结果的准确性,使用实际的建筑平面图中的坐标点数据作为实验数据。在Matlab平台上,分别使用了坐标点大约为500,1 000,2 000,3 000,5 000,7 000,10 000,15 000,20 000,30 000,50 000个不同的建筑图纸,随机拟定几个不同的平均坐标点数,与计算得出的最佳平均坐标点数分别进行自适应分块,从而进行墙体轮廓提取的效率对比,如表1所示。
Table 1 Comparing efficiency of different number of expected coordinates表1 不同平均坐标点数的效率对比
由表1可以看出,平均坐标点数量影响轮廓提取的时间,即划分格网的数量对轮廓提取有影响。随着平面图中坐标点数的增加,提取时间也随之增加,但由计算得出的最佳平均坐标点数在轮廓提取时的效率仍然是最高的,因此可以判定在算法中计算得出的最佳平均坐标点数是较为准确的。
文献[14]采用数据分块的思想,而本文则对数据分块的思想进行改进,提出自适应分块的方法。为了比较改进前后的效果,利用这两种算法对墙体进行轮廓提取,两种算法的提取时间如表2所示。
Table 2 Comparing efficiency of improved algorithm表2 算法改进前后效率比较
由表2可以看出,改进后的算法效率能够提高大约40%,尤其是坐标点数越多时效果越明显。与文献[14]算法相比,改进后算法的效率有一定的提高,说明本文提出的自适应分块墙体轮廓提取算法用来提高轮廓提取效率是可行的。
使用Autodesk Revit 2014软件对平面图中的墙体、门窗进行三维重建,效果图如图14所示。
Fig.14 3D model of floor plan图14 建筑平面图的三维模型
本文算法主要用于直线墙体、门窗的识别与重建,为了证明本文算法具有较强的适应性,进行了大量的实验研究。实验结果证明,本文算法可满足大多数的建筑平面图纸进行建筑构件的识别、直线墙体轮廓的提取以及三维重建,具有比较广泛的适用性。
7 结束语
本文通过对建筑平面图数据的读取、建筑构件的识别与Revit二次开发技术,实现了建筑平面图纸的三维重建。阐述了建筑平面图纸提取数据的算法流程,提取其中所需数据,并主要对直线墙体、门窗进行识别。为了避免提取到外墙间断坐标数据生成错误的三维模型,本文提出自适应分块的墙体轮廓提取算法,计算最佳平均坐标点,来达到该算法的最高效率,并与文献中所提算法进行效率的对比。最后将生成三维模型的过程制作成Revit插件,达到自动翻模的效果,避免重复工作,节省时间。
在墙体识别及轮廓提取的研究中,仅考虑了直线墙体,由于建筑构件的多样性,后续将对弧线墙体以及其他建筑构件的识别、提取进行研究。在三维重建研究中,本文仅考虑构件严格按标准规划图层的建筑平面矢量图纸,并未考虑扫描图或无图层信息的矢量图纸,在图纸的选择方面带来了局限性,并且重建的构件均为默认类型,如何做到更换多种类型,在后续将会做进一步研究。
[1]Yue Jie.BIM technology and its application in architectural design[J].Sichuan Building Materials,2011,37(5):270-271.
[2]Jardim-Goncalves R,Grilo A.Building information modeling and interoperability[J].Automation in Construction,2010,19(4):387.
[3]Cao Yi.Present situation and development of BIM standard[J].Technology Innovation andApplication,2012(8):256.
[4]Goldberg H E.The building information model[J].Cadalyst,2004,33(1):32-40.
[5]Guo Hongling,Li Heng,Skitmore M.Life-cycle management of construction projects based on virtual prototyping technology[J].Journal of Management in Engineering,2010,26(1):41-47.
[6]Ma Cheng,Lu Xiaolong,Wang Dejiang.The method of generating axis net on BIM model based on CAD plans[J].Journal of Information Technology in Civil Engineering andArchitecture,2016,8(1):43-47.
[7]Wang Jianyu,Wang Xiyan.Research on modeling technology from AUTOCAD to REVIT[J].Journal of Information Technology in Civil Engineering and Architecture,2015,7(3):111-115.
[8]Li Tingting,Wu Xian,Yin Li,et al.Research on the application of BIM technology in engineering construction project[J].Journal of Information Technology in Civil Engineering andArchitecture,2014,6(1):92-95.
[9]Noac R.Converting CAD drawings to product models[D].Stockholm:Royal Institute of Technology,2001.
[10]Wang Qing,Wu Yijie,Xia Guanhua.Three-dimensional CAD/CAM system to secondary development[J].Jiangsu Machine Building&Automation,2001(4):183-185.
[11]Han Qingyao,Gao Suwei.Research on data retrieve technique in AutoCAD three-dimensions graphics[J].Machinery Design&Manufacture,2010(6):199-201.
[12]Xu Jinxin,Yang Songlin,Zhang Gang.Study on auto discrimination technology of AutoCAD three-dimensional graphics based on unit test mode[J].Machinery Design&Manufacture,2011(12):75-77.
[13]Zhai Rui.Reading,recognition and 3D reconstruction of AutoCAD architectural drawings[D].Hangzhou:Hangzhou Normal University,2011.
[14]Jiang Hongfei.Study on fast convex hull algorithm of planar point set[J].Computer Engineering and Applications,2002,38(20):48-49.
[15]Li Yuan,Feng He.The modeling of discrete point grid based on search circle[J].Science&Technology Vision,2013(27):85.[16]Autodesk Asia Pte Ltd.Basic course of the secondary development based on Autodesk Revit[M].Shanghai:Tongji University Press,2015.
附中文参考文献:
[1]岳杰.BIM技术及其在建筑设计中的应用[J].四川建材,2011,37(5):270-271.
[3]曹毅.BIM标准的现状及其发展[J].科技创新与应用,2012(8):256.
[6]马成,陆小龙,汪德江.基于CAD图纸的BIM模型轴网生成方法研究[J].土木建筑工程信息技术,2016,8(1):43-47.
[7]王建宇,王昕妍.二次开发实现从AUTOCAD到REVIT快速翻模技术研究[J].土木建筑工程信息技术,2015,7(3):111-115.
[8]李亭亭,吴献,尹莉,等.BIM技术在工程建设项目中的应用研究[J].土木建筑工程信息技术,2014,6(1):92-95.
[10]王青,邬义杰,夏冠华.三维CAD/CAM系统二次开发技术[J].江苏机械制造与自动化,2001(4):183-185.
[11]韩庆瑶,高素威.AutoCAD三维图形数据提取方法研究[J].机械设计与制造,2010(6):199-201.
[12]徐金鑫,杨松林,张钢.单元测试模式的AutoCAD三维图形自动判别技术研究[J].机械设计与制造,2011(12):75-77.
[13]翟锐.AutoCAD建筑工程图的读取、识别与三维重建[D].杭州:杭州师范大学,2011.
[14]蒋红斐.平面点集凸包快速构建算法的研究[J].计算机工程与应用,2002,38(20):48-49.
[15]李源,冯贺.基于搜索圆的离散点格网化建模[J].科技视界,2013(27):85.
[16]Autodesk Asia Pte Ltd.Autodesk Revit二次开发基础教程[M].上海:同济大学出版社,2015.