為了實(shí)現(xiàn)三維BIM環(huán)境下的全線橋梁缺口設(shè)計(jì),使用達(dá)索/組件應(yīng)用架構(gòu)(CAA)語(yǔ)言,開(kāi)發(fā)出嵌入到達(dá)索軟件內(nèi)部的橋梁缺口正向設(shè)計(jì)程序

在傳統(tǒng)二維環(huán)境下進(jìn)行鐵路工程設(shè)計(jì)時(shí),橋梁缺口設(shè)計(jì)是依靠工程師對(duì)平、縱斷面圖紙中的地形、線位、平立交進(jìn)行綜合分析完成的,存在效率低下的缺陷。

針對(duì)這一問(wèn)題,為了降低軟件開(kāi)發(fā)難度,提高開(kāi)發(fā)效率,本文充分利用現(xiàn)有三維設(shè)計(jì)軟件的強(qiáng)大參數(shù)化建模功能,使用達(dá)索/組件應(yīng)用架構(gòu)(CAA)語(yǔ)言,開(kāi)發(fā)出一款嵌入到達(dá)索軟件內(nèi)部的橋梁缺口正向設(shè)計(jì)程序。本程序使設(shè)計(jì)人員能夠在三維交互操作環(huán)境下協(xié)同考慮地形、平立交、空間線位等因素完成全線所有橋梁缺口的一體化設(shè)計(jì),大幅提高了設(shè)計(jì)效率。

程序特性及流程設(shè)計(jì)

該人機(jī)交互的橋位缺口設(shè)計(jì)工具具備以下幾個(gè)特點(diǎn):①嵌入到達(dá)索零件設(shè)計(jì)(Part Design)模塊中;②程序根據(jù)缺口設(shè)計(jì)表格中的內(nèi)容生成虛擬的空間缺口平面,用戶可沿空間線位手動(dòng)拖動(dòng)這些虛擬平面;③用戶對(duì)虛擬平面的手動(dòng)拖動(dòng)過(guò)程結(jié)束后,程序自動(dòng)更新缺口設(shè)計(jì)表格的里程值,并生成最新的空間平面。

1.png

功能按鈕位置

本程序的工作流程如下圖所示。其中的“拖動(dòng)單獨(dú)缺口平面”操作,僅表示計(jì)算機(jī)可以識(shí)別的微小鼠標(biāo)位置移動(dòng),對(duì)該操作執(zhí)行循環(huán)可用于表示用戶對(duì)虛擬橋梁缺口平面的連續(xù)手動(dòng)拖動(dòng)。

2.png

工作流程設(shè)計(jì)

程序運(yùn)行前,初步擬定缺口里程表,程序根據(jù)其中存儲(chǔ)的里程值自動(dòng)生成可供用戶手動(dòng)拖動(dòng)的臨時(shí)顯示平面。選擇需要修改位置的缺口,所選擇的平面會(huì)隨用戶鼠標(biāo)位置沿空間線位移動(dòng)。當(dāng)用戶在三維環(huán)境下將其移動(dòng)至所需位置后,右鍵單擊,當(dāng)前缺口操作過(guò)程結(jié)束。

用戶交互界面

程序運(yùn)行結(jié)束時(shí),在Result幾何圖形集內(nèi)生成反應(yīng)最新設(shè)計(jì)結(jié)果的所有橋梁缺口平面,同時(shí),缺口里程表格的內(nèi)容也被更新。

二次開(kāi)發(fā)策略和思路

本文將從模塊設(shè)計(jì)的角度介紹此橋梁缺口設(shè)計(jì)工具的開(kāi)發(fā)策略和思路,該橋梁缺口設(shè)計(jì)工具包含數(shù)據(jù)存儲(chǔ)模塊、組件模塊和界面模塊三個(gè)部分。

模塊設(shè)計(jì)

其中,數(shù)據(jù)存儲(chǔ)模塊相當(dāng)于程序的全局變量,存儲(chǔ)了斷鏈表信息;同時(shí),由于本程序的運(yùn)行是一個(gè)交互過(guò)程,還包含了對(duì)用戶當(dāng)前正在編輯的橋梁缺口信息的存儲(chǔ);本模塊的第三部分是全線所有橋梁的缺口信息,是程序運(yùn)行和用戶交互的最終結(jié)果。

