APP下载

基于CAD图纸的Revit三维建筑模型生成技术

2023-12-25钟辉朱琳苗元满

电脑知识与技术 2023年31期

钟辉 朱琳 苗元满

摘要:为了在建筑爬架设计中提高设计效率,课题针对CAD图纸,结合建筑工程设计的实际需求,采用BIM二次开发技术,研究实现建筑构件的识别和三维建模技术。研究内容包括建筑图中的墙、柱和梁基本建筑构件数据提取与识别,并在Revit中自动创建相应的三维模型。提出基于图元的图层和几何特征识别算法,通过Teigha.NET类库对CAD图纸中的信息读取,利用RevitAPI进行几何识别和计算并进行三维构件创建,实现了自动化三维建模流程。研究成果可以在CAD图纸中快速提取和识别建筑构件的数据,并实现对应的三维建模,显著提高建筑信息模型(BIM) 的创建效率和准确性。

关键词:C#;CAD;三维模型;RevitAPI;Teigha

中图分类号:TP391.72    文献标识码:A

文章编号:1009-3044(2023)31-0138-04

开放科学(资源服务)标识码(OSID)

0 引言

随着建筑信息模型(BIM) 在建筑行业的广泛应用,利用CAD图纸进行建筑构件的识别和三维建模成为一项重要的研究方向[1]。在传统的建模过程中,手动创建和编辑构件模型需要耗费大量的时间和人力,并且容易出现错误和不一致。因此,通过利用Revit API进行二次开发,实现对CAD图纸中的构件数据的提取和建模,具有重要的实际应用价值[2]。

研究旨在利用Revit API进行二次开发,基于CAD图纸实现墙柱梁建筑构件的数据提取与识别,并自动创建对应的三维模型。实现了高效、准确和自动化的建模过程,为BIM应用提供了有力的支持。

1 技术与方法

1.1 CAD图纸预处理

常规的CAD建筑图纸不但有建模所需要的墙、柱、梁等建筑构件信息,还包含了这些部件的尺寸、材质等信息,这些信息可以为建模提供准确的依据。但信息量较大,有些信息冗余,因此首先需要对建筑 CAD平面图纸进行預处理。根据规范对建筑物按照不同的类别进行分层。

1.2 二维模型数据提取

CAD图纸中的建筑构件数据通常由两个部分组成。第一部分为建筑构件的结构图,包括墙、柱和梁的平面视图和立面视图,这些几何元素可以明确建筑构件的形状和结构。第二部分为文字标注,标注建筑构件的尺寸、长度、高度、厚度等信息,这些信息可以获知建筑构件的具体尺寸。在数据提取时,将CAD图纸中的文字和几何元素分别提取并保存到不同的集合中。在保存文字时,同时保存文字的位置、文本信息和图层名称等信息。在保存几何元素时,保存位置、几何元素类型、线段长度、梁的宽度和高度等信息,为三维模型生成提供数据支持。

1.3 构件识别

基于图层及线型属性的几何特征识别:将建筑构件分图层存储,编程读取这些图层,获取这些建筑对象的平面坐标进行三维建模。以建筑施工图行业标准为例,墙存储于“WALL”图层,柱存储于“柱”图层,梁存储于“BEAM”图层,考虑设计人员对图层起名的不规范性,凡是图层名字中带有“WALL”或者“墙”“COLUMN”或者“柱”“BEAM”或者“梁”的图层均为相应的墙图层、柱图层、梁图层。然而通过对大量图纸的研读分析,发现只根据图层进行构件区分的方式并不严谨,结合墙、柱由PLine线构成,梁由Line线构成的线型特征及构件的几何特征进行进一步的识别确认。

1.4 三维模型生成

基于Revit软件平台,采用C#语言和Visual Studio2015开发工具,基于Revit和Teigha.NET类库提供的函数库进行二次开发,结合获取到的构件信息,编写建模程序,实现Revit中自动生成结构BIM模型。RevitAPI是Autodesk公司提供给开发者使用的应用程序编程接口,使开发人员能够与Autodesk Revit软件交互[3]。通过引用RevitAPI.dll,RevitAPIUI.dll文件,在程序中调用RevitAPI中的方法实现对Revit操作,将搭建成功的程序生成后缀为.dll的动态链接库文件,使用外部工具执行该文件,实现在Revit中建立三维模型。

2 实现过程

综上所述,构件的三维建模过程总体分为以下几步:CAD图纸的预处理;数据提取,结合相应算法识别墙、柱、梁;通过设计算法计算不同构件的轮廓,并根据拉伸高度进行三维建模。

2.1 数据提取

Teigha.NET类库提供了构件属性访问功能,可以轻松地访问CAD图纸中的构件属性信息。在CAD中使用PU命令,删除图形中未使用的命名项目,清理图纸中无用元素[4],根据元素在CAD中存储类型的不同将标注、位置等属性保存到集合ListCADTextModels中、将图层、线型等属性保存到集合ListCADGeometryModels中[5],见图1。

2.2 构件识别

