劉兆新, 田斌華, 陳元培, 徐幫樹, 石偉航
(1. 山東濱萊高速公路有限公司, 山東 淄博 255200; 2. 山東大學齊魯交通學院, 山東 濟南 250002)
近幾年來,建筑信息模型(BIM, building information modeling)技術迅速興起,其結合了計算機輔助設計與數字技術,使得工程設計與建設從二維的CAD圖紙升級為含有參數信息的三維模型[1]。但BIM技術在新奧法隧道中的應用尚處于起步階段,BIM技術的研究對于展示隧道的設計、施工等信息、提高信息化建設管理水平具有重要意義,因此,現(xiàn)已成為隧道工程信息化發(fā)展的趨勢。
新奧法隧道中構件種類多,數量龐大,若不采用參數化建模,則需要對每一隧道構件進行單獨建模,工作量巨大,這將在很大程度上限制BIM技術在隧道工程中的應用。所謂參數化建模,就是將模型的關鍵特征及單元進行提取,并適當簡化,通過編寫特定的算法,使其實現(xiàn)模型的自動生成與拼裝[2]。參數化建模技術將是以后隧道模型建立發(fā)展的趨勢。基于現(xiàn)有Revit軟件進行二次開發(fā),研究并提出新的公路隧道參數化建模算法,可以在前人的基礎上縮短開發(fā)周期、降低建模成本,以實現(xiàn)快速批量建模。而目前關于新奧法隧道的參數化建模研究還非常少。一些學者利用Revit在其他方面[3-10]做過一些研究,例如: 丁曉宇等[8]研究了二次曲面網殼的參數化建模,但并未在具體行業(yè)領域進行實際應用;饒志華[9]研究并實現(xiàn)了地鐵圍護結構模型的快速生成,但其利用了手工創(chuàng)建的族庫,并未完全實現(xiàn)參數化建模;馬佰鈺[10]對斜拉橋的參數化設計進行了研究,但只是實現(xiàn)了模型的參數化創(chuàng)建,對于模型的位置還需要手動操作布置。
由以上研究可以看出,關于通過Revit二次開發(fā)實現(xiàn)參數化建模的研究已相對較為成熟,但針對隧道模型快速建立的研究較少,且目前大多數參數化建模技術僅僅圍繞模型本身進行創(chuàng)建,對于模型的空間位置還需進行手動布置。因此,本文通過對隧道初期支護構件(如小導管、格柵鋼架等)在隧道設計與施工過程中的特點進行研究,利用Revit二次開發(fā),設計算法實現(xiàn)了隧道初期支護構件的參數化創(chuàng)建與自動布置; 然后,以某隧道工程實例驗證了本文提出的構件參數化建模方法的可行性。以期研究結果為類似工程的參數化建模研究提供一種新思路。
Revit允許通過任何與.NET兼容的語言來進行二次開發(fā),例如: Visual Basic.NET、C#、C++等。本文選擇C#語言基于Revit 2017使用Visual Studio 2012來進行編譯。
在Revit二次開發(fā)過程中,獲取用戶輸入數據主要有2種方式,一種為Windows窗體即Winform,另一種則為WPF窗體。本文采用了Winform編寫窗體,本質上,窗體程序也只是一個類,僅僅是主程序在運行時調用它。而窗體程序中的參數向主程序傳遞的方式通常通過重載構造函數來實現(xiàn)。此外,在Revit的事件響應中修改文檔,必須顯式地啟動一個事務,任何修改都要在事務提交后才寫入文檔,如果在事件響應前事務未被關閉(提交或撤銷),則在該事務中的所有修改都將被丟棄[11]。
本文通過外部命令來執(zhí)行程序,Revit二次開發(fā)流程如圖1所示。
新奧法隧道斷面通常由幾段圓弧組成,這在實際建模過程中比較復雜[12]。本文為此做了相應簡化,將隧道斷面簡化為由2段圓弧組成,即下部仰拱部分單獨作為一段圓弧,其余上半部分作為一段圓弧。隧道斷面簡化示意圖如圖2所示。
圖2 隧道斷面簡化示意圖
本文插件所建立的所有模型均是基于一個較特殊的族文檔——概念體量。概念體量的設計功能非常強大,彌補了一部分常規(guī)建模方法如公制常規(guī)族API(application programming interface)在建立復雜曲面異形結構模型時的不足,在方案推敲、曲面異形建模、高效參數化設計等方面都有非常好的運用。概念體量創(chuàng)建幾何圖元的方式與其他族文檔完全不同,API中有一套獨立的函數來實現(xiàn)概念體量中幾何圖元的創(chuàng)建與編輯。此外,本文中的所有插件均是針對直線形與圓弧形(平曲線)隧道。因為Revit圓弧形陣列API的局限性,本文研究主要針對平曲線,帶有緩和曲線或特殊加寬段的隧道需要單獨進行手動布置操作。
錨桿支護是隧道施工中常采用的一種支護加固方式。錨桿的種類有很多,在隧道中常用的錨桿有砂漿錨桿、中空注漿錨桿及藥卷錨桿等[13]。本文主要針對砂漿錨桿及中空注漿錨桿的創(chuàng)建進行研究。
在實際工程中,每一榀錨桿都是沿著隧道斷面環(huán)向布置的[14]。一般可以采用2種方式實現(xiàn)錨桿的快速布置: 1)基于鏈接CAD圖生成布置所有錨桿; 2)在Revit中繪制相應的隧道斷面圓弧,由弧線布置所有錨桿。方法1)中CAD圖的弧線可能存在多余的重疊線段,需要對線段進行重疊處理;方法2)是首先繪制隧道或各構件布置弧線,基于該模型線布置所有錨桿,可不基于CAD圖。因此,本文采用方法2)實現(xiàn)錨桿的快速布置,其弧線布置如圖2所示做了適當簡化。讀取模型弧線信息的代碼如下:
UIDocument uiDoc = cmdData.Application
.ActiveUIDocument;
Reference ref1 = uiDoc.Selection.PickObject(
ObjectType.Element, "選取元素");
Element elem = revitDoc.GetElement(ref1);
Options options = new Options();
//取得幾何元素
GeometryElement gE = elem.get_Geometry(options);
//取得圓弧幾何信息
foreach (GeometryObject item in gE)
{
arc = item as Arc;
k1 = arc.Radius;//弧線的半徑
Execute6 _exeventHander2 = new Execute6(k1);
}。
錨桿生成的大致流程是: 1)繪制錨桿布置的模型弧線并選擇,輸入錨桿生成的相應參數。若為圓弧形隧道,則還需要點擊“選擇圓曲線”按鈕,然后選擇相應隧道曲線; 而對于直線段隧道,則無需點擊該按鈕,直接進行選擇即可在體量族環(huán)境下生成單個錨桿模型。2)自動導入建筑項目中進行旋轉、陣列等操作,最終生成所有的錨桿。錨桿生成流程如圖3所示。
依據上述流程,程序需要提供用戶輸入界面以方便用戶輸入錨桿類型、直徑、長度、環(huán)向間距、縱向間距以及標段長度等參數,設定界面如圖4所示。點擊錨桿生成按鈕即提示選擇模型弧線,單擊選擇模型弧線之后,彈出該參數設定界面,在該界面輸入相應參數,若為圓弧形隧道,則點擊選擇圓曲線,然后點擊“確定”按鈕即可生成所有錨桿。
圖3 錨桿生成流程
圖4 錨桿參數設定界面
此外,在將單根錨桿導入項目中后,如何使錨桿沿著所任意繪制的弧線進行圓弧形陣列是其中的一個關鍵問題。針對此問題,本文采取的整體思路為: 1)將錨桿移動到前文所讀取到的弧線圓心位置。2)將錨桿向某一方向(如向上)移動弧線半徑的距離,并在此建立1條與錨桿軸線重疊的線段,判斷該線段是否與弧線相交。3)①若相交,則基于圓心沿某一側(如逆時針)旋轉,每次比上一次多旋轉0.001 rad(此處兼顧考慮了模型精度及插件效率),直到旋轉至與弧線不再相交的位置,然后往回旋轉0.001 rad,此位置即可看作弧線的一側端點,然后將錨桿旋轉至該位置; 將錨桿沿另一側(如順時針)進行圓弧形陣列,即可得到一榀錨桿。②若不相交,則同樣基于圓心沿某一側(如逆時針)旋轉,每次比上一次多旋轉0.001 rad,直到旋轉至與弧線相交的位置,此位置即可看作弧線的一側端點,然后將錨桿旋轉至該位置; 將錨桿繼續(xù)沿該側(如逆時針)進行圓弧形陣列,即可得到一榀錨桿。一榀錨桿生成的具體過程如圖5所示。
(a) 線段與弧線不相交
(b) 線段與弧線相交
因篇幅有限,本文只列出線段與弧線相交時一榀錨桿布設生成的關鍵代碼,具體如下:
private void GetIntersection(Line line2, Arc arc2, FamilyInstance NewIn, Document doc, ModelCurve ml, Line axis1, double m2, Int32 qqq)
{
IntersectionResultArray results;
SetComparisonResult result = line2.Intersect(arc2,
out results);
if (SetComparisonResult.Disjoint != result)//相交
{
double o = 0;
SetComparisonResult result2 = 0;
do
{
ElementTransformUtils.RotateElement(doc, ml.Id, axis1, -o);
o = o + 0.001;
ElementTransformUtils.RotateElement(doc, ml.Id, axis1, o);
Curve c1 = ml.GeometryCurve;
XYZ end3 = c1.GetEndPoint(0);
XYZ end4 = c1.GetEndPoint(1);
Line line3 = Line.CreateBound(end3, end4);
IntersectionResultArray results1;
SetComparisonResult result1 =
line3.Intersect(arc2, out results1);
result2 = result1;
}while(SetComparisonResult.Disjoint!= result2);
//旋轉錨桿至弧線端點位置
ElementTransformUtils.RotateElement(doc, NewIn.Id, axis1, o - 0.001);
//圓弧形陣列
RadialArray.Create(doc, doc.ActiveView, NewIn.Id, qqq, axis1,-(m2 / (qqq - 1)), ArrayAnchorMember.Second);
//刪除輔助模型線
ICollection
}
}。
在實際工程中,相鄰2榀錨桿通常會呈梅花形布置。因此,在程序中需要復制這一榀錨桿并旋轉相應弧度,使2榀錨桿呈現(xiàn)交錯布置,并分別進行后續(xù)陣列操作。
直線形隧道的生成相對較為簡單,直接利用前面生成并復制的2榀錨桿分別進行線形陣列即可; 而圓弧形隧道的生成則是通過讀取平曲線相關信息并分別對每一榀錨桿進行相應的圓弧形陣列,其具體代碼思路與前文單榀錨桿的布設類似。錨桿生成效果如圖6所示。
圖6 錨桿生成效果
小導管與錨桿的設計參數創(chuàng)建與布置主要有3個方面不同: 1)小導管一般不會垂直打入隧道圍巖內部,通常具有一定的外插角[15]; 2)相鄰2榀小導管之間具有一定的搭接長度; 3)在同一標段內,可能會布置雙排小導管,2排小導管的長度、搭接長度和外插角等設計參數可能均不相同。小導管參數設定界面如圖7所示。其程序操作步驟與錨桿基本一致。
圖7 小導管參數設定界面
小導管生成的基本思路與錨桿(尤其是中空注漿錨桿)類似,生成流程如圖8所示。此外,小導管搭接長度的設定相對較簡單,利用線形陣列或圓弧形陣列即可實現(xiàn)。因此,此處主要針對另外2個方面進行說明。首先,外插角的設置是在體量族環(huán)境下進行的,主要應用了API中的ElementTransformUtils.RotateElement函數,該函數可以通過給定的軸線和角度對一個元素進行旋轉。
圖8 小導管生成流程
在小導管布置方面,本文利用Winform中的下拉菜單供用戶進行選擇。當用戶選擇“單排小導管”時,右側“第2排小導管”的有關參數設定將變?yōu)椴豢捎?;當用戶選擇“雙排小導管”時,右側的參數設定將變?yōu)榭捎?,如圖7所示,此時即可自動生成、布置雙排小導管類型。雙排小導管生成的立面效果和整體效果分別如圖9和圖10所示。
(a) 立面效果
(b) 設計立面效果
Fig. 9 Facade effect and design effect of double-row small conduit generation
圖10 雙排小導管生成的整體效果
在隧道初期支護中除了經常用到的型鋼鋼架之外,格柵鋼架也是隧道施工中常用的鋼支撐。格柵鋼架主要由若干鋼筋焊接而成。格柵鋼架主要分為2種類型,一種為V字型格柵鋼架,另一種為8字型格柵鋼架。本文主要針對8字型格柵鋼架的參數化創(chuàng)建與布置進行相應的研究。格柵鋼架通常由幾段鋼架拼接而成。為簡便起見,本文將鋼架看作一個整體,不考慮鋼架連接處的連接鋼板等細部構件。
格柵鋼架參數設定時需要考慮的參數較多。為了方便用戶清楚地了解到各參數代表的含義,特在參數設定界面附加了格柵鋼架的截面參數圖。此外,格柵鋼架主要由主筋、8字筋以及箍筋構成,所以也圍繞這幾種鋼筋的參數進行了相應的設定,具體的參數設定界面如圖11所示。格柵鋼架生成流程如圖12所示。
主筋及箍筋模型的創(chuàng)建相對較為簡單,與上文介紹的方法基本類似。8字筋模型的創(chuàng)建相對較為復雜,且規(guī)律性較差,對此本文做了相應簡化,使其更容易用數學函數所表達。本文采用的基本數學模型為伯努利雙紐線,并在三維空間進行了相應改進,改進后建立的8字筋模型基本符合實際工程,能夠滿足建模后精度的需要。伯努利雙紐線改進圖如圖13所示。
圖11 格柵鋼架參數設定界面
圖12 格柵鋼架生成流程
(a) xoy平面
(b) xoz平面
以單個8字筋(上半部分)為例,從圖13中可以看出,在xoy平面上其曲線依然為伯努利雙紐線,而在xoz平面上其曲線為z=±kx(z>0)。而在Revit二次開發(fā)中并沒有根據已知函數表達式直接生成曲線的API,所以需要通過微分來間接生成所需要的曲線。最終得出曲線上任意一點的坐標為:
(1)
由式(1)可以確定曲線上點的坐標,然后利用API中的NewCurveByPoints函數可以根據點集合生成所需要的8字筋曲線,進而通過NewSweptBlendForm函數生成單個8字筋模型,再利用MirrorElement函數進行鏡像即可生成單個水平網構架立筋或豎向網構架立筋; 然后,將其導入項目環(huán)境中,通過讀取模型線弧長及所輸入的8字筋長度與間距,計算各構架立筋所需陣列的數目,最后進行后續(xù)陣列操作即可。格柵鋼架生成效果如圖14所示。
圖14 格柵鋼架生成效果
BIM的基礎是模型,而它的靈魂則是信息,模型只是信息的載體。通過所研發(fā)的插件,可以快速創(chuàng)建隧道中的初期支護構件,針對這些構件同樣可以利用Revit進行模型信息附加,并且Revit的數據信息可以被很多其他軟件包括GIS平臺所解析利用。
在Revit中存在2種參數屬性: 類型參數與實例參數。為了實現(xiàn)工程設計、施工及運營的信息化管理,僅僅依靠Revit構件本身的類型屬性參數列表很難滿足實際管理需求,這時需要手動添加實例參數,錄入相應數據。實例參數可以被GIS平臺如SuperMap所解析,方便用戶后期利用這些數據。因此,可以利用“管理”菜單下的“項目參數”,添加相應的實例參數(如圖15所示),然后在模型的實例屬性欄中編輯相應的屬性信息。
以錨桿為例,根據需求添加默認沒有的實例參數,例如里程樁號、施工人員、施工時間、工程量等。錨桿實例參數信息添加界面如圖16所示。
圖15 實例參數添加界面
圖16 錨桿實例參數信息添加界面
某隧道為雙向6車道分離式隧道,設計時速為100 km,隧道左線軸線里程為 ZK11+886~ZK12+098,長212 m,全隧位于直線上;隧道右線軸線里程為K11+930~K12+123,長193 m,屬于短隧道。
隧道洞身采用復合式襯砌,曲墻帶仰拱的形式,按新奧法原理設計,初期支護采用噴錨網支護,必要時輔以鋼架加強,采用濕噴工藝; 二次襯砌采用混凝土或鋼筋混凝土結構。洞身襯砌支護參數如表1所示。
表1 洞身襯砌支護參數
依據表1并根據相應的圖紙獲得各構件的相應參數,利用Revit插件即可參數化生成小導管、錨桿以及鋼拱架等構件,手動輔助建立仰拱填充等模型,附加相應的實例屬性信息,并賦予材質與貼圖,隧道BIM最終效果如圖17所示。
(a) 局部效果
(b) 整體效果
1)通過對隧道初期支護構件(如錨桿、小導管、格柵鋼架)的特點進行分析,歸納出各構件建模所需要的參數,結合Revit API編制相應程序,實現(xiàn)各構件的參數化建模和自動布置。
2)利用Revit可以對參數化創(chuàng)建的模型進行信息附加,添加設計與施工過程中的相應信息,完成各構件BIM的創(chuàng)建。
3)與傳統(tǒng)的建模方式相比,本文所開發(fā)的插件不僅能夠對隧道構件的模型完成快速批量創(chuàng)建,還能對模型的位置實現(xiàn)自動設置,能明顯提高建模效率,避免相關人員做大量重復性工作,保證相關人員把更多精力放在BIM系統(tǒng)的功能及性能優(yōu)化方面,具有一定的使用價值。
本文所創(chuàng)建的插件是基于簡化的隧道斷面輪廓進行的,僅適用于對模型精度要求不高的情況。按照《建筑信息模型施工應用標準》,該插件可以滿足LOD200~300等級的精度要求。下一步研究中可繼續(xù)設計算法對多段隧道輪廓線進行處理,以實現(xiàn)更高精度的隧道模型參數化創(chuàng)建。由于目前Revit沒有提供對緩和曲線進行編輯的API,插件目前還不能實現(xiàn)緩和曲線段隧道的參數化建模,因此,可繼續(xù)對此進行進一步的研究與完善。另外,本文主要對錨桿、小導管以及格柵鋼架進行了研究,今后可繼續(xù)研究型鋼鋼架、襯砌等構件的參數化創(chuàng)建,并可進行適當整合。此外,BIM的核心理念是模型與信息,本文主要介紹了模型的創(chuàng)建,對于模型信息的附加也主要利用Revit通過手動進行。因此,后期也可對模型信息的自動附加以及模型命名規(guī)則等方面開展相應研究。