江神文
摘 要: 針對大跨度鋼管混凝土拱橋變高度空間桁架主拱,利用Revit平臺提出基于上下弦桿節點坐標的建模方法,以族為基礎,闡述了模型建立的關鍵技術,并基于.NET平臺,結合Revit API提出了主拱圈建模的二次開發技術,解決了Revit本身無法通過輸入三維坐標點方式生成鋼管構件的難點,大大提高了主拱圈的建模效率,保證了模型的準確性。
關鍵詞: 鋼管拱; Revit; 二次開發; 快速建模
1 引言
從傳統二維CAD設計向三維參數化設計轉型中,結構專業遇到了較大的阻礙,效率問題是其中重要問題之一。Revit平臺提供的結構模型是非常有效的參數化信息載體,其三維設計方法與傳統二維繪圖方式從根本上發生了轉變,結構設計效率問題嚴重降低了結構設計人員的熱情[1]。基于BIM技術的結構設計只需要建立一個模型,不同的階段無需重復建模,而是將各自的設計信息通過工作集的方法高度集成在同一個模型中,開展協同設計[2]。大跨度鋼管混凝土拱橋目前在西南地區跨越峽谷建設越來越多,其拱肋通常采用空間桁架形式,桿件復雜且多,采用以往的二維平面制圖,只需要將各個節點坐標導入到CAD中進行點到線。但在Revit平臺建模中,確定一個點坐標需要三個互相垂直的平面,主桁架的節點如果都通過這種方式來確定,不但嚴重影響了建模的效率,而且平面之間的相對位置錯誤不易檢查。為了解決上述問題,借助Revit API(Application Programming Interface)二次開發技術,針對鋼管主拱桁架的特點,開發通用插件,具有重要意義。
2 主拱圈參數化建模
在Revit軟件中,搭建模型的步驟為:選擇族樣板—>創建族—>添加族參數—>項目文件中載入族。主拱作為鋼管拱的最基本受力結構,建模的目標不僅是能生成可視化的三維信息模型,還要方便生成分析模型,以供分析軟件進行調用。采用“公制結構框架—梁和支撐”生成基于兩點的鋼管族,在項目文檔中通過API定制插件生成主拱圈模型
2.1 鋼管構件生成
主拱圈拱肋主要構件承重構件均采用鋼管,鋼管的型號包括φ1360×35、φ900×24、φ600×20等等。直徑和壁厚作為鋼管構件的共同屬性,可以采用“公制結構框架—梁和支撐”樣板文件定義鋼管族,添加直徑d(mm)和壁厚t(mm)兩個參數值。為了方便快捷添加眾多鋼管型號,可以編制和鋼管族同名的TXT文件放在同一文件目錄下,TXT格式如圖 2所示,在項目文件中可以完成一次性載入所有型號的鋼管構件。
選取某計算跨徑450m鋼管混凝土拱橋主拱圈采用等寬變高度空間桁架結構,斷面高度從拱頂8m變化到拱腳14m,單片拱肋寬度4m。針對桁架式主拱圈的特殊性,利用Revit API二次開發技術定制插件,一鍵搭建拱圈模型。
2.2 快速建模
鋼管族在項目生成桿件實例,需要給出起終點位置坐標,首先我們通過主拱圈設計圖先獲取主拱圈上下弦桿的節點坐標,保存成.xls格式文件,一般以拱腳中心作為主拱圈的原點,縱橋向為x軸,橫橋向為y軸,豎向為z軸。類Command從IExternalCommand派生,在該類中定義兩個動態數組m_beamMaps和m_level分別用來存儲當前活動文檔中的族類型(SymbolMap類) 和標高(LevelMap類)。
交互窗體CreateBeaml類基于System.Windows.Forms.Form實例化,在窗體除添加Label控件外,需添加4個ComboBox組合框控件和兩個dataGridView控件。其中ComboBox組合框用來確認所使用的桿件類型,dataGridView用來導入.xls格式的上下弦桿坐標。Execute()函數運行的主體代碼為:
m_revit = commandData.Application;
Transaction tran = new Transaction(m_revit.ActiveUIDocument.Document, “CurvedBeam”);
tran.Start();
bool initializeOK = Initialize();if (!initializeOK){return Autodesk.Revit.UI.Result.Failed;}
CreateBeam displayForm = new CreateBeam(this);displayForm.ShowDialog();
tran.Commit();
因為插件執行需要對文檔進行更改,所以創建事務“CurvedBeam”,第一步執行初始化函數Initialize(),為窗體ComboBox組合框插件準備數據。初始化函數需要用到元素邏輯過濾器(LogicalOrFilter)篩選出當前文檔中的框架族和標高,其核心代碼如下:
ElementClassFilter levelFilter =new ElementClassFilter(typeof(Level)); //過濾標高
ElementClassFilter famFilter =new ElementClassFilter(typeof(Family)); //過濾族
LogicalOrFilter orFilter = new LogicalOrFilter(levelFilter, famFilter); //邏輯或集合
FilteredElementCollector collector = new FilteredElementCollector(doc); //元素收集器
FilteredElementIterator i = collector.WherePasses(orFilter).GetElementIterator(); //過濾出元素