組件模塊定義了BridgeBoundary 和BridgeSingleBoundary兩個(gè)組件。

界面模塊的作用是綜合運(yùn)用數(shù)據(jù)存儲(chǔ)模塊開(kāi)發(fā)出來(lái)的數(shù)據(jù)結(jié)構(gòu)以及組件模塊開(kāi)發(fā)出來(lái)的接口,實(shí)現(xiàn)用戶操作流程。以下各節(jié)將依次對(duì)這些模塊進(jìn)行詳細(xì)的介紹。

數(shù)據(jù)存儲(chǔ)模塊

斷鏈表信息和全線橋梁缺口信息均使用CAA自帶的不定長(zhǎng)數(shù)組類型ListPV存儲(chǔ),數(shù)組元素的類型以結(jié)構(gòu)體的形式表達(dá),在這些結(jié)構(gòu)體中,分別以數(shù)值和字符串類型的成員變量表示里程、長(zhǎng)度或里程字頭等信息。當(dāng)前缺口信息使用若干個(gè)單獨(dú)的數(shù)值和字符串類型變量表示。

組件模塊

BridgeSingleBoundary組件

每座橋梁包含大里程和小里程共兩個(gè)缺口,該組件用于存儲(chǔ)一個(gè)單獨(dú)橋梁缺口的信息,并輔助用戶交互操作和臨時(shí)顯示。

橋梁缺口在程序運(yùn)行過(guò)程中使用了CAA的ISO(Interactive Set of Objects)臨時(shí)顯示機(jī)制。

ISO從本質(zhì)上說(shuō)是一個(gè)組件包,一個(gè)程序在運(yùn)行過(guò)程中只存在唯一的一個(gè)ISO類型對(duì)象。當(dāng)把其他組件放入ISO組件包以后,用戶就可以看到這些組件包含的CATRep類型臨時(shí)顯示對(duì)象,并能對(duì)其交互操作,但前提條件是這些組件須

實(shí)現(xiàn)CATI3DVisu接口,并在此接口中定義一個(gè)能夠返回CATRep類型對(duì)象的方法。因此,為了實(shí)現(xiàn)用戶對(duì)橋梁缺口的編輯,需要借助ISO對(duì)象。

BridgeSingleBoundary組件架構(gòu)如下圖所示。類型接口BridgeISingleBoundary通過(guò)Get系列函數(shù)獲取組件屬性值,例如平面線位、空間線位、斷鏈表、橋梁編號(hào)、名義里程、投影面等,通過(guò)Set系列函數(shù)為組件屬性賦值。

BridgeESingleBoundaryVisu 是組件的一個(gè)擴(kuò)展類,該類執(zhí)行CATI3DGeoVisu接口,此擴(kuò)展類提供BuildRep()方法,用于生成CAT3DCustomRep類型的幾何體。

BridgeESingleBoundaryCreateInstance是組件的一個(gè)擴(kuò)展類,該類執(zhí)行CATICreateInstance接口,此擴(kuò)展類提供的CreateInstance()方法用于組件實(shí)例化。

BridgeESingleBoundaryGeoEvents是組件的一個(gè)擴(kuò)展類,該類執(zhí)行CATIModelEvents接口。當(dāng)在ISO中添加組件或者更新組件時(shí),CATISO對(duì)象向CATVisManager對(duì)象發(fā)出CATCreate訊號(hào),CATVisManager對(duì)象收到此訊號(hào)后通知ISO對(duì)象臨時(shí)顯示出組件的幾何形狀。而CATIModelEvents接口的實(shí)現(xiàn)正是CATISO對(duì)象發(fā)出訊號(hào)的前提條件。

BridgeBoundary組件

一條空間線位包含多座橋梁,該組件用于表達(dá)一條空間線位上所有橋梁的缺口信息,其架構(gòu)如下圖所示。