通过数据提取,把构成墙、柱、梁的线存储于集合ListCADGeometryModels中,根据图纸分析,墙、柱线由PLine线构成,梁线由Line线构成,遍历集合中的线,将集合分为包含墙柱线的集合ListPLine和包含梁线的集合ListLine。

1) 墙识别

在CAD图中的墙体最简单的是由四个顶点组成的细长矩形,复杂一点则是L形、T形、X形等,L形有六个顶点,T形有8个顶点,X形有12个顶点。见图2(a) (b) (c) (d) 。

每增加一个L形墙角,整体的点数会增加2个,每增加一个T形墙角,整体点数增加4个,每增加一个X形墙角,整体增加8个顶点。由简单墙体增加了一个L形墙体、T形墙体、X形墙体,其顶点数为[4+1×2+1×4+1×8=18]见图2(e) 。

通过计算分析可知,墙体一般是封闭多边形表示,且多边形的点数为大于等于4的偶数。建立空的点列表集合ListPoints1用于存储顶点坐标信息。循环遍历ListPLine集合中的每个顶点,当顶点数为大于4的偶数时,判断为墙,并将顶点坐标存储到集合listPoints1。当顶点数等于4时,须进行墙、柱区分。

2) 柱识别

在CAD图纸中,柱一般为矩形,由四条PLine线构成,即四个顶点,通过循环遍历集合ListPLine,获得顶点数为4的封闭多边形。在与墙体做区分时,考虑长宽比,当长宽比大于2时,为墙,小于2时为柱。建立空的点列表集合listPoints2用于存储顶点坐标信息。循环遍历集合ListPLine中的每个顶点,当顶点数等于4时,计算两个相邻顶点之间的距离distance,并将前3个顶点得到的两条线段的距离进行比较得到相对较长的线段distance1和相对较短的distance2,当distance1与distance2的比值小于2时,即判断该四边形为柱,将顶点坐标存储于集合listPoints2中。当比值大于2时,说明该四边形为墙,顶点坐标存储于集合ListPoints1中。墙柱识别流程见图3。

3) 梁识别

在CAD图纸中梁由Line线构成的双平行线表示。创建ListBeamLines空集合,用于存储识别到的梁线,创建ListDistance集合,存储两条梁线之间的距离。循环遍历ListLine中所有线,选择一条线line1作为基准线,并从集合中删除它,再次遍历集合,在删除基准线line1之后的集合中,寻找另外一条与line1长度(误差控制在10mm以内)相等,角度相同的线line2,如若满足条件,将两条线添加到ListBeamLines集合中,并计算两条线之间的距离distance,通过判断横纵坐标是否相等,进一步判断梁为横梁还是竖梁,如果两条梁线的起点横坐标相同,纵坐标不同,则为横梁,距离即为纵坐标之差;如果两条梁线的起点纵坐标相同,横坐标不同,则为竖梁,距离为横坐标之差。将距离与设定的梁宽200mm和300mm,进行比较(误差控制在10mm以内),符合条件的添加到集合ListDistance中。梁识别流程见图4。

2.3 识别构件轮廓及拉伸高度

1) 轮廓

墙:遍历PLine线集合,得到顶点坐标集合ListPoints1,将集合中的点按顺时针排序,从起点到终点,首尾相接,顺序生成线段,并添加进线段集合CurveArray1中,最后将集合CurveArray1添加进封闭轮廓线CurveArrArray1列表中,得到墙底面轮廓集合。

柱:遍历PLine线集合,得到顶点坐标集合ListPoints2,将集合中的点按顺时针排序,从起点到终点,首尾相接,顺序生成线段,并添加进线段集合CurveArray2中,最后将集合CurveArray2添加进封闭轮廓线CurveArrArray2列表中,得到柱底面轮廓集合。

梁:遍历Line线集合,得到了相互平行且相等的梁线组,遍历梁线组ListBeamLines,将每组梁线构建一个闭合曲线环CurveLoop,并将其添加到集合ListCurveLoop,得到梁轮廓集合。

2) 高度

在CAD圖纸中,墙、柱的高度一般与楼层高度相同。梁的拉伸高度通过读取CAD中的文字标注即可得到。遍历集合ListCADTextModels,在所有文字标注中,带有“L”的为梁标注,在梁标注中“×”号后面的整数,为梁的高度如图4中数字“700”,() 内的数字如(+0.200) 表示梁高在楼层高度以上0.200m(见图5) 。

2.4 拉伸

使用Revit API中提供的FamilyCreate.NewExtrusion方法创建三维轮廓[6]。

2.5 拉伸底面轮廓

通过调用FamilyCreate.NewExtrusion方法,传入在上文计算出的型件的底面轮廓和拉伸高度,实体拉伸三维模型外轮廓。

3 实验结果

为验证算法可行性,对如下图纸进行试验,实验结果表明,本算法可以实现CAD图纸数据提取及翻模。

3.1 读取图纸

使用Teigha.NET类库,读取CAD图纸,删除无用图层,保留墙、柱、梁及文字标注图层。使用数据提取算法,将提取到的文本信息,和几何信息分别存储。并通过构件识别算法,识别相应构件信息,见图6。

3.2 根据提取的数据,生成三维模型

1) 生成墙

