闵 雅,盛步云,罗瑞平
(武汉理工大学 机电工程学院,湖北 武汉 430070)
在建筑行业中,建筑工程图的三维重建相关理论研究和应用系统开发一直是研究热点[1-2]。
以建筑工程图为研究对象,分析三维建模方式,工程图稿的自动生成方法大多是针对DXF格式的建筑工程图进行解析[3-5],这类方法侧重局部细节,未充分利用人工绘制时人为保留的区分特性,算法搜索空间过大。常见的工程图多为DWG文件,为减少文件格式转换的繁琐操作,笔者选取DWG建筑工程图进行数据提取。
国内外学者在DWG文件信息提取方面进行了大量研究。文献[6]介绍了AutoCAD层次对象结构;文献[7-8]分析了DWG文件中各类常见实体对象和相关的点数据提取方式;文献[9]应用AutoCAD二次开发技术实现了工程图标题栏信息的提取。对DWG文件的数据提取,相关AutoCAD的二次开发技术已经非常成熟,在各种场景中均有大量应用。但针对块实体对象、分辨建筑工程图有效实体对象,以及针对DWG文件的数据解析、过滤等相关研究相对要匮乏一点。笔者以DWG建筑工程图作为研究对象,提出一种基于分块思想的DWG建筑工程图数据自动提取方法,旨在识别和提取DWG建筑工程图的信息。首先,总结了AutoCAD层次对象结构,并将其与建筑工程图实体对象之间进行了关联。通过设定建筑工程图区域U模型,归纳了绘制在不同区域的实体对象的属性区别。然后,详细阐述了DWG信息提取的具体方法,并描述了提取的具体数据类型和属性关系。同时,通过改进平面扫描算法,实现了多实体对象的布尔运算[10-11],能有效获得建筑楼板的轮廓数据。最后根据所获得的信息进行三维草图重绘,与二维工程图绘图轮廓相对比,证明本文数据提取方法可靠。
2000年AutoCAD应用程序中有68个对象被公布。根据这些对象的从属关系,文献[6]归纳出具有4层树状结构的Automation对象模型。在这个模型中,Application对象作为顶层对象,通过其属性和方法可获取AutoCAD应用系统的本身特性(如版本信息)并执行相关操作(如加载外部应用程序文件);Preference对象和Document对象是第二层,Preference对象负责AutoCAD的个性化配置,Document对象则是当前打开的图形文件,通过该对象可以实现对所有实体和非实体集合的访问;Database数据库对象作为第三层,主要是由符号表(Symbol Tables)和命名对象字典(Dictionaries)组成,第四层是块表对象(BlockTable)。其模型结构如图1所示。
块表下对象之间的关系如图2所示。该对象下的块表记录(BlockTableRecord)是图形文件中各类实体(Entity)的存储位置,其中系统默认的特殊块表记录是模型空间(*Model_Space)(绘制在其中的实体对象在模型空间图纸中显示形状)和图纸空间(*Paper_Space)。绘图时创建的各种实体类型(EntityType)会存入对应绘制空间的特殊块表记录中,不会单独生成块表记录;而自定义的块(Block)不仅有EntityType对象,也会有单独对应的块表记录。根据设定的块表记录属性,块表记录可以分为匿名块表记录和非匿名块表记录。非匿名块表记录多是绘图时创建的各种图形实体对象Entity集合,在*Model_Space窗口中可见;而匿名块表记录没有名字,无法从其他对象引用获得,在*Model_Space窗口可见但不可以编辑。
图2 块表下对象类型和相互关系
实体对象作为DWG数据获取的主要研究对象,包含两大类:块参考(BlockReference)和实体类型(EntityType)。常见的实体类型有多线(Ployline)、多行(Mline)、面域(Region)、单行文本(DBText)、填充(Hatch)等。BlockTableRecord是由n个BlockReference和构成块的m个EntityType共同组成;BlockReference仅记录Block的相关属性(插入点、旋转角度等), 不涉及图形实体的点、线等属性,而EntityType则是图形点、线数据来源。实现图纸信息的提取需要沿着模型的树形结构自上而下地对AutoCAD对象进行访问。
将DWG建筑工程图绘图范围简记为U区域,其区域模型定义如式(1)所示。
U={Ue,Uf,UA}
(1)
式中,Ue、Uf和UA分别为建筑工程图的解释性区域、功能性区域和工程图图纸标准图框。
(1)Uf是建筑工程图的功能性区域,定义为:
Uf={Bff,Bfe}
(2)
式中:Bff为功能性区域功能性块;Bfe为功能性区域解释性块。
功能性区域功能性块指在建筑工程图图框内绘制的基本构件块,是三维重建模型的二维草图的数据来源。功能性区域解释性块指在建筑工程图图框内绘制的非基本构件块,是三维重建中补充三维特征数据的来源。
(2)Ue是建筑工程图的解释性区域,定义为:
Ue={Bee,Bef}
(3)
式中:Bee为解释性区域解释性块;Bef为解释性区域功能性块。
解释性区域块,构件块在建筑工程图图框外侧单次或多次重复绘制,对建筑工程图有细节补充和帮助人工辨识的作用。解释性区域解释性块在Uf区域已经绘制过。解释性区域功能性块没有在Uf区域绘制过。
(3)UA是建筑工程图的工程图图纸标准图框,是区分Ue解释性区域和Uf功能性区域的边界线,定义为:
UA=Rect(P1,P2)
(4)
式中:P1为标准图框的左下角顶点;P2为标准图框的右上角顶点;Rect(P1,P2)表示标准图框的最大外矩形。
Rect(P1,P2)={(x,y)|[(P1.x≤x≤P2.x)&
(y=P1.y|P2.y)]||[(P1.y≤y≤P2.y)&
(x=P1.x|P2.x)]
(5)
以郑州某铝模底图为例(如图3所示),绘制在标准图框外的解释性实体对象能直接被分割出来。这一结果对剔除图层中部分不需要进行三维重建的实体对象有显著效果。
图3 建筑工程图区域U模型示例
依据建筑工程图区域模型U,从三维重建数据提取涉及的采集数据内容、记录方式和数据用途等方面进行分析,对建筑工程图内实体对象进行具体属性统计,其归纳情况如表1所示。根据工程图图纸标准图框公式可以剔除Ue解释性区域实体对象,结合图层分类,能提高获取需要三维重建的实体对象准确率;根据是否是建筑构件进行区分,可以实现Uf功能性区域的Bff功能性区域功能性块和Bfe功能性区域解释性块的区分。
定义1:匿名块。CAD(computer aided design)中命名为*UXX的图块。匿名块是由动态创建和执行过程代码的PL/SQL(procedural language/structured query language)结果,其数据并不存储在数据库对象中。
定义2:重复块。CAD中同一个块表记录对象下有多个块参考对象的图块。重复块具有唯一的块名和实体对象,但有多个不同的块属性。
3.1.1 匿名块处理
建筑工程图以块形式表达,针对DWG文件的数据提取,主要提取对象是存储在块表记录(BlockTableRecord)中的实体(entity)。因此,信息并不存储在数据库的匿名块应提前被过滤,即过滤属性IsAnonymous=false的btr。
3.1.2 重复块处理
过滤掉匿名块后,对btr对象中所有实体对象进行遍历,分成块参考br对象和实体类型obj对象,进行分类处理。如果存在多个br对象,则表示btr对象所代表的块是重复块。判断块插入点br.Position和工程图图框UA的相对位置关系,当块插入点在工程图图框外侧时,不用对br对象进行数据提取。否则,要对br对象进行数据提取。
3.2.1 BlockReference块参考br对象数据提取
在过滤掉不需要进行数据提取的重复块br对象后,对属于同一个btr的其他br对象进行数据提取,将提取的信息集成为块插入信息。块插入属性包括:图块名、图层名、块插入点、块插入数量、是否重复块标记和重复块的块插入点集合。
3.2.2 EntityType实体类型obj对象数据提取
遍历同一个btr中获得的obj对象,根据实体类型在三维重建中的作用,将其分为3类:图元对象(Ployline、Region、Mline等),文本对象(DBtext)和填充对象(Hatch)。不同类型obj对象所需要提取的数据不一样。公共属性包括:对象ID、图块名、实体属性和图层名。图元对象包括:Line端点集合。文本对象包括:文本旋转角度、文本高度、文本内容、文本宽度因子和文本插入点。填充对象包括:填充类型和填充插入点。
由于块对象中创建的实体对象坐标是基于用户坐标系的,但块对象本身的坐标是基于世界坐标系的,因此块对象需要通过坐标转换才能被正确地组合到建筑工程图的*modelspace中。
3.3.1 坐标系转换
已知块插入点P0(x,y,z) ,块实体USC(user coordinate system)坐标矩阵为UBP(UCS_BlockPoint)=[x,y,z]T,将各块的用户坐标系USC转换为世界坐标系WCS(world coordinate system),块实体WCS坐标矩阵WBP(WCS_BlockPoint)其计算方法如式(6)所示。
(6)
3.3.2 数据圆整
实际建模注重点之间的相对距离特征。以墙块最左下角顶点P1(x′,y′,z′)为自定义坐标系的原点,其计算方法如式(7)所示。各块WBP坐标系再次进行坐标转换,得到各块CBP(cutomized block point)坐标矩阵,保留点之间的相对位置关系,完成数据圆整,其计算方法如式(8)所示。
(7)
(8)
3.4.1 同一直线上的线段合并算法
同一直线上两两有向线段的位置关系包括3种情况:重合、相交和不相交;进行合并时,结果分为4类。l1=(a1,a2),l2=(b1,b2)为在同一水平或垂直线上的两条线段。同一直线上两两线段的位置关系和合并结果如图4所示。
图4 同一直线上两两线段的位置关系和合并结果
3.4.2 改进平面扫描算法
输入:墙、梁、柱实体对象的闭合环Cir集合。
输出:带方向的闭合环集合。
Step1:对Cir中闭合环进行顺时针标记,使组成环的line带有方向。闭合环顺时针标记,本文采取先找凸点A(闭合环中具有最小y坐标中的最小x坐标的端点),计算A点的两条边AB、AC的叉积AB×AC,如果叉积值大于0,ABC逆时针;小于0,ABC顺时针。
Step2:根据线段倾斜率,line集合的线段分为水平线集合和垂直线集合。
Step3:水平线集合,根据y轴坐标进行分类,对具有相同y坐标的lines集合进行同一直线上的线段合并算法,合并结果如图5(b_1)所示。
Step4:垂直线集合,根据x轴坐标进行分类,对具有相同x坐标的lines集合进行同一直线上的线段合并算法,合并结果如图5(c_1)所示。
Step5:搜索闭合环,合并结果如图5(a_1)所示。寻找首尾端点相连的线段并保存,线段方向组成闭合环的顺逆时针方向。
图5(a)与图5(a_1)是合并前后对象对比图;图5(b)与图5(b_1)是水平线合并前后对比图;图5(c)与图5(c_1)是垂直线合并前后对比图。图5(a_1)表示最后合并结果,其中深色闭合环,方向为逆时针,表示楼板构件。浅色闭合环,方向为顺时针,表示建筑最大外节点。
基于CJHJ和Visual Studio 2015的开发平台,在AutoCAD2016中打开DWG文件,输入行命令加载.DLL文件后,点击插件,即可实现DWG文件数据提取。本文实验的研究对象是DWG格式的某铝模底图。插件获取数据结果如图6所示,根据每一次选择的块名,可以查看其包含的图层和线型信息。
图6 操作界面获取数据显示
根据是否是真实建筑结构,将构件分为建筑构件和非建筑构件2大类。该DWG建筑铝模设计底图有非匿名块共计31个。采用重复块处理后,筛掉无实际三维重建意义的块对象16个,保留块对象15个。针对这15个块的实体数据提取,提取结果如表2所示,提取图元对象1 723个、文本对象1 105个、填充对象217个。对所有数据进行点修正处理,以墙块为例,同一端点在进行点修正前后的坐标对比结果如图7所示。完成该DWG文件的数据提取全程耗时9.67 s。根据提取信息重绘建筑构件草图,其部分结果如图8所示,与原始建筑构建块实体对象数量一致,形状吻合。
表2 验证实例的自动获取块信息统计
图7 墙块同一端点进行点修正前后坐标的对比图
图8 原DWG建筑块与重绘建筑块对比图
笔者通过二次开发,实现了实体对象数据提取并应用于DWG建筑工程图中,自动数据提取方法能极大提高工程图三维重建效率,具有实际工程意义。