馬 遙
(廣東賽達交通科技股份有限公司,廣東 廣州 510000)
BIM(Building Information Modeling)的概念在建筑結構設計及施工領域已深入人心。Autodesk Revit(以下簡稱Revit)是目前國內在設計及施工領域方面應用最廣泛的一款BIM建模軟件。建立參數化的模型是Revit的核心;當通過Revit創建好一個模型之后,與該模型相對應的各類型圖紙(平、立、剖)及構件明細表隨之產生。也就是說對于一個已建好的參數化模型,與其相關聯的所有圖紙、視圖及明細表都是基于同一個模型數據庫的數據外在表現形式。當模型某元素發生改變時,在Revit項目中該元素關聯的其他元素將會隨之發生同步變化,這是BIM相對于傳統設計方法的主要優勢之一,每個數據元素均具有關聯性。同時隨著BIM技術的不斷完善和發展,在正向設計領域中的應用越來越廣,特別是對 Dynamo技術的應用,表現的尤為突出。
另外,BIM技術不同于傳統設計方法的另一特征是對于Revit已建好的模型,可根據項目實際要求添加關于模型及其構件的各種信息,包括但不限于模型構件的材料供應方、加工方、施工方、驗收方、監理方、材質的外觀、材質的物理力學屬性(密度、彈性模量、壓縮模量、泊松比等)等信息。對于已建好的Revit模型,不僅可以實現整體及不同類型構件工程量的統計輸出外,而且還可以將該模型成果文件用于力學分析、綠色節能分析、模擬光照分析、實景漫游等。Revit在建筑行業的應用已經擁有眾多優異的表現,與建模相關聯的功能模塊也主要是和建筑結構相關。與市政工程諸如道路、橋梁、隧道相關的功能模塊則少之又少,直接使用Revit來創建形態結構復雜的橋梁、隧道(特別是盾構及其管片配筋)是非常困難的。
為解決Revit在創建復雜形態模型時的缺陷,本文以Revit內置插件Dynamo作為程序主要開發工具,結合Revit,Civil3D,Excel開發了T梁橋主體結構、下部結構及橋面系布置程序。數據獲取及分類處理如圖1所示。

另外所有的圖形處理、程序設計和編輯均是基于一定數量的基礎數據(點數據),基礎數據處理的是否恰當,直接影響最終模型的顯示效果和精度。由于Revit有圖形界限的限制,從Civil3D中導出的點數據直接應用于Dynamo中,會造成圖形無法正確顯示的問題。所以在將原始點數據導入Dynamo之前,需進行處理——采用相對坐標。這種處理方式既保證了圖形的正常顯示,又保證了建模精度。圖1所示將原始坐標點數據轉變為相對坐標的具體步驟為:修改Revit項目基點(系統默認狀態為0,0,0,結合工程項目實際情況,將其設定為340 000,287 300,0),隨后基于該基點對原坐標值進行轉換,結果如圖1中“變更坐標”所示。
Dynamo可視化編程的主要特點是程序編輯過程中可隨時查看編輯成果,程序編輯與結果輸出相同步。同時該種類型的編程有別于傳統編程,傳統編程是基于過程的,Dynamo可視化編程是基于對象的。下面通過一個范例來說明兩種編程思想的區別。
通過圓心和半徑做圓,常規的程序源代碼如下:
my Point=Point.By Coordinates(0,0,0);
x=3;
y=4;
other Point=Point.By Coordinates(x,y,0);
dist=my Point.Distance To(other Point);
my Circle=Circle.By Center Point Radius(my Point,dist);
通過可視化編程創建圓的過程如圖2所示。

以上2種方法均可以創建圓形,很明顯采用Dynamo可視化編程去創建圖形更加直觀和便捷。
在模型創建過程中,Dynamo通過內置的不同類型節點將各種類型數據列表以某種邏輯關系進行相互連接來解決相關模型創建問題。不同節點之間的數據列表運算是基于某種類型的數據連綴方式,數據連綴方式共分為三種類型:最短類型、最長類型和叉積類型。最短類型:兩個相對應的數據列表內部元素一一對應相互連接,直至某一數據列表最后元素相連接;最長類型:一組數據列表內部數據元素一直連接到另一數據列表沒有相對應的數據元素為止;叉積類型:每組數據列表中的每一個數據元素均與另一組數據列表中的所有數據元素相互連接。處于不同連綴狀態下的數據列表運算結果是不同的。現結合圖3~圖5來說明列表數據運算中的三種不同連綴狀態。



