齊成龍
(中國鐵路設(shè)計集團(tuán)有限公司,天津300308)
BIM 技術(shù)的發(fā)展促進(jìn)了其在鐵路工程領(lǐng)域的廣泛應(yīng)用。在傳統(tǒng)二維環(huán)境下進(jìn)行鐵路工程設(shè)計時,橋梁缺口設(shè)計是依靠工程師對平、縱斷面圖紙中的地形、線位、平立交進(jìn)行綜合分析完成的,存在效率低下的缺陷。
針對這一問題,為了降低軟件開發(fā)難度,提高開發(fā)效率[1],本文充分利用現(xiàn)有三維設(shè)計軟件的強大參數(shù)化建模功能[2],使用達(dá)索/組件應(yīng)用架構(gòu)(CAA)語言,開發(fā)出一款嵌入到達(dá)索軟件內(nèi)部的橋梁缺口正向設(shè)計程序。本程序使設(shè)計人員能夠在三維交互操作環(huán)境下協(xié)同考慮地形、平立交、空間線位等因素完成全線所有橋梁缺口的一體化設(shè)計,大幅提高了設(shè)計效率。
該人機(jī)交互的橋位缺口設(shè)計工具具備以下幾個特點:①嵌入到達(dá)索零件設(shè)計(Part Design)模塊中[3],如圖1 所示;②程序根據(jù)缺口設(shè)計表格中的內(nèi)容生成虛擬的空間缺口平面,用戶可沿空間線位手動拖動這些虛擬平面;③用戶對虛擬平面的手動拖動過程結(jié)束后,程序自動更新缺口設(shè)計表格的里程值,并生成最新的空間平面。
圖1 功能按鈕位置Fig.1 Location of functional button
本程序的工作流程如圖2 所示。其中的“拖動單獨缺口平面”操作,僅表示計算機(jī)可以識別的微小鼠標(biāo)位置移動,對該操作執(zhí)行循環(huán)可用于表示用戶對虛擬橋梁缺口平面的連續(xù)手動拖動。
圖2 工作流程設(shè)計Fig.2 Workflow design
用戶交互界面如圖3 所示。程序運行前,初步擬定缺口里程表,程序根據(jù)其中存儲的里程值自動生成可供用戶手動拖動的臨時顯示平面[4]。
選擇需要修改位置的缺口,所選擇的平面會隨用戶鼠標(biāo)位置沿空間線位移動。當(dāng)用戶在三維環(huán)境下將其移動至所需位置后,右鍵單擊,當(dāng)前缺口操作過程結(jié)束。
圖3 用戶交互界面Fig.3 User interface
程序運行結(jié)束時,在Result 幾何圖形集內(nèi)生成反應(yīng)最新設(shè)計結(jié)果的所有橋梁缺口平面,同時,缺口里程表格的內(nèi)容也被更新。
本文將從模塊設(shè)計的角度介紹此橋梁缺口設(shè)計工具的開發(fā)策略和思路,該橋梁缺口設(shè)計工具包含如圖4 所示的數(shù)據(jù)存儲模塊、組件模塊和界面模塊三個部分。
圖4 模塊設(shè)計Fig.4 Module design
其中,數(shù)據(jù)存儲模塊相當(dāng)于程序的全局變量,存儲了斷鏈表信息;同時,由于本程序的運行是一個交互過程,還包含了對用戶當(dāng)前正在編輯的橋梁缺口信息的存儲;本模塊的第三部分是全線所有橋梁的缺口信息,是程序運行和用戶交互的最終結(jié)果。
組件模塊定義了BridgeBoundary 和Bridge SingleBoundary兩個組件;
界面模塊的作用是綜合運用數(shù)據(jù)存儲模塊開發(fā)出來的數(shù)據(jù)結(jié)構(gòu)以及組件模塊開發(fā)出來的接口,實現(xiàn)用戶操作流程。
以下各節(jié)將依次對這些模塊進(jìn)行詳細(xì)的介紹。
斷鏈表信息和全線橋梁缺口信息均使用CAA 自帶的不定長數(shù)組類型 ListPV 存儲[5],數(shù)組元素的類型以結(jié)構(gòu)體的形式表達(dá),在這些結(jié)構(gòu)體中,分別以數(shù)值和字符串類型的成員變量表示里程、長度或里程字頭等信息。
當(dāng)前缺口信息使用若干個單獨的數(shù)值和字符串類型變量表示。
每座橋梁包含大里程和小里程共兩個缺口,該組件用于存儲一個單獨橋梁缺口的信息,并輔助用戶交互操作和臨時顯示。
橋梁缺口在程序運行過程中使用了CAA 的ISO(Interactive Set of Objects)臨時顯示機(jī)制。
ISO 從本質(zhì)上說是一個組件包,一個程序在運行過程中只存在唯一的一個ISO 類型對象。當(dāng)把其他組件放入ISO 組件包以后,用戶就可以看到這些組件包含的CATRep 類型臨時顯示對象,并能對其交互操作,但前提條件是這些組件必須實現(xiàn)CATI3DVisu接口,并在此接口中定義一個能夠返回CATRep 類型對象的方法。因此,為了實現(xiàn)用戶對橋梁缺口的編輯,需要借助ISO對象。
BridgeSingleBoundary 組件架構(gòu)如圖5 所示。類型接口BridgeISingleBoundary 通過Get 系列函數(shù)獲取組件屬性值,例如平面線位、空間線位、斷鏈表、橋梁編號、名義里程、投影面等,通過Set 系列函數(shù)為組件屬性賦值。
BridgeESingleBoundaryVisu 是組件的一個擴(kuò)展類,該類執(zhí)行CATI3DGeoVisu接口,此擴(kuò)展類提供BuildRep()方法,用于生成CAT3DCustomRep類型的幾何體。
BridgeESingleBoundaryCreateInstance 是組件的一個擴(kuò)展類,該類執(zhí)行CATICreateInstance 接口,此擴(kuò)展類提供的CreateInstance()方法用于組件實例化。
圖5 BridgeSingleBoundary組件架構(gòu)Fig.5 BridgeSingleBoundary component structure
BridgeESingleBoundaryGeoEvents 是組件的一個擴(kuò)展類,該類執(zhí)行CATIModelEvents 接口。當(dāng)在ISO 中添加組件或者更新組件時,CATISO 對象向CATVisManager 對象發(fā)出CATCreate 訊號,CATVisManager 對象收到此訊號后通知ISO 對象臨時顯示出組件的幾何形狀。而CATIModel Events 接口的實現(xiàn)正是CATISO 對象發(fā)出訊號的前提條件。
一條空間線位包含多座橋梁,該組件用于表達(dá)一條空間線位上所有橋梁的缺口信息,其架構(gòu)如圖6所示。
圖6 BridgeBoundary組件架構(gòu)Fig.6 BridgeBoundary component structure
組件本身執(zhí)行其類型接口BridgeIBoundary,該接口的Get、Set 系列函數(shù)用于獲取屬性值以及為屬性賦值,其中的GetSingleBoundaryElements()函數(shù)用于獲取全線所有橋梁缺口對象,每一個對象都以BridgeSingleBoundary類型的組件表達(dá)。
BridgeEBoundaryCreateInstance 是組件的一個擴(kuò)展類,其提供的CreateInstance()方法用于組件實例化。
界面模塊的作用是綜合運用數(shù)據(jù)存儲模塊以及組件模塊實現(xiàn)用戶操作流程。具體包括:添加工具條,實現(xiàn)用戶交互窗口,顯示臨時缺口對象,拖動缺口臨時顯示平面,保存用戶交互結(jié)果。本節(jié)將依次介紹這些內(nèi)容。
工具條采用Add-in 的方式添加,由于該程序嵌入到零件設(shè)計(Assembly Design)模塊,因此,需要實現(xiàn)CATIPrtCfgAddin接口[6]。
首先創(chuàng)建用戶交互窗口Dialog 文件,再通過對 CATMmrPanelStateCmd 類的派生、重載GiveMyPanel()方法,使派生類與用戶交互對話窗口Dialog 文件關(guān)聯(lián)。重載BuildGraph()方法,從而完成傳統(tǒng)交互窗口無法實現(xiàn)的對話流程操作。
BuildGraph()方法通過命令狀態(tài)(Command State)和代理(Agent)兩個關(guān)鍵元素實現(xiàn)用戶與界面的交互響應(yīng)。代理分為三種:CATDialogAgent代理用來獲取界面控件響應(yīng);CATPathElement Agent 繼承自CATDialogAgent,用于獲取鼠標(biāo)下的對象路徑,并存儲該路徑值;CATIndicationAgent繼承自CATDialogAgent,該代理表示鼠標(biāo)所在的空間位置。
BridgeSingleBoundary 作為組件模塊的一個重要成員,用于臨時顯示橋梁缺口[7]。
如圖7 所示,用戶選擇幾何圖形集后,程序提取其中的骨架元素、橋梁缺口數(shù)據(jù)表、斷鏈表,處理后轉(zhuǎn)化為內(nèi)部數(shù)據(jù)格式,繼而執(zhí)行CATInstantiate Component()方法,實例化BridgeBoundary組件。
圖7 橋梁邊界臨時對象顯示流程Fig.7 Visualization workflow of bridge boundary temporary components
BridgeBoundary組件代表一條線位上所有橋梁的缺口平面,每一個單獨的缺口平面屬于Bridge SingleBoundary 組件類型。實例化出來的Bridge Boundary 組件通過 GetSingleBoundaryElements()方法獲取它包含的所有單獨缺口對象。AddElement()方法把這些單獨缺口放入ISO 組件包中,從而實現(xiàn)了缺口平面的臨時顯示。
用于表示鼠標(biāo)位置的代理CATIndication Agent 包含一個屬性ProjectPlane,它的作用如圖8所示。用戶所能看到的鼠標(biāo)位置是相對于顯示器平面的,而它的真實位置位于代理的投影面上,將視點和鼠標(biāo)連成直線,該直線與投影面的交點P2即是鼠標(biāo)在三維空間中的真實位置[8]。
圖8 橋梁缺口平面用戶交互操作示意圖Fig.8 Interactive operation figure for boundary plane
從BridgeISingleBoundary 類型接口的Set系列函數(shù)可以看出,代表橋梁單獨缺口的組件BridgeSingleBoundary 包含幾個關(guān)鍵屬性:平面線位、空間線位、里程值。要想實現(xiàn)橋梁缺口臨時顯示平面在被選中以后隨鼠標(biāo)移動,其前提是這三個屬性被重新賦值,由于平面和空間線位與鼠標(biāo)位置無關(guān),所以實現(xiàn)此操作的關(guān)鍵就是在鼠標(biāo)移動過程中實時更新橋梁單獨缺口組件的里程屬性值。
假設(shè)用戶手動選擇的橋梁缺口平面初始位于P1 點,程序通過其類型接口的GetProjectPlane()方法獲取一個通過P1 點并與水平線位相切的豎直面,并將這個豎直面賦予CATIndicationAgent 代理的ProjectPlane屬性,作為投影面。
在鼠標(biāo)移動過程中,P2 點隨之在投影面的范圍內(nèi)移動,使用CATIndicationAgent 代理的GetValue()方法獲取一個以 CATMathPoint2D 表示的P2,再轉(zhuǎn)化為CATMathPoint類型。
以P2 為輸入?yún)?shù)使用SetOrigin()方法,以投影面的法向量和豎直向量為輸入?yún)?shù)使用SetVectors()方法,創(chuàng)建一個通過P2點并與投影面垂直的CATMathPlane 類型的豎直面。使用CATCGMCreateIntersect()命令生成豎直面與水平線位的交點集,并根據(jù)與P2距離最小的原則獲取P3點。
借助 CATCGMCreateTopSplitWire()命令,使用P3點切割水平線位,GetLength()命令能夠測量出作為切割結(jié)果的線位長度,此長度即是P3點的實際里程值,也就是單獨缺口組件的里程屬性。
使用ISO 組件包的UpdateElement()方法,根據(jù)BridgeSingleBoundary 橋梁缺口組件的最新里程屬性值,將當(dāng)前正在拖動的橋梁缺口臨時顯示平面更新至最新的位置。通過這種方法,實現(xiàn)了對單獨橋梁缺口平面的選擇、拖動。
每完成一個橋梁缺口的修改,數(shù)據(jù)存儲模塊中的全線橋梁缺口信息不定長數(shù)組Boundary ResultInfoList即隨之更新,當(dāng)用戶完成對全線所有橋梁缺口的交互操作后,BoundaryResultInfoList就存儲了最終的設(shè)計成果。
OK 按鈕被點擊后,程序?qū)oundary ResultInfoList代表的所有橋梁缺口循環(huán)操作,流程如圖9所示。首先,從結(jié)構(gòu)體中獲取缺口里程值,使用CATCGMCreateComputePointOnWire()命令,以此實際里程值為輸入?yún)?shù)生成平面線位點1,以及與其沿線位相距1cm 的平面線位點2,以平面線位點1 和豎直向量為輸入?yún)?shù),使用CATCGMCreateTopLineFromDirection()命令生成豎直線,再使用 CATCGMCreateTopIntersect()命令生成此豎直線與空間線位的交點,此交點即是當(dāng)前橋梁缺口在空間線位上的對應(yīng)點。
圖9 用戶交互結(jié)果保存流程Fig.9 Save workflow for interactive results
點1 和點2 的連線可近似作為平面線位在點1 的水平切線,以此切線為法向,結(jié)合當(dāng)前橋梁缺口在空間線位上的對應(yīng)點,生成CATMathPlane 類型的橋梁缺口平面,依次通過CATCGMCreate TopSkin()和InstantiateDatum()命令將此平面轉(zhuǎn)化為特征。這樣就完成了當(dāng)前循環(huán)體內(nèi)的橋梁缺口特征平面建模。循環(huán)結(jié)束后,程序即生成了全線所有橋梁缺口平面特征。
本文介紹了一種通過達(dá)索/CAA 二次開發(fā)實現(xiàn)的全線橋梁缺口BIM設(shè)計程序。該人機(jī)交互的程序能夠根據(jù)缺口設(shè)計表格中的內(nèi)容生成虛擬的空間缺口平面,用戶在三維環(huán)境下沿空間線位手動拖動這些平面進(jìn)行全線橋梁缺口設(shè)計,設(shè)計過程結(jié)束后,程序根據(jù)用戶操作結(jié)果自動更新缺口設(shè)計表格,并在最終缺口位置生成空間平面特征結(jié)果。
本文繼而從數(shù)據(jù)存儲模塊、組件模塊和界面模塊三個方面介紹了程序開發(fā)策略和思路。
數(shù)據(jù)存儲模塊由若干個全局變量組成,這些變量分別用于存儲斷鏈表信息、當(dāng)前正在編輯的橋梁缺口對象信息以及全線所有橋梁的缺口信息。
組件模塊定義了BridgeSingleBoundary 和BridgeBoundary 兩個組件:前者表達(dá)一個單獨橋梁缺口,并賦予其用戶交互操作和臨時顯示的功能;后者用于存儲一條空間線位上所有橋梁的缺口信息。本文從組件實現(xiàn)的接口和繼承層次關(guān)系出發(fā),對這兩個組件進(jìn)行了詳細(xì)的介紹。
界面模塊的作用是綜合運用數(shù)據(jù)存儲模塊開發(fā)出來的數(shù)據(jù)結(jié)構(gòu),以及組件模塊開發(fā)出來的接口,實現(xiàn)用戶交互操作。