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