2.3.1Dynamo中節點開發及Design Script簡介
由于Dynamo內置節點類型畢竟有限,功能隨之也受到限制,不可能涉及到任意類型的工程項目BIM模型創建。特別是在創建復雜的空間結構體BIM模型時,除了應用內置節點類型外,還需依據工程的實際特點開發相應的功能型、創建型節點,以滿足復雜空間結構體模型的創建及建模精度等要求。在創建不同類型節點的過程中,節點開發均是基于C#(.net)程序語言。通過使用Dynamo導入動態鏈接庫文件(.dll),該DLL類型文件中的類名及靜態方法名共同構成節點的名稱。DLL文件導入后Dynamo會初始化該文件并生成相應的功能性節點。下述分別以“Geometry.MyPoint”“Vector Viewer”(向量觀察節點包)、“Point.Bycoordinates”(幾何空間點創建節點)為例,講述節點的創建過程及節點包、節點的組成結構(見圖6,圖7)。創建Geometry.MyPoint功能性節點的核心源代碼如下所示:
namespace My Note// 命名空間
{
public class Geometry//定義類“Geometry”
{
public static Point My Point (double x = 0, double y = 0, double z = 0) //定義靜態變量
{
Point MyPoint; //定義My Point類型為Point
MyPoint=Point.By Coordinates(x, y, z);
return My Point;//返回點
}
}
}

①節點的名稱;②節點的輸入項;③節點的輸出項;④節點數據的連綴狀態,不同的連綴狀態會影響節點進行列表運算的結果;⑤節點的主體,在此點擊鼠標的右鍵可以對節點的連綴狀態、顯示預覽、預覽上游等進行相關設置。
圖8,圖9所示方法是基于文本數據流加Dynamo可視化編程數據流的方式來開發相應功能性節點。Python Script是Dynamo的內置節點,在節點的創建過程中可以增加多個輸入端口,但輸出端口只有一個(Output),雙擊該節點可以進入相應的代碼編輯界面,所有的代碼編輯均是基于Python這種類型的計算機語言,代碼編輯界面如圖9所示。通過Python Script或是Code Block節點,可實現可視化數據流編程(Dynamo)和文本數據流編程(Python)相互之間的轉化。將參數化設計和計算機算法有機的聯系在一起。



2.3.2Dynamo中自定義節點包的制作
項目建模過程中,為實現某一特定的功能,將若干個內置的不同類型節點連接并打包,形成自定義節點包,以便在項目中可以被重復調用,無需再次連接相同的節點。自定義節點的結構組成具體以創建盾構管環的環縫節點為例來進行說明,具體如圖10所示。
上述自定義節點包含有多個輸入端口、一個輸出端口,接口一般是由Code Block來實現。如圖10所示,輸入端口是由Code Block實現,輸出端口為Output默認輸出端口。創建好自定義節點包的輸入及輸出端口后,用鼠標框選各連接節點,在菜單欄(Ribbon)中點擊“編輯”選項,從下拉列表中選擇 “從所選項創建節點”,在隨后彈出的對話框中添加相應的自定義節點包名稱及所屬類別即可實現自定義節點包的創建。

自定義節點創建完成并發布后,可在類別模塊中選取相應節點。
本節內容以某公路互通匝道橋為例,該匝道橋梁中心線位于曲率半徑為2 800 m的圓曲線上,上部結構為預應力混凝土結構,梁體類型為T梁,單片梁體寬度為2.4 m,高度為1.2 m,梁跨徑組合為(28+28+28+30+25+28)m。同時本節內容主要就參數化T梁族的制作思路進行介紹,至于在族制作過程中如何添加約束、如何建立參數關系等在此不進行詳細描述。
參數化T梁族制作思路:
將梁體構造圖紙進行拆分(T梁拆分為橋面板、肋板、加腋結構、橫隔板)—分析梁體結構組成,結構變化處分開建模—確立建模標準(主要包含內容為定位標準、材質標準)—選取自適應公制常規模型族樣板—確定模型創建原點—根據各組成部分所處位置添加參照平面—添加尺寸約束—添加類型、實例參數及參數表達式(主要用于梁體橫坡、內外邊梁翼緣板線形調整等)—繪制截面輪廓(采用參照線繪制,并將參照線與參照平面進行鎖定)—創建形狀,形成參數化T梁族。所建族實例及參數化設置分別如圖11,圖12所示。