組件本身執(zhí)行其類型接口BridgeIBoundary,該接口的Get、Set系列函數(shù)用于獲取屬性值以及為屬性賦值,其中的GetSingleBoundaryElements()函數(shù)用于獲取全線所有橋梁缺口對(duì)象,每一個(gè)對(duì)象都以BridgeSingleBoundary類型的組件表達(dá)。

BridgeEBoundaryCreateInstance 是組件的一個(gè)擴(kuò)展類,其提供的CreateInstance()方法用于組件實(shí)例化。

界面模塊

界面模塊的作用是綜合運(yùn)用數(shù)據(jù)存儲(chǔ)模塊以及組件模塊實(shí)現(xiàn)用戶操作流程。具體包括:添加工具條,實(shí)現(xiàn)用戶交互窗口,顯示臨時(shí)缺口對(duì)象,拖動(dòng)缺口臨時(shí)顯示平面,保存用戶交互結(jié)果。本節(jié)將依次介紹這些內(nèi)容。

添加工具條

工具條采用Add-in的方式添加,由于該程序嵌入到零件設(shè)計(jì)(Assembly Design)模塊,因此,需要實(shí)現(xiàn)CATIPrtCfgAddin接口。

用戶交互窗口

首先創(chuàng)建用戶交互窗口Dialog文件,再通過(guò)對(duì)CATMmrPanelStateCmd類的派生、重載GiveMyPanel()方法,使派生類與用戶交互對(duì)話窗口Dialog文件關(guān)聯(lián)。重載BuildGraph()方法,從而完成傳統(tǒng)交互窗口無(wú)法實(shí)現(xiàn)的對(duì)話流程操作。

BuildGraph()方法通過(guò)命令狀態(tài)(CommandState)和代理(Agent)兩個(gè)關(guān)鍵元素實(shí)現(xiàn)用戶與界面的交互響應(yīng)。代理分為三種:CATDialogAgent代理用來(lái)獲取界面控件響應(yīng);CATPathElementAgent繼承自CATDialogAgent,用于獲取鼠標(biāo)下的對(duì)象路徑,并存儲(chǔ)該路徑值;CATIndicationAgent繼承自CATDialogAgent,該代理表示鼠標(biāo)所在的空間位置。

橋梁邊界臨時(shí)對(duì)象的顯示

BridgeSingleBoundary作為組件模塊的一個(gè)重要成員,用于臨時(shí)顯示橋梁缺口。

用戶選擇幾何圖形集后,程序提取其中的骨架元素、橋梁缺口數(shù)據(jù)表、斷鏈表,處理后轉(zhuǎn)化為內(nèi)部數(shù)據(jù)格式,繼而執(zhí)行CATInstantiateComponent()方法,實(shí)例化BridgeBoundary組件。

橋梁邊界臨時(shí)對(duì)象顯示流程

BridgeBoundary組件代表一條線位上所有橋梁的缺口平面,每一個(gè)單獨(dú)的缺口平面屬于BridgeSingleBoundary組件類型。實(shí)例化出來(lái)的BridgeBoundary組件通過(guò)GetSingleBoundaryElements()方法獲取它包含的所有單獨(dú)缺口對(duì)象。

AddElement()方法把這些單獨(dú)缺口放入ISO組件包中,從而實(shí)現(xiàn)了缺口平面的臨時(shí)顯示。

橋梁缺口平面的用戶交互操作

用于表示鼠標(biāo)位置的代理CATIndication Agent包含一個(gè)屬性ProjectPlane,它的作用如下圖所示。用戶所能看到的鼠標(biāo)位置是相對(duì)于顯示器平面的,而它的真實(shí)位置位于代理的投影面上,將視點(diǎn)和鼠標(biāo)連成直線,該直線與投影面的交點(diǎn)P2即是鼠標(biāo)在三維空間中的真實(shí)位置。

從BridgeISingleBoundary類型接口的Set系列函數(shù)可以看出,代表橋梁?jiǎn)为?dú)缺口的組件BridgeSingleBoundary包含幾個(gè)關(guān)鍵屬性:平面線位、空間線位、里程值。要想實(shí)現(xiàn)橋梁缺口臨時(shí)顯示平面在被選中以后隨鼠標(biāo)移動(dòng),其前提是這三個(gè)屬性被重新賦值,由于平面和空間線位與鼠標(biāo)位置無(wú)關(guān),所以實(shí)現(xiàn)此操作的關(guān)鍵就是在鼠標(biāo)移動(dòng)過(guò)程中實(shí)時(shí)更新橋梁?jiǎn)为?dú)缺口組件的里程屬性值。

