程 浩,李 志,陳 俊,田龍強(qiáng)
(中國(guó)電力工程顧問(wèn)集團(tuán)中南電力設(shè)計(jì)院有限公司,湖北 武漢 430071)
當(dāng)前,工程設(shè)計(jì)正快速?gòu)膫鹘y(tǒng)的二維設(shè)計(jì)向三維設(shè)計(jì)邁進(jìn),隨著建筑信息模型(building information modeling,BIM)技術(shù)的普及,一些傳統(tǒng)的設(shè)計(jì)方法也在不斷地被新的信息化技術(shù)所替代。
巖土工程勘察報(bào)告是各類工程結(jié)構(gòu)專業(yè)設(shè)計(jì)的重要輸入條件和設(shè)計(jì)依據(jù),設(shè)計(jì)專業(yè)需要從中獲取地表高程、各地層厚度及分布、巖土物理力學(xué)指標(biāo)等信息。采用傳統(tǒng)方式從鉆孔剖面圖、地質(zhì)剖面圖以及勘察報(bào)告中獲取以上信息的過(guò)程較為繁瑣,效率低且容易出現(xiàn)差錯(cuò)。目前,國(guó)內(nèi)外諸多科研機(jī)構(gòu)和工程勘察企業(yè)已經(jīng)能夠借助BIM技術(shù)建立三維地質(zhì)模型并應(yīng)用于工程[1-4],由于其采用了特定的算法,理論上準(zhǔn)確性將優(yōu)于傳統(tǒng)方法。但是,由于業(yè)務(wù)劃分及技術(shù)層面的原因,建立三維地質(zhì)模型所采用的平臺(tái)(如CATIA、ItasCAD等)往往與設(shè)計(jì)平臺(tái)不同,使接收地質(zhì)勘察資料的下游設(shè)計(jì)專業(yè)難以直接利用三維地質(zhì)模型及相關(guān)數(shù)據(jù),專業(yè)間數(shù)字化的信息傳遞方式中斷,三維設(shè)計(jì)的優(yōu)勢(shì)無(wú)法進(jìn)一步得到發(fā)揮。
Revit具有開(kāi)放的應(yīng)用程序編程接口(application programming interface,API),便于進(jìn)行二次開(kāi)發(fā),具有良好的擴(kuò)展性,因而被廣大設(shè)計(jì)企業(yè)用作三維設(shè)計(jì)的基礎(chǔ)平臺(tái)。由于三維地質(zhì)模型在巖土工程專業(yè)軟件中建立,其文件或數(shù)據(jù)格式并不能完全被Revit軟件識(shí)別,因而難以直接被下游專業(yè)使用,協(xié)同設(shè)計(jì)的目標(biāo)受阻,此時(shí)只能考慮開(kāi)發(fā)相關(guān)的程序以實(shí)現(xiàn)地層信息的讀取。饒嘉誼[5]等通過(guò)在Revit軟件中編寫(xiě)插件,讀取勘察報(bào)告的鉆孔數(shù)據(jù),以插值的方式生成三維地質(zhì)模型。范光龍[6]等設(shè)計(jì)了相關(guān)地質(zhì)模型創(chuàng)建程序,應(yīng)用Dynamo創(chuàng)建地形地質(zhì)實(shí)體模型并將其置入Revit。以上兩種方式均通過(guò)勘察專業(yè)提供的鉆孔資料在Revit軟件中實(shí)現(xiàn)了三維地質(zhì)模型的創(chuàng)建,但相對(duì)于專業(yè)的地質(zhì)建模軟件,其地層模擬算法的準(zhǔn)確性有待考量。陳國(guó)良[7]等通過(guò)工業(yè)基礎(chǔ)類(industry foundation classes,IFC)實(shí)體擴(kuò)展及屬性集擴(kuò)展模式,建立了面向三維地質(zhì)模型的擴(kuò)展模型,實(shí)現(xiàn)了IFC文件中的地層信息與地質(zhì)屬性的擴(kuò)展和集成,但該方法需要針對(duì)不同的地質(zhì)建模軟件開(kāi)發(fā)數(shù)據(jù)轉(zhuǎn)換插件,在接收IFC地質(zhì)資料的軟件端也需要安裝相應(yīng)的插件解析數(shù)據(jù),從而保證地質(zhì)模型的正確轉(zhuǎn)換和解析,因此其適用性存在一定的限制。本文將從地質(zhì)資料接收專業(yè)的角度出發(fā),探討一種基于Revit進(jìn)行二次開(kāi)發(fā)以讀取地質(zhì)信息的具體實(shí)現(xiàn)方法。
IFC標(biāo)準(zhǔn)是由國(guó)際協(xié)同工作聯(lián)盟(International Alliance for Interoperability,IAI)為建筑行業(yè)發(fā)布的建筑產(chǎn)品數(shù)據(jù)表達(dá)標(biāo)準(zhǔn),用于在不同的軟件平臺(tái)之間共享工程數(shù)據(jù),在全球已得到廣泛應(yīng)用。目前較多三維地質(zhì)建模軟件以及包含Revit在內(nèi)的多數(shù)三維設(shè)計(jì)軟件對(duì)IFC格式的文件具有較好的支持,因此可借助IFC文件實(shí)現(xiàn)地質(zhì)信息的傳遞。
Revit雖然能夠打開(kāi)IFC格式的地層模型文件,但在未經(jīng)特殊處理的情況下,從三維地質(zhì)建模軟件中導(dǎo)出的地層模型一般不包含工程地質(zhì)屬性信息,僅保留地層的幾何模型及地層編號(hào)或名稱等標(biāo)識(shí),因此只能用來(lái)模擬各地層的分界面,而工程地質(zhì)屬性信息則需要采用其它方式傳遞。鑒于接收地質(zhì)資料的專業(yè)一般對(duì)地質(zhì)信息的需求并不復(fù)雜,將地形模型和地質(zhì)信息分開(kāi)傳遞再進(jìn)行關(guān)聯(lián)輸出也是一種簡(jiǎn)便可行的方式。工程地質(zhì)屬性與地層標(biāo)識(shí)具有一一對(duì)應(yīng)關(guān)系,可將各地層的地質(zhì)屬性信息導(dǎo)出為格式化的數(shù)據(jù)或制作成數(shù)據(jù)表,則從IFC地層幾何模型中僅需要獲取給定位置處地層的幾何信息及其標(biāo)識(shí),然后再與對(duì)應(yīng)地層的工程地質(zhì)屬性關(guān)聯(lián),即可得到給定位置處完整的地質(zhì)信息,整體實(shí)現(xiàn)過(guò)程如圖1所示。
圖1 三維地質(zhì)模型信息的轉(zhuǎn)換與傳遞過(guò)程
各三維地質(zhì)建模平臺(tái)采用的數(shù)據(jù)結(jié)構(gòu)和地質(zhì)模擬算法一般不同,其導(dǎo)出的IFC文件的數(shù)據(jù)結(jié)構(gòu)也不相同,地層模型可能被處理為地層分界面,也可能被處理為實(shí)體,但通過(guò)Revit解析之后,最終都將表現(xiàn)為幾何基元類[8]或其組合,如Face、Edge、Mesh或Solid等,它們的幾何信息都可以通過(guò)Revit API提供的相關(guān)屬性或方法來(lái)獲取,區(qū)別在于相關(guān)元素的查找和判斷的過(guò)程有所不同。鑒于三維地質(zhì)建模軟件眾多,本文以ItasCAD軟件導(dǎo)出的模型為例介紹具體讀取方法,對(duì)于其它軟件導(dǎo)出的地層模型,可參考本文方法,根據(jù)具體情況編寫(xiě)讀取地層幾何模型的代碼。
圖2為從ItasCAD軟件導(dǎo)出的IFC格式的三維地層模型,地表及每個(gè)地層的底面被處理為多個(gè)三角網(wǎng)格(Mesh)組成的曲面,曲面之間為空,沒(méi)有填充表示土體的實(shí)體模型。各層的地形曲面在Revit中的族類型為“場(chǎng)地”。
圖2 IFC格式的三角化網(wǎng)格三維地層模型
如圖3所示,由于各地層的底面為網(wǎng)格化的曲面,對(duì)于勘察區(qū)域平面內(nèi)的給定點(diǎn),其在各層三角網(wǎng)格面上投影點(diǎn)之間的區(qū)域即為該點(diǎn)處各地層的分布范圍,投影點(diǎn)的標(biāo)高即為地層底面標(biāo)高,各地層的厚度即為相鄰?fù)队包c(diǎn)標(biāo)高的差值。地層屬性信息在地質(zhì)模型文件外部通過(guò)數(shù)據(jù)表保存,通過(guò)地層標(biāo)識(shí)即可進(jìn)行查詢。程序可以分為以下過(guò)程來(lái)實(shí)現(xiàn):
圖3 地層的地形網(wǎng)格曲面及投影點(diǎn)
1)打開(kāi)地質(zhì)模型文件,獲取地層網(wǎng)格曲面元素;
2)求解投影點(diǎn)坐標(biāo),獲取地層分布;
3)查詢并關(guān)聯(lián)地層屬性信息。
以下將分別討論具體的實(shí)現(xiàn)方法。
若要獲取各三維網(wǎng)格的幾何信息,必須先獲取模型中所有的三維網(wǎng)格曲面元素。
對(duì)IFC文件的讀寫(xiě)操作需要在IExternalCommand接口的Execute方法中實(shí)現(xiàn)。打開(kāi)IFC地質(zhì)模型文件可采用Application.OpenIFCDocument方法,也可先將*.ifc文件另存為*.rvt文件,再采用Application.OpenDocumentFile方法打開(kāi),后者打開(kāi)文件的速度更快。以上兩種方法僅將模型文件加載到了內(nèi)存當(dāng)中,而并未在Revit的用戶界面中顯示。
對(duì)打開(kāi)的文件應(yīng)用過(guò)濾器,以獲取各地層三維網(wǎng)格曲面的實(shí)例:
此處的過(guò)濾器使用了Revit內(nèi)建族類別BuiltInCategory.OST_Site作為參數(shù),對(duì)于不同三維地質(zhì)軟件,其導(dǎo)出的地層模型族類別可能不同,可在Revit中查看地層網(wǎng)格曲面所屬具體的類別之后,再確定過(guò)濾方式。
如圖3所示,在IFC地層模型文件中,每個(gè)地層曲面被劃分為多個(gè)三角網(wǎng)格,求解曲面上投影點(diǎn)的過(guò)程即轉(zhuǎn)化為求解三角網(wǎng)格所在平面上的投影點(diǎn)的過(guò)程,因此需要先獲取投影點(diǎn)所在的三角網(wǎng)格。
Revit API提供了MeshTriangle.get_Vertex方法獲取三角網(wǎng)格在局部坐標(biāo)系下的角點(diǎn),可通過(guò)坐標(biāo)變換之后獲取其在世界坐標(biāo)系中的坐標(biāo)。在xoy平面,對(duì)于任一三角形網(wǎng)格,當(dāng)給定點(diǎn)的坐標(biāo)在其所有角點(diǎn)坐標(biāo)的最大值與最小值所形成的區(qū)間之外時(shí),給定點(diǎn)的投影明顯在該網(wǎng)格之外,可快速排除;反之則需進(jìn)行精確判斷,可以采用如下方法:
判斷給定點(diǎn)和三角網(wǎng)格在xoy平面中投影的相對(duì)關(guān)系,設(shè)有與三角形網(wǎng)格三邊同法線的三個(gè)向量,其方向形成閉合面(即向量相互首尾相連),當(dāng)給定點(diǎn)均在三個(gè)向量的同一側(cè)時(shí),則可判定該點(diǎn)在三角形內(nèi)。
對(duì)于向量p、q有如下性質(zhì):
若p×q>0,則p在q的順時(shí)針?lè)较颉?/p>
若p×q<0,則p在q的逆時(shí)針?lè)较颉?/p>
若p×q= 0 ,則p與q共線。
則對(duì)于給定點(diǎn)以及三角網(wǎng)格的三個(gè)頂點(diǎn),可按以上方法判斷其位置關(guān)系,從而獲取投影點(diǎn)所在的三角網(wǎng)格。
本過(guò)程主要實(shí)現(xiàn)代碼如下:
由于需要獲取給定點(diǎn)處所有的地層信息,此處首先對(duì)模型中所有的地層族實(shí)例進(jìn)行遍歷,依次在每個(gè)地層曲面中進(jìn)行查找和判斷。
如圖4所示,在一個(gè)地層模型文件中,同一個(gè)族的不同族類型,其名稱(Name屬性)具有唯一性,因此根據(jù)地形曲面元素所屬的族及其Name屬性即可確定其所對(duì)應(yīng)的地層名稱。地層元素的Name屬性一般對(duì)應(yīng)于巖土工程勘察報(bào)告中的地層編號(hào),在此種情況下無(wú)需再根據(jù)地層元素所屬的族進(jìn)行區(qū)分。在本例中,不同的地層被導(dǎo)出為不同的族,且各族僅有唯一的族類型,因此可直接將地層元素的Name屬性作為各地層的標(biāo)識(shí)。
圖4 地形曲面族實(shí)例及其屬性
判斷給定點(diǎn)的投影是否在三角網(wǎng)格投影范圍內(nèi)的過(guò)程主要是向量的構(gòu)造及計(jì)算,在獲取三角網(wǎng)格的角點(diǎn)坐標(biāo)之后,此過(guò)程相對(duì)簡(jiǎn)單,上述代碼從略。
以上過(guò)程中需注意以下問(wèn)題:
1)單位換算。從Revit API中獲取的三角網(wǎng)格角點(diǎn)坐標(biāo)等的單位為英尺,而國(guó)內(nèi)在工程中通常使用公制單位,因此需先統(tǒng)一單位之后再進(jìn)行判斷。
2)從地層族實(shí)例中獲取三角網(wǎng)格面的過(guò)程。通過(guò)FamilyInstance的get_Geometry方法可從地層族實(shí)例中獲取其包含的GeometryElement,其中可能包含多個(gè)GeometryElement或GeometryObject。而在其中的GeometryElement中,可能存在更深層次的包含關(guān)系,需要多次使用SymbolGeometry屬性獲取更深層的GeometryElement,直至獲取三角網(wǎng)格面Mesh(繼承于GeometryObject)。上述示例代碼僅作參考,實(shí)際需根據(jù)地層模型的構(gòu)成關(guān)系進(jìn)行對(duì)應(yīng)的查找和判斷操作。
對(duì)于族實(shí)例的內(nèi)部組成和嵌套關(guān)系不明確的情況,可提前在Revit中打開(kāi)地層模型文件,使用其它輔助工具(如Revit Lookup等)進(jìn)行查看,能夠比較清晰地了解地層族實(shí)例的內(nèi)部組成關(guān)系,在編寫(xiě)代碼時(shí)將更有針對(duì)性,提高效率。
從地層族實(shí)例中獲取三角網(wǎng)格面,除采用上述方法之外,也可在調(diào)用get_Geometry方法之后,直接使用獲取到的GeometryElement調(diào)用GetInstanceGeometry方法,無(wú)需通過(guò)逐層查找,即可較快速地獲取三角網(wǎng)格面Mesh。
3)三角網(wǎng)格面的坐標(biāo)變換。通過(guò)GeometryInstance.GetSymbolGeometry方法以及GeometryElement.SymbolGeometry屬性所獲取的三角網(wǎng)格面使用的是局部坐標(biāo)系,需要通過(guò)坐標(biāo)變換才能得到在模型坐標(biāo)系下的表達(dá)。坐標(biāo)轉(zhuǎn)換矩陣可通過(guò)GeometryElement.Transform屬性獲取,使用Transform.OfPoint方法可將轉(zhuǎn)換矩陣應(yīng)用于傳入的點(diǎn),獲取轉(zhuǎn)換后的坐標(biāo)。通過(guò)GeometryInstance.GetInstanceGeometry方法所獲取的三角網(wǎng)格面則直接是在模型坐標(biāo)系下的表達(dá),無(wú)需再進(jìn)行坐標(biāo)變換。根據(jù)Revit API的說(shuō)明,此方法在執(zhí)行過(guò)程中涉及較大量的計(jì)算操作,可能會(huì)影響程序的執(zhí)行效率。
在獲取投影點(diǎn)的所在的三角網(wǎng)格之后,即可根據(jù)直線與平面的空間幾何關(guān)系求解投影點(diǎn)的坐標(biāo)。以上過(guò)程均為向量運(yùn)算過(guò)程,不再列出。
除地表之外,對(duì)于每個(gè)地形曲面,求解到的投影點(diǎn)與其上一層投影點(diǎn)Z坐標(biāo)之差即為該層的厚度,此曲面的Name屬性即為當(dāng)前地層的名稱,依次獲取各層的厚度之后即可得出該點(diǎn)處地層的分布情況。
物理力學(xué)指標(biāo)等工程地質(zhì)屬性信息是地質(zhì)勘察報(bào)告中的重要內(nèi)容,也是設(shè)計(jì)專業(yè)在工程設(shè)計(jì)過(guò)程中的重要輸入條件之一。前述過(guò)程實(shí)現(xiàn)了從IFC地層模型文件中獲取給定點(diǎn)處的地層分布情況,但各地層的工程地質(zhì)信息尚需從IFC文件外部獲取。
各地層的工程地質(zhì)屬性數(shù)據(jù)可保存為表1所列的數(shù)據(jù)表,其中各地層的標(biāo)識(shí)需與地層幾何模型中的標(biāo)識(shí)保持一致,以建立關(guān)聯(lián),便于查詢。表中的字段可根據(jù)工程需要進(jìn)行設(shè)置,各字段的單位可另行設(shè)計(jì)其它數(shù)據(jù)表進(jìn)行保存或在程序中統(tǒng)一約定。則當(dāng)給定勘察區(qū)域任一點(diǎn)坐標(biāo)時(shí),即可通過(guò)地層幾何模型獲取該位置處的地層分布,根據(jù)地層標(biāo)識(shí)查詢地層的工程地質(zhì)屬性信息,達(dá)到地質(zhì)信息讀取的目的。
表1 工程地質(zhì)屬性數(shù)據(jù)表示例
在完成以上功能之后,既可以將本程序封裝成為動(dòng)態(tài)鏈接庫(kù)文件(*.dll),供其它程序調(diào)用,也可開(kāi)發(fā)成為查詢工具,直接將獲取到的數(shù)據(jù)進(jìn)行輸出。
采用本文所介紹的方法,某設(shè)計(jì)軟件在Revit中開(kāi)發(fā)了地層查詢工具,并添加相關(guān)菜單項(xiàng),如圖5所示。
圖5 軟件菜單
在設(shè)計(jì)前,巖土專業(yè)按照三維設(shè)計(jì)的要求,在提供勘察報(bào)告的同時(shí),還提供了三維地質(zhì)模型及地層屬性表,結(jié)構(gòu)專業(yè)接收之后,可以使用地層查詢工具在Revit中選擇任意位置進(jìn)行查詢,程序可以直接輸出該點(diǎn)處的地層分布情況。在總平面布置圖中選擇任意一點(diǎn)查詢,程序輸出結(jié)果如圖6所示,查閱與其對(duì)應(yīng)的二維地質(zhì)剖面圖如圖7所示,對(duì)比可見(jiàn)二者比較接近。在勘探點(diǎn)平面布置圖中分別從鉆孔、剖面線以及剖面以外的位置各任選3個(gè)點(diǎn)作為樣本進(jìn)行查詢,以人工從二維地質(zhì)剖面圖中查詢所得的結(jié)果為基準(zhǔn),程序查詢結(jié)果的差值見(jiàn)表2所列。考慮到地質(zhì)剖面圖的繪制誤差、人工查詢過(guò)程中的誤差以及地層分布本身的不確定性等眾多因素,對(duì)于工程設(shè)計(jì)而言,該結(jié)果在可以接受的范圍以內(nèi)。在實(shí)際工程應(yīng)用中,該功能可減輕結(jié)構(gòu)專業(yè)在基礎(chǔ)設(shè)計(jì)工作中地質(zhì)信息查詢的工作量。
圖6 結(jié)果輸出示例
表2 程序查詢結(jié)果與剖面圖查詢誤差對(duì)比
圖7 地質(zhì)剖面圖(單位:m)
本文提出了一種通過(guò)三維地質(zhì)模型讀取地質(zhì)信息的方法,基于Revit進(jìn)行二次開(kāi)發(fā),以ItasCAD軟件導(dǎo)出的三維地質(zhì)模型文件為例,從地層模型及地層數(shù)據(jù)文件中讀取信息,從而快速獲取勘察區(qū)域內(nèi)任意位置處的地層分布情況,初步實(shí)現(xiàn)了地質(zhì)勘察與工程設(shè)計(jì)專業(yè)間的數(shù)據(jù)貫通,可減少設(shè)計(jì)專業(yè)查詢地質(zhì)信息的工作量,提高工作效率。
限于作者自身水平和當(dāng)前三維設(shè)計(jì)技術(shù)發(fā)展現(xiàn)狀,本文介紹的方法雖然實(shí)現(xiàn)了地層信息的讀取,但仍存在以下問(wèn)題需要深入研究:
1)對(duì)于地下水或溶洞等復(fù)雜的地質(zhì)情況,缺少相應(yīng)的處理和讀取方式。
2)本文偏重地質(zhì)信息讀取過(guò)程,可在此基礎(chǔ)上向?qū)嶋H應(yīng)用方面延伸:在結(jié)果的查詢方式上可添加其它查詢方法;在最終結(jié)果的表現(xiàn)方式上,可引入圖形化的表達(dá)方式,如輸出剖面圖等,將更為直觀易用。
3)從結(jié)果上看,三維查詢方式與傳統(tǒng)二維剖面圖存在一定的誤差,尤其是在距離鉆孔和剖面線較遠(yuǎn)的地方差別較大,雖不能簡(jiǎn)單地判定其中某一種方式的準(zhǔn)確性,但欲使三維查詢方式更加容易被接受,仍需采取一定的措施減小二者的差異。