參數化橋墩族制作思路:
將橋墩構造圖紙進行拆分(橋墩拆分為墊石、蓋梁、墩柱、系梁、承臺、樁基)—選取公制結構基礎族樣板—確定模型創建原點(選取對稱中心所在位置)—根據各結構組成部分所處位置添加參照平面— 添加尺寸約束—添加類型、實例參數及參數表達式(主要用于蓋梁坡度調整)—分別繪制各組成部分的截面輪廓(將輪廓線與各參照平面進行鎖定)—采用拉伸命令創建實體,最后通過連接命令形成整體參數化橋墩族。所建族實例如圖13所示。

參數化橋臺族制作思路:
將橋臺構造圖紙進行拆分(橋臺拆分為耳墻、臺帽、臺背、牛腿、倒棱、擋塊、墊石、樁基)—分析橋臺結構組成—選取公制結構基礎族樣板—確定模型創建原點(選取對稱中心所在位置)—根據各組成部分所處位置添加參照平面— 添加尺寸約束—添加類型、實例參數及參數表達式(主要用于臺帽、臺背橫坡調整)—繪制各截面輪廓(將輪廓與參照平面進行鎖定)—創建實體,最后通過融合命令形成參數化橋臺族。所建參數化族實例如圖14所示。
在進行程序開發之前,需將項目實體各項信息統計于Excel表中(Excel是基于Microsoft平臺,采用其他平臺的Excel軟件會造成數據無法讀取的情況發生),諸如橋墩信息、橋臺信息、步跨信息、T梁預制橫坡等,方便后期Dynamo進行數據處理,將相應實體布置在實際位置上。另外本節內容主要介紹創建不同結構模塊主要程序節點構成,至于模塊與模塊之間及對應程序各主要節點之間如何銜接在此不做說明。