假設(shè)用戶手動(dòng)選擇的橋梁缺口平面初始位于P1點(diǎn),程序通過(guò)其類型接口的GetProjectPlane()方法獲取一個(gè)通過(guò)P1點(diǎn)并與水平線位相切的豎直面,并將這個(gè)豎直面賦予CATIndicationAgent代理的ProjectPlane屬性,作為投影面。在鼠標(biāo)移動(dòng)過(guò)程中,P2點(diǎn)隨之在投影面的范圍內(nèi)移動(dòng),使用CATIndicationAgent 代理的GetValue()方法獲取一個(gè)以CATMathPoint2D 表示的P2,再轉(zhuǎn)化為CATMathPoint類型。

以P2為輸入?yún)?shù)使用SetOrigin()方法,以投影面的法向量和豎直向量為輸入?yún)?shù)使用SetVectors()方法,創(chuàng)建一個(gè)通過(guò)P2點(diǎn)并與投影面垂直的CATMathPlane類型的豎直面。使用CATCGMCreateIntersect()命令生成豎直面與水平線位的交點(diǎn)集,并根據(jù)與P2距離最小的原則獲取P3點(diǎn)。

借助CATCGMCreateTopSplitWire()命令,使用P3點(diǎn)切割水平線位,GetLength()命令能夠測(cè)量出作為切割結(jié)果的線位長(zhǎng)度,此長(zhǎng)度即是P3點(diǎn)的實(shí)際里程值,也就是單獨(dú)缺口組件的里程屬性。

使用ISO組件包的UpdateElement()方法,根據(jù)BridgeSingleBoundary 橋梁缺口組件的最新里程屬性值,將當(dāng)前正在拖動(dòng)的橋梁缺口臨時(shí)顯示平面更新至最新的位置。通過(guò)這種方法,實(shí)現(xiàn)了對(duì)單獨(dú)橋梁缺口平面的選擇、拖動(dòng)。

保存用戶交互結(jié)果

每完成一個(gè)橋梁缺口的修改,數(shù)據(jù)存儲(chǔ)模塊中的全線橋梁缺口信息不定長(zhǎng)數(shù)組BoundaryResultInfoList即隨之更新,當(dāng)用戶完成對(duì)全線所有橋梁缺口的交互操作后,BoundaryResultInfoList就存儲(chǔ)了最終的設(shè)計(jì)成果。

OK 按鈕被點(diǎn)擊后,程序?qū)oundaryResultInfoList代表的所有橋梁缺口循環(huán)操作,流程如下圖所示。

首先,從結(jié)構(gòu)體中獲取缺口里程值,使用CATCGMCreateComputePointOnWire()命令,以此實(shí)際里程值為輸入?yún)?shù)生成平面線位點(diǎn)1,以及與其沿線位相距1cm的平面線位點(diǎn)2,以平面線位點(diǎn)1和豎直向量為輸入?yún)?shù),使用CATCGMCreateTopLineFromDirection()命令生成豎直線,再使用CATCGMCreateTopIntersect()命令生成此豎直線與空間線位的交點(diǎn),此交點(diǎn)即是當(dāng)前橋梁缺口在空間線位上的對(duì)應(yīng)點(diǎn)。

點(diǎn)1和點(diǎn)2的連線可近似作為平面線位在點(diǎn)1的水平切線,以此切線為法向,結(jié)合當(dāng)前橋梁缺口在空間線位上的對(duì)應(yīng)點(diǎn),生成CATMathPlane類型的橋梁缺口平面,依次通過(guò)CATCGMCreateTopSkin()和InstantiateDatum()命令將此平面轉(zhuǎn)化為特征。這樣就完成了當(dāng)前循環(huán)體內(nèi)的橋梁缺口特征平面建模。循環(huán)結(jié)束后,程序即生成了全線所有橋梁缺口平面特征。