王 浩
(中國(guó)鐵路設(shè)計(jì)集團(tuán)有限公司,天津 300251)
自從鐵路總公司牽頭成立鐵路BIM 聯(lián)盟以來,鐵路BIM 技術(shù)應(yīng)用獲得了快速的發(fā)展[1-3]。各單位依據(jù)自身需求選用不同的軟件平臺(tái)進(jìn)行探索,取得了較大的技術(shù)進(jìn)步。但是無論各單位選擇那一款軟件平臺(tái),隨著研究的深入將面臨軟件功能不足的問題[4]。
各軟件平臺(tái)所建立的三維模型雖然能夠較好地表達(dá)各工程實(shí)體間的空間幾何關(guān)系,但是對(duì)于其他設(shè)計(jì)信息的附加能力較弱。盡管通過IFC 屬性的附加,模型具備了一定的類型及屬性信息[5],但是附加的信息仍然不能夠滿足設(shè)計(jì)需要。
目前,BIM 軟件主要有歐特克(Autodesk)、本特利(Bentley)和達(dá)索(Dassault)[5]。各軟件平臺(tái)在鐵路行業(yè)中的建模思路雖然命名不同[6-9],但基本可歸屬于“骨架-模板”模式[10-11]。
以達(dá)索平臺(tái)為例,鐵路行業(yè)內(nèi)多采用EKL 語言批量實(shí)例化用戶自定義特征 (UDF,User Define Feature)的方式建立骨架[12],該方法受限于EKL 語言的執(zhí)行效率和UDF 的實(shí)例化速度,在骨架線數(shù)量較多的時(shí)候生成速度較慢。并且UDF 作為骨架線的載體,附加的信息相當(dāng)有限,在設(shè)計(jì)及建模過程中需要設(shè)計(jì)人員進(jìn)行大量的手動(dòng)計(jì)算來確定模板實(shí)例化過程中需要的數(shù)據(jù)。
如1 圖1 所示,計(jì)算骨架線所需數(shù)據(jù)耗費(fèi)設(shè)計(jì)者大量的時(shí)間和精力,而采用UDF 無法省略該步驟的主要原因就是UDF 所能附加的信息不足,切無法包含復(fù)雜運(yùn)算。
為了解決上述問題,減少設(shè)計(jì)者重復(fù)工作,本文在鐵路隧道行業(yè)內(nèi)探索使用CAA 開發(fā)的方式將骨架線作為自定義特征[13],由設(shè)計(jì)基礎(chǔ)數(shù)據(jù)直接生成隧道骨架線。同時(shí)探索解決了設(shè)計(jì)信息附加的問題,開發(fā)人員可以任意添加骨架附加信息,提高了BIM設(shè)計(jì)的效率和質(zhì)量。
骨架線是模型模板的定位基準(zhǔn),在部分模型模板當(dāng)中還承擔(dān)定型的作用,同時(shí)是協(xié)同設(shè)計(jì)中重要的信息傳遞載體[14-15]。所以,骨架線是整個(gè)建模工作的基礎(chǔ)。鐵路行業(yè)內(nèi)的骨架線由總到分至少分為層。
線路總骨架由線路專業(yè)提供,是整條線路模型空間位置的最根本基礎(chǔ)??偣羌馨€路左線和線路右線,其中,線路左線包含線路左線平面、縱曲線、左線三維線路以及斷鏈表,線路右線包含線路右線平面、右線三維線路以及起止里程。骨架線模型,如圖2 所示。
以隧道專業(yè)為例,隧道專業(yè)總骨架為在線路總骨架左線上按隧道起終點(diǎn)里程截取的線段。目前,隧道專業(yè)總骨架使用UDF 特征,采用EKL 語言批量生成。
專業(yè)骨架可依據(jù)各專業(yè)實(shí)際需要細(xì)分為若干層,但本質(zhì)上都是將專業(yè)總骨架劃分為可以直接作為建?;鶞?zhǔn)細(xì)度的骨架線。以隧道專業(yè)為例,按照隧道襯砌類型表將隧道專業(yè)總骨架截?cái)?。襯砌類型表中的每一項(xiàng)對(duì)應(yīng)一條隧道專業(yè)骨架。隧道專業(yè)骨架線同樣適用UDF 特征,采用EKL 語言批量生成。
自定義特征是達(dá)索平臺(tái)CAA 開發(fā)提供的擴(kuò)展功能,可以由用戶自己根據(jù)實(shí)際需要和業(yè)務(wù)邏輯定義適合自己需要的特征。自定義特征可以附加大量的信息,并包含復(fù)雜的邏輯判斷和計(jì)算功能。
自定義特征的信息主要儲(chǔ)存在2 個(gè)部分。附加信息,如斷鏈表、骨架起終點(diǎn)里程記錄在Catalog 文件中,Catalog 文件由OSM 文件生成。確定自定義特征中所能存儲(chǔ)的信息類型,存儲(chǔ)某個(gè)自定義特征的具體信息數(shù)據(jù)。判斷邏輯和計(jì)算功能記錄在代碼生成的win64 文件中,通過將win64 文件部署到達(dá)索平臺(tái)安裝文件夾下特定位置調(diào)用,達(dá)到計(jì)算機(jī)代替設(shè)計(jì)人員進(jìn)行復(fù)雜數(shù)據(jù)計(jì)算的目的。Catalog 生成及作用,如圖3 所示。
在達(dá)索平臺(tái)內(nèi)部,一個(gè)特征的建立需要?dú)v經(jīng)數(shù)學(xué)特征、幾何特征、拓?fù)涮卣骱蜋C(jī)械特征4 個(gè)層級(jí)。
其中,機(jī)械特征的名稱主要因?yàn)檫_(dá)索平臺(tái)最初是為機(jī)械行業(yè)服務(wù),名稱一致沿用,鐵路行業(yè)最終生成的自定義特征應(yīng)該是機(jī)械特征。
數(shù)學(xué)特征包括生成特征所需的數(shù)值型數(shù)據(jù),如圓心坐標(biāo)值,圓半徑等。幾何特征在數(shù)字特征的基礎(chǔ)上增加了特征的幾何實(shí)體和空間位置等信息,是內(nèi)存中實(shí)際存在的幾何體。拓?fù)涮卣靼珻ATIA 特征所需的信息,可以參與拓?fù)溥\(yùn)算,如將曲線拉伸成曲面或?qū)⑶胬斐蓪?shí)體等。上述3 種特征存在內(nèi)存中,而機(jī)械特征才是最終出現(xiàn)在用戶可見的模板空間中的特征實(shí)體。數(shù)據(jù)生成自定義特征過程,如圖4所示。
骨架線二次開發(fā)主要需要實(shí)現(xiàn)2 方面功能,(1)通過讀取對(duì)話框內(nèi)輸入的設(shè)計(jì)數(shù)據(jù),生成單根骨架線。(2)通過讀取Excel 內(nèi)數(shù)據(jù)批量生成一系列的骨架線。
程序采用用戶接口組件模型,在同一框架下分為4 個(gè)模塊,分別是Addin.m, CommonFunction.m,Feat.m, UI.m,每個(gè)模塊下包含若干類和資源。
如圖5 所示軟件分為4 個(gè)模塊:
(1)Addin.m 模塊作用為將整個(gè)軟件實(shí)現(xiàn)的功能做成按鈕添加到軟件平臺(tái)當(dāng)中。
(2)CommonFunction.m 模塊內(nèi)包含一個(gè)名為CommonFunction 的類,該類中存儲(chǔ)了大量通用性函數(shù)。
(3)Feat.m 模塊定義了自定義特征的功能。包括數(shù)據(jù)的存入Catalog 和讀取,確定由數(shù)據(jù)到生成自定義特征的過程,確定自定義特征在結(jié)構(gòu)樹上顯示的屬性內(nèi)容等。
(4)UI.m 模塊包含內(nèi)容主要為對(duì)話框資源及對(duì)于部分對(duì)話框內(nèi)屬性數(shù)據(jù)的處理方法。
生成隧道骨架線需要的輸入元素及數(shù)據(jù)包括線路左線幾何圖形集、骨架起終點(diǎn)里程、版本號(hào)。其中,線路左線幾何圖形集下需要用到左線三維線位、左線平面線位以及斷鏈表。
骨架線生成流程,如圖6 所示。(1)骨架線起終點(diǎn)里程在對(duì)話框內(nèi)獲取以后,讀取斷鏈表內(nèi)信息,計(jì)算出起終點(diǎn)里程的實(shí)際位置;(2)由于鐵路工程中的里程長(zhǎng)度為平面線位的長(zhǎng)度,因此計(jì)算出的里程點(diǎn)應(yīng)該首先生成在平面線位上;(3)有平面線位上的起終點(diǎn)向Z 方向延伸與三維線位相交生成三維起終點(diǎn);(4)采用三維起終點(diǎn)截取左線三維骨架線,并結(jié)合版本號(hào)生成隧道專業(yè)骨架線。
由于該自定義特征將所有屬性信息都存儲(chǔ)在Catalog 當(dāng)中,可以通過自定義特征本身的更新適應(yīng)輸入元素及屬性的修改。與傳統(tǒng)UDF 骨架線相比極大地減少了設(shè)計(jì)人員工作量。
批量生成骨架線所需的屬性信息存儲(chǔ)在Excel 當(dāng)中,通過程序逐行讀取Excel 內(nèi)數(shù)據(jù)。結(jié)合對(duì)話框中讀取的左線幾何圖形集循環(huán)調(diào)用Feat.m 內(nèi)的功能批量生成隧道專業(yè)骨架線。批量生成骨架線流程,如圖7 所示。
在程序內(nèi)部,生成每根骨架線的具體功能(圖7 中藍(lán)色背景部分內(nèi)容)直接調(diào)用生成單根骨架線部分函數(shù),因此在修改過程中直接調(diào)用單根骨架線修改功能,可以方便的實(shí)施修改。
在達(dá)索平臺(tái)中,點(diǎn)在線上的定位通常采用點(diǎn)到曲線起點(diǎn)的距離。由于斷鏈的存在,鐵路線路上里程點(diǎn)間的距離并不一定等于兩個(gè)里程點(diǎn)之間的差值。因此在獲取里程點(diǎn)信息之后需要結(jié)合斷鏈表信息進(jìn)行計(jì)算,確定里程點(diǎn)在線路上的實(shí)際位置。
在使用UDF 作為隧道專業(yè)骨架線的方法中,由于UDF 無法存儲(chǔ)斷鏈表信息,也無法包含復(fù)雜計(jì)算,因此計(jì)算里程點(diǎn)實(shí)際位置的工作必須由設(shè)計(jì)者手動(dòng)完成,不但工作量巨大、容易出現(xiàn)錯(cuò)誤,也沒有辦法在線路或斷鏈表信息發(fā)生變化的時(shí)候通過自我更新來進(jìn)行修改。而采用自定義特征作為骨架線由于存儲(chǔ)了斷鏈表信息和里程點(diǎn)實(shí)際位置的計(jì)算方法,以上問題均不會(huì)出現(xiàn)。斷鏈表示意圖,如圖8 所示。
通常,斷鏈序號(hào)0 為線路起點(diǎn)里程。在從對(duì)話框內(nèi)得到里程點(diǎn)信息后,要判斷里程點(diǎn)位于哪個(gè)區(qū)間。由于斷鏈序號(hào)前里程和后里程之間的里程是不存在的,因此里程點(diǎn)必然會(huì)位于兩個(gè)斷鏈序號(hào)之間的區(qū)間,即前一斷鏈序號(hào)后里程以后,后一斷鏈序號(hào)前里程之前。確定里程點(diǎn)位置區(qū)間后,即可確定線路起點(diǎn)與里程點(diǎn)位置之間的斷鏈數(shù)量。然后循環(huán)執(zhí)行用里程點(diǎn)里程值線路起點(diǎn)里程的差值依次減去里程點(diǎn)前斷鏈后里程與前里程的差值,公式如下:
式中:
L——里程點(diǎn)距離線路起點(diǎn)的距離;
Df——里程點(diǎn)里程值;
DS——線路起點(diǎn)里程值;
n——里程點(diǎn)前斷鏈數(shù)量;
Di1——斷鏈序號(hào)i前里程值;
Di2——斷鏈序號(hào)i后里程值。
計(jì)算結(jié)果可直接采用達(dá)索平臺(tái)點(diǎn)到曲線起點(diǎn)距離定位的方式確定里程點(diǎn)實(shí)際位置。
需要注意的是,骨架線自定義特征內(nèi)由數(shù)據(jù)生成自定義特征過程函數(shù)定義在TunnelESKBuild::Build()函數(shù)中,該函數(shù)在自定義特征生成或輸入屬性值發(fā)生改變時(shí)自動(dòng)調(diào)用。但是由于骨架線自定義特征存儲(chǔ)的是線路左線幾何圖形集,并沒有直接存儲(chǔ)斷鏈表內(nèi)的數(shù)據(jù)信息,因此修改斷鏈表內(nèi)信息并不能觸發(fā)TunnelESKBuild::Build()函數(shù)的執(zhí)行。因此在斷鏈表信息更改后需要修改骨架自定義特征的版本屬性觸發(fā)更新。
通過C++語言進(jìn)行CAA 二次開發(fā)將骨架線作為自定義特征,實(shí)現(xiàn)了將線路信息、里程信息、斷鏈信息和計(jì)算方法等存儲(chǔ)于骨架線當(dāng)中。實(shí)現(xiàn)了設(shè)計(jì)信息從人為記錄計(jì)算到計(jì)算機(jī)存儲(chǔ)計(jì)算的轉(zhuǎn)變,提高了BIM 模型的信息化程度。成功解決了此前骨架線建立速度慢、前期計(jì)算量大易出錯(cuò)后期修改復(fù)雜的缺點(diǎn)。與傳統(tǒng)骨架線建立方法相比,其優(yōu)勢(shì)主要體現(xiàn)在以下幾個(gè)方面:
(1)前期計(jì)算由計(jì)算機(jī)代替設(shè)計(jì)人員完成,減輕了設(shè)計(jì)人員工作并減少了人工計(jì)算錯(cuò)誤的可能。
(2)UDF 由于自身原因,生成速度較慢,采用自定義特征方式加快了骨架線建模速度。
(3)骨架線包含更多設(shè)計(jì)信息,方便后續(xù)建模的使用,加強(qiáng)了信息的統(tǒng)一性和準(zhǔn)確性。
(4)面對(duì)上游數(shù)據(jù)的修改,可以更好的實(shí)現(xiàn)自我更新,減少了建模工作量,避免了依賴骨架線建立的模型因?yàn)楣羌芫€的修改而需要進(jìn)行的修改工作。