1)線路生成程序主要節點組成。
美國政府曾多次強調不給任何國家和任何公司制裁豁免,并要求所有國家在“過渡期”后同伊朗的原油交易清零,但遭到很多同伊朗有大宗原油貿易國家的強烈反對。2018年11月5日,特朗普政府宣布給予中國、印度、意大利、希臘、日本、韓國、土耳其和中國臺灣地區“重大削減例外”的豁免,理由是這些國家和地區已大幅減少對伊朗石油的購買[20]。美國制裁政策規定了特殊情況下的例外情況。
File Path,File.FromPath,List.RestOfItems,List.Transpose,List.GetItemAtIndex,Point.ByCoordinates,NurbsCurve.ByPoints,PolyCurve.ByJoinedCurves,Curve.PullOntoPlane,Plane.XY,Code Block。
程序基本設計流程:讀取Excel數據—數據處理—應用List.GetItemAtIndex節點過濾所需數據—采用Point.ByCoordinates節點生成空間點— 應用NurbsCurve.ByPoints節點將點連接生成線—采用PolyCurve.ByJoinedCurves節點將三維空間線類型轉換為PolyCurve類型。
2)線路校核程序主要節點組成。
List.GetItemAtIndex,List.FirstItem,List.LastItem,String.IndexOf,String.Remove,String.ToNumber,Curve.Length,List.Join,AllFalse,Color.ByARGB,Boolean,If,Color Range ,Code Block。
程序基本設計流程:讀取Excel數據—數據處理—應用List.GetItemAtIndex節點過濾所需數據—采用Point.ByCoordinates節點生成空間點—應用NurbsCurve.ByPoints節點將點連接生成線—采用PolyCurve.ByJoinedCurves節點將三維空間線類型轉換為PolyCurve類型—應用Curve.Length節點獲取投影曲線長度—按照樁號計算投影曲線長度并與上一步所測曲線長度進行比較(做差)—通過if和Boolean節點將比較結果轉換為不同的顏色顯示。
將由Civil3D生成的控制點連接成線(采用NurbsCurve.ByControlPoints節點將空間點連接形成三維空間線)—通過PolyCurve.ByJoinedCurves節點將上步生成的三維空間線轉換成PolyCurve類型—將轉換后的三維空間曲線投影至二維平面上(為XY平面)—按照跨徑在曲線上獲取相應位置上的點—放置下部結構族—調整下部結構族偏轉角度(角度由該點處的切向量與世界坐標系Y軸或是X軸的夾角),使得與實際布置情況保持一致(線路生成及校核程序未在下列列出)。
將由Civil3D生成的控制點連接成線(采用NurbsCurve.ByControlPoints節點將空間點連接形成三維空間線)—通過PolyCurve.ByJoinedCurves節點將上步生成的三維空間線轉換成PolyCurve類型—將轉換后的三維空間曲線投影至二維平面上(為XY平面)—按照梁體跨徑在投影曲線上獲取相應位置上的樁號點—將上步形成點投影至原三維曲線—以三維曲線上的點為局部坐標系原點建立梁體放置空間坐標系—根據梁體的橫向排布特征及橫坡參數建立整體橋跨梁體放置空間坐標系—利用節點List.Sublist實現外邊梁、中梁、內邊梁點位編排。
2)創建梁體程序腳本設計流程。
放置梁體點位編排程序腳本如前所述,在此不再詳述。在梁體點位編排程序腳本基礎之上對所布置的各分片梁體進行命名(核心是應用生成字符串相關節點進行命名)—復制梁體類型(應用白馬包中的CopyType節點)—采用放置自適應族相關節點AdaptiveComponent.ByPoints進行梁體布置(注意相關連接節點的數據結構必須保持一致)。本實際案例中的T梁族分為“兩種類型”:a.未置入直線類型(第一階段T梁);b.置入直線類型(第二階段T梁,該種“類型”的T梁主要通過內置直線的端點來實現梁體的空間布置)。
3)邊梁、中梁梁體類型劃分及梁體橫坡、梁長、梁端角度調整程序腳本設計流程。
繼在梁跨整體布置腳本程序的基礎之上采用Element.SetParameterByName節點對處于不同位置處的分片梁體所屬類型進行劃分(外邊梁、中梁、內邊梁)—采用List相關節點對梁體類型列表數據進行處理—采用Element.SetParameterByName節點對不同分片梁體類型的橫坡、梁體長度、梁體梁端角度參數值進行設置。
1)橫隔板及濕接縫定位點編排、放置族實例程序設計流程。
根據自適應族樣板創建8點自適應族(注意編排自適應點的順序,同時在繪制圖形時采用參照線繪制)—按照一定的順序在參數化的T梁族里面置入模型線(后續程序相應節點會根據依照此線產生的端點按繪制順序放置自適應族,所以在繪制該類型模型線時需注意繪制的方向和順序)—采用Element.Curves獲取每片梁體中的內置線—應用list相關節點進行數據處理,獲得放置自適應族的空間點坐標列表—采用文本數據流選取項目文件中的自適應族類型—應用CopyType節點對梁片進行命名(相關操作節點的數據結構必須保持一致)—應用AdaptiveComponent.ByPoints節點放置自適應族。
另外濕接縫定位點編排腳本程序與橫隔板定位點編排腳本程序結構一致,可參照濕接縫定位點編排腳本程序進行點位編排和命名。
2)放置橋面板、行車道標志線及護欄程序設計流程。
通過CodeBlock文本數據流獲取項目文件中相應類型族文件—通過世界坐標系(WGS)原點放置族—采用List.Cycle節點生成對應數目的輪廓族—設置相同類型輪廓的空間偏轉角度(橋面板、行車道標志線、護欄斷面輪廓)—獲取組成各構件輪廓的曲線—采用Group Curves節點對組成各輪廓曲線進行分組,所得每一組曲線均可獨立構成閉合曲線—將組成每個閉合輪廓的線進行聚合處理,使得多線組成一個整體的閉合輪廓線(在行車道標志線、護欄斷面、橋面板橫斷面數據處理中應用)—采用CoordinateSysterm.ByOriginVectors節點將生成的閉合輪廓由世界坐標系變換至目標空間坐標系—采用Solid.Byloft節點實現同一類型不同位置處閉合曲線之間的放樣融合,形成相應位置處的實體—采用Springs.FamilyInstance.ByGeometry節點對生成實體進行命名。
另外放置橋面板、防撞護欄腳本程序與放置行車道腳本程序結構一致,可參照放置行車道腳本程序進行相應放置。
本文通過將Dynamo可視化編程技術應用于互通橋梁中的匝道橋建模過程中,從模型搭建及數據的處理過程當中不難發現Dynamo在處理復雜空間體結構建模及多類型數據處理方面具有很強的應用優勢。同時基于C#,Python語言的Dynamo功能節點開發及可視化編程的靈活性、代碼的開源性也為Dynamo在今后BIM正向設計中的發展提供了無限的可能性。