创建墙的底面轮廓:已知墙底面轮廓集CuveArray1,在Revit中创建一个二维轮廓线,使用Revit API中的Curve类来表示轮廓线。使用Line.CreateBound()方法创建线段。

创建墙类型:使用Revit API,可以创建一个新的墙类型,并将轮廓线应用于该墙类型。使用WallType.Create()方法创建新的墙类型,并设置相关参数。

创建墙实例:使用Revit API的Wall.Create()方法来创建墙的实例,并指定其位置、朝向、墙类型等属性。使用Document对象来管理Revit项目,并使用Document.Create方法将墙实例添加到项目中。

设置墙的高度:根据已知的拉伸高度,使用Revit API的Element类的来设置墙的高度属性。使用Element.get_Parameter()方法获取墙的高度参数,然后使用Parameter.Set()方法设置墙的高度值。

2) 生成柱

解析底面轮廓数据:根据已知的柱底面轮廓数据,将其转换为Revit API可接受的几何对象。使用Revit API中的Curve类来表示底面轮廓的边界线,使用PolyLine类来创建底面轮廓的边界线。

创建轮廓线的闭合环:将底面轮廓的边界线连接为一个闭合的轮廓环。使用中的CurveLoop类来表示闭合环,通过添加底面轮廓的边界线到CurveLoop对象中实现。

创建柱的几何对象:使用Extrusion类创建柱的几何对象。通过指定底面轮廓的闭合环、拉伸高度和拉伸方向来创建柱的几何体。

创建柱的类型:通过Revit API,可以创建一个新的柱族类型,并将柱的几何形状和参数应用于该族类型。

创建柱的实例:使用FamilyInstance类来创建柱的实例,并指定其位置、朝向、族类型等属性。

3) 生成梁

根据上文提取到的梁的平行线ListBeamLines,提取平行梁线段的起点和终点坐标。

使用起点和终点坐标创建两条平行线段的几何对象,使用Line.CreateBound()方法来创建线段。

創建闭合轮廓:使用CurveLoop类创建一个闭合的曲线环,将两条平行线段作为环上的两条线。

创建梁的几何模型:使用Extrusion类创建一个梁的几何模型,将闭合轮廓作为剖面,并指定梁的高度作为拉伸的距离。

创建梁的族类型:使用Revit API创建一个新的梁族类型,并将梁的几何模型应用于该族类型。

创建梁的实例:使用FamilyInstance类创建一个梁的实例,并指定其位置、朝向、族类型等属性。

墙、柱、梁整体三维模型见图7。

4 结论

通过Teigha.NET类库直接读取CAD图层中构件的几何位置信息,基于图层及图元线的几何特征识别算法实现了CAD建筑图纸中墙柱梁数据的提取识别,并实现在Revit平台上的三维模型重建,有效地避免了设计过程中的重复劳动,提升了人工翻模的效率和模型重建的质量。经过实验验证,研究提出的方法具有较强的通用性和适应性,能够基本实现单项构件自动翻模(部分构件由于绘图不标准出现误差),特别适合于熟悉CAD而不熟悉Revit的设计人员使用,能够在很大程度上规避因为对Revit软件操作不熟练而导致的翻模效率低下的问题,极大地提高了模型重建效率。相比于纯手工建模,研究提出的方法能够显著地节省设计人员的时间和精力,让设计人员从烦琐的建模工作中解放出来。方法虽然已经达到了较高的准确率和效率,但是在容错性和内容深度方面仍有改进空间,需要研究者进一步探索和优化。

参考文献:

[1] 白玉星,刘云鑫.Revit二次开发研究进展及未来展望[J].科学技术创新,2019(6):81-82.

[2] 王建宇,王昕妍.二次开发实现从AUTOCAD到REVIT快速翻模技术研究[J].土木建筑工程信息技术,2015,7(3):111-115.

[3] Autodesk Asia Pte Ltd. Autodesk Revit二次开发基础教程[M].上海:同济大学出版社,2016.

[4] 李冠亿.深入浅出AutoCAD.NET二次开发[M].北京:中国建筑工业出版社,2012.

[5] 蒋健明,周迪斌,胡斌,等.基于建筑图纸的三维重建技术研究进展[J].杭州师范大学学报(自然科学版),2011,10(4):375-379.

[6] Autodesk Asia Pte Ltd. Autodesk Revit二次开发基础教程[M].上海:同济大学出版社,2015.

[7] 王博.基于Revit的地铁车站换乘通道结构模型自动生成算法研究[D].南昌:华东交通大学,2017.

[8] 田思敏.基于BIM的三维重建技术研究[D].西安:西安建筑科技大学,2017.

[9] 张维锦,汪雷,石学荣,等.结构施工图中暗柱识别算法研究[J].华东交通大学学报,2015,32(2):117-122.

[10] 翟锐.AutoCAD建筑工程图的读取、识别与三维重建[D].杭州:杭州师范大学,2011.

[11] LI Zhengnong,ZHU Aimin,WU Honghua,et al. Research on the application of Revit-based secondary development in scaffolding design[J]. Journal of Hunan University(Natural Science Edition),2018,45(9):65-73.

【通联编辑:梁书】