姚翔川, 鄭俊杰, 章榮軍, 賴漢江
(華中科技大學 土木工程與力學學院, 湖北 武漢 430074)
隨著經(jīng)濟和城市建設(shè)的快速發(fā)展,越來越多的工程項目要求工程設(shè)計具備可視化、3D模擬化和可出圖等特點,將信息技術(shù)應用于建設(shè)工程全生命期,通過網(wǎng)絡交換信息并且科學利用信息,從而避免形成信息孤島。
BIM(Building Information Modeling)技術(shù)通過構(gòu)建工程中各類構(gòu)件的3D模型,并賦予模型相應構(gòu)件的信息參數(shù),以智能3D模型模擬工程項目信息[1]。Autodesk Revit作為目前使用最為廣泛的BIM軟件,能較好地滿足現(xiàn)代工程設(shè)計要求,可提供各類構(gòu)件的大量信息參數(shù),同時滿足工程中所需的出圖要求和明細表要求等[2]。目前,基于Revit軟件的四維可視化軟件(如Navisworks)也較為成熟,能滿足工程項目階段化的可視化要求。因此,目前許多結(jié)構(gòu)分析軟件(如PKPM,YJK,Midas等),均開發(fā)出與Revit的數(shù)據(jù)轉(zhuǎn)換接口[3]。已有的基于Revit的數(shù)據(jù)轉(zhuǎn)換接口中,鄧原雪等[4]基于IFC(Industry Foundation Classes)文件建立了Revit模型與SAP2000模型的數(shù)據(jù)轉(zhuǎn)換;張劍濤等[5]對于IFC文件與PKPM軟件之間的轉(zhuǎn)換進行了討論。
目前,BIM技術(shù)已成為橋梁結(jié)構(gòu)設(shè)計的硬性要求之一,并在越來越多的橋梁結(jié)構(gòu)工程設(shè)計中得到應用。然而,在巖土工程領(lǐng)域,至今還停留在傳統(tǒng)的CAD圖紙階段,將BIM技術(shù)與巖土工程相結(jié)合的案例鮮有報道。但是,將BIM建模與巖土工程計算分析相結(jié)合,實現(xiàn)工程施工可視化實景建模與工程計算一體化,以保障重大基礎(chǔ)設(shè)施工程的施工安全,這將是土木工程學科未來的發(fā)展趨勢。
現(xiàn)有與Revit有較為成熟的數(shù)據(jù)轉(zhuǎn)化接口的軟件,普遍都是結(jié)構(gòu)分析軟件,也多采用IFC標準進行信息交換。巖土工程中運用較多的分析軟件ANSYS與Revit擁有不同的文件類型,不能直接進行數(shù)據(jù)交換。同時,現(xiàn)有的Revit建模所包含的材料參數(shù)中沒有巖土材料中常見參數(shù),這些差異使得在針對巖土材料進行在建立建筑信息模型和分析計算之間產(chǎn)生了障礙,巖土材料的受力變形特性分析也受到限制。
現(xiàn)有的ANSYS與Revit的接口非常有限,部分轉(zhuǎn)換程序是以IFC文件作為中間橋梁來實現(xiàn)[6],這種方法存在較多冗余信息,并且在賦予材料參數(shù)時較為困難,每次錄入模型需要進行修改,適用性較差。同時,Revit中提供的Revit API(Application Programming Interface)能夠?qū)崿F(xiàn)對Revit功能的自定義,可根據(jù)不同需求對Revit功能進行拓展和補充,并推出了相應的二次開發(fā)教程[7]。方海龍等[8]采用Revit API編寫插件,從而將Revit中各類信息轉(zhuǎn)化為ANSYS可讀的命令流,以此實現(xiàn)Revit和ANSYS之間的轉(zhuǎn)換。需要說明的是,方海龍等所采用的Revit版本較為原始,開發(fā)環(huán)境為Microsoft Visual Studio 2012以及Microsoft. NEF Framework 4.5。然而,最新的Revit版本已經(jīng)不再支持Visual Studio 2012,并且在二次開發(fā)教程中的程序也有許多命令流被替換,不能用于最新的Revit二次開發(fā)。同時,現(xiàn)有的Revit與ANSYS二次開發(fā)的接口只能滿足長方體之間的轉(zhuǎn)換[9],其方法是遍歷內(nèi)置構(gòu)件角點坐標,利用它們的相互關(guān)系進行排序,并根據(jù)角點坐標進行長方體構(gòu)件的重組。由于該方法是根據(jù)構(gòu)件“左下-右上”對角點空間坐標并且利用其角點坐標進行切分,切分結(jié)束后獲得一系列幾何形狀簡單的立方塊,對于各種復雜和異形的結(jié)構(gòu)不能進行有效的轉(zhuǎn)換。同時,現(xiàn)有的二次開發(fā)的接口中,所需要的材質(zhì)信息(包括密度、泊松比、孔隙率等)均從材質(zhì)庫中獲取[10],盡管這些數(shù)據(jù)也是ANSYS建模時的必要信息,但材質(zhì)庫中有許多冗余信息(如填充圖案,外觀顏色等)在ANSYS建模中并不需要;同時,在材質(zhì)庫中缺少巖土材料所需的一些常見參數(shù)(如土的黏聚力與內(nèi)摩擦角等),因此有很多參數(shù)需要設(shè)計人員自己定義并賦值。
在采用ANSYS軟件對巖土工程模型進行計算時,因土體參數(shù)的非線性容易出現(xiàn)計算不收斂等問題。因此,許多研究人員都采用ANSYS軟件,對復雜的工程地質(zhì)體進行建模并劃分網(wǎng)格后,通過數(shù)據(jù)轉(zhuǎn)化的方法將其導入FLAC3D中進行計算分析。利用ANSYS建模并劃分網(wǎng)格,再通過FLAC3D進行模擬分析已成為了巖土工程數(shù)值模擬的常態(tài)。
基于上述缺陷,本文提出了一種對于復雜和異形構(gòu)件的模型轉(zhuǎn)換方法,通過自下而上的方法從點、線、面、體逐步生成復雜模型。該方法能夠有效地將Revit中較為復雜的結(jié)構(gòu)模型轉(zhuǎn)換為可在ANSYS中分析計算的模型,并且能獲取設(shè)計人員在Revit中自定義的材料參數(shù),再通過FLAC3D進行計算分析。最后,基于一個工程實例,對本文所提出的模型轉(zhuǎn)換程序的可行性進行了驗證。
本文中二次開發(fā)采用C#語言,便于在Microsoft Virsual Studio中進行實時調(diào)試。由于近幾年推出的Revit中無法使用Microsoft Visual Studio 2012作為開發(fā)環(huán)境,許多二次開發(fā)教程和論文中的程序均已被淘汰。因此,本文采用較新的Revit 2015作為二次開發(fā)主體,開發(fā)環(huán)境為Microsoft Visual Studio 2015,目標框架為Microsoft.NET Framework 4.5.2。
Revit二次開發(fā)流程如圖1所示。首先,對當前視圖中所有實例進行遍歷,對不同實例進行分類和編號;然后,獲取每個實例的幾何信息和類型屬性,其中可以包括設(shè)計人員自定義的一些參數(shù)和注釋說明,并根據(jù)平面的不同獲取該平面上的角點,根據(jù)角點構(gòu)成平面,再將所有平面拼接形成實體;最后,將構(gòu)造的實體和類型屬性結(jié)合形成具有完整信息的實例,并按ANSYS APDL語言格式生成TXT文件輸出。
圖1 接口程序流程
(1)在Visual Studio 2015中創(chuàng)建類庫工程,并添加引用Revit API.dll,Revit APIUI.dll,System. Windows.Forms,設(shè)置Copy Local的屬性為False。
(2)對命名空間進行引用,主要是對Autodesk.Revit的相關(guān)命名空間進行引用,使得二次開發(fā)擁有不同的功能,一般二次開發(fā)會添加以下幾種命名空間:
using Autodesk.Revit.UI;using Autodesk.Revit.DB;using System.Windows.Forms;using Autodesk.Revit.UI.Selection;using Autodesk.Revit.ApplicationServices;……。
(3)在Revit 2011之后的版本中控制命令模式只支持一種模式,即手動模式。因此,在進行編輯二次開發(fā)的主要命令之前要確定相應的命令屬性代碼,如:[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
[Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
(4)遍歷當前視圖中所有族實例和改族實例下包含的類型參數(shù),包括系統(tǒng)族和自建族。
foreach (GeometryObject geomobj in geomElement)
{
GeometryInstance geomInstance = geomobj as GeometryInstance;
Transform instTransform = geomInstance.Transform;
}
foreach (Parameter item in familySymbolParameterList)
{
FilteredElementCollector collectorFamily = new FilteredElementCollector(doc);
collectorFamily.OfClass(typeof(FamilyInstance));
}
(5)遍歷當前非空族實例每個平面,并獲取平面上的角點坐標。
if (item.Definition.Name == "說明" && item.AsString()!=null)
{
foreach (GeometryObject instobj in geomInstance.SymbolGeometry)
{
Solid solid = instobj as Solid;
if (solid == null || solid.Faces.Size == 0 || solid.Edges.Size == 0)
{
continue;
}}
//遍歷實體上每個面
foreach (Face face in solid.Faces)
{
int i0 = i;
Mesh mesh = face.Triangulate();
//獲得每個面上點的坐標
foreach (XYZ ii in mesh.Vertices)
{
XYZ point = ii;
XYZ transformedPoint = instTransform.OfPoint(point);
if (transformedPoint.ToString() != null)
{
sb.Append("k,");
sb.Append(i + ",");
sb.Append(transformedPoint.X.ToString() + ",");
sb.Append(transformedPoint.Y.ToString() + ",");
sb.Append(transformedPoint.Z.ToString());
i++;
sb.Append(" ");
continue;
}}}
(6)將上述得到的角點連接成基礎(chǔ)面,將實體所有的面組合成體,并消除重疊點。
//將上面得到的點連接起來,形成基礎(chǔ)的面。
sb.Append("A,");
for (int a = i0; a < i; a++)
{
sb.Append(a + ",");
}
m++;
sb.Append(" ");
}
//消除重疊關(guān)鍵點,并將面組合成體
sb.Append("nummrg,kp");
sb.Append(" ");
sb.Append("va,");
for (int a = m0; a < m; a++)
{
sb.Append(a + ",");
}
(7)對上述得到的體賦予其對應的材料參數(shù),包括用戶自定義的材料參數(shù)。
foreach (Parameter item2 in familySymbolParameterList)
{
if (item2.Definition.Name == "黏聚力")
{
sb.Append("tbdata,1," + item2.AsValueString() + item2.AsString() + ",,");
sb.Append(" ");
}
if (item2.Definition.Name == "內(nèi)摩擦角")
{
sb.Append("tbdata,1,," + item2.AsValueString() + item2.AsString() + ",");
sb.Append(" ");
}
if (item2.Definition.Name == "膨脹角")
{
sb.Append("tbdata,1,,,"+item2.AsValueString() + item2.AsString());
sb.Append(" ");}}
根據(jù)以上程序在Visual Studio中進行編譯,并在Revit的附加模塊外部工具中調(diào)用生成的dll程序,以生成ANSYS可讀的命令流形式,如圖2所示。
圖2 自動生成的ANSYS命令流
圖3為Revit到ANSYS轉(zhuǎn)換過程的實例演示。首先,如圖3a所示,在Revit中建立一個基坑模型,模型中包括水泥土樁、地連墻與鋼支撐,以及后期需要開挖的土體等。其中,土體材料參數(shù)部分添加了原Revit中所沒有的黏聚力和內(nèi)摩擦角等參數(shù)(如圖3b所示),以滿足后續(xù)ANSYS計算。然后,將該模型導入至ANSYS中,并根據(jù)不同的材料分組(如圖3c所示)。在模型導入時,可根據(jù)設(shè)計人員的不同需求選取其中部分構(gòu)件進行建模,從而簡化模型,降低分析計算難度并減少建模時間。同時,考慮到后續(xù)要對Revit模型進行開挖模擬,圖3中所建的ANSYS模型為施工前土體模型,而未構(gòu)建水泥土樁、地連墻與鋼支撐等模型。
圖3 Revit模型導入ANSYS效果
圖4是基坑模型在ANSYS中經(jīng)過切分后的效果展示。由于存在不規(guī)則實體,因此部分采用四面體進行自動切割,而規(guī)則部分采用塊體切割,所有網(wǎng)格連續(xù)且相互關(guān)聯(lián)。
圖4 網(wǎng)格劃分細部展示效果
在利用Revit建立ANSYS模型后,將其導入FLAC3D中進行分析計算。圖5是在FLAC3D中數(shù)值模型在重力作用下的應力云圖。從圖中可以看出,在重力作用下,數(shù)值模型的應力場沿深度方向的變化是連續(xù)的,與實際情況相符。
圖5 基坑開挖前應力云圖
圖6為開挖支護后的應力云圖。圖中顯示,模型在開挖支護后的應力場合理連續(xù),證明了根據(jù)Revit模型生成的命令流可以模擬施工過程,并可導入其他計算軟件進一步操作,將Revit的建筑信息模型、ANSYS的建模劃分網(wǎng)格與FLAC3D的強大分析計算功能結(jié)合起來。
圖6 基坑開挖支護后應力云圖
圖7為開挖后地表沉降與實際工程監(jiān)測數(shù)據(jù)的對比分析,可以看出數(shù)值模擬數(shù)據(jù)與實測數(shù)據(jù)擬合較好,反映了計算模型的合理性,也證明了接口程序的正確性。
圖7 基坑開挖支護后地表沉降與實測數(shù)據(jù)對比
本文通過Revit API接口技術(shù),運用C#語言讀取復雜的Revit實體模型并在ANSYS中生成,并成功分析計算,實現(xiàn)了Revit模型到ANSYS模型的全自動轉(zhuǎn)換,對接口程序的思路及算法都進行了詳細的闡述。
算例證明了在模型轉(zhuǎn)換過程當中切分和轉(zhuǎn)換的正確性,能將實體的細節(jié)特征表現(xiàn)完整。該程序可以允許設(shè)計人員自定義參數(shù)并用于ANSYS建模中,同時可以選取部分結(jié)構(gòu)進行建模,簡化計算難度,提高分析效率。該模型還可以導入FLAC3D等分析計算軟件進行進一步的模擬計算。
本文的工作只是對Revit與ANSYS對接的初步嘗試,還有許多方面值得深入研究。本文所建立的Revit到ANSYS的模型轉(zhuǎn)換只針對棱柱棱錐等只含有平面的實體,對含有曲面的建模還需要進一步研究;同時,ANSYS的計算結(jié)果也暫時無法直接反饋到Revit結(jié)構(gòu)模型中進行同步修改。