鐘輝 朱琳 苗元滿







摘要:為了在建筑爬架設計中提高設計效率,課題針對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.
【通聯編輯:梁書】