補舒棋,楊 蕾
(陜西省水利電力勘測設(shè)計研究院,陜西 西安 710001)
CAITA(法國達索軟件)在水利水電行業(yè)中的應用已經(jīng)越來越廣泛,其知識工程模塊的應用對解決工程設(shè)計智能批量化非常具有優(yōu)勢,該模塊為通過提供方便易用的知識工程環(huán)境來創(chuàng)建、訪問以及應用企業(yè)知識庫[1]。利用軟件的知識工程陣列功能可以實現(xiàn)幾何元素的批量實例化,CATIA 軟件自帶的陣列功能有時不能滿足復雜的設(shè)計要求,因此可利用知識工程陣列來達到目的。本文以某地下廠房洞室群為例,利用知識工程陣列及UDF(User Defined Feature)知識工程模板分別完成地下洞室錨桿及排水帷幕的自動批量實例化設(shè)計布置。
通過CATIA 知識工程模塊中的product knowledge template 創(chuàng)建知識工程陣列特征,該特征以腳本語言批處理(非交互)方式在CATIA 零件文檔中進行模板實例化、生成目標幾何元素(點、直線、曲線、圓、平面、曲面、體等),其特點能一次性自動在CATIA 零件文檔中處理生成重復性的幾何結(jié)構(gòu),是CATIA 知識工程高級應用[2]。
某地下洞室群布置見圖1,從左至右,三大洞室分別為主廠房洞室、主變洞室、尾水閘洞室。經(jīng)過有限元計算分析,地下洞室群錨桿布置型式為:主廠房、主變洞頂拱、上下游邊墻按Φ28@L=6 m/9 m 間隔布置,排距為1.5 m×1.5 m,尾水閘室按Φ28@L=6 m/9 m 間隔布置,排距為1.5 m×1.5 m。按照以上參數(shù)在CATIA 中運用知識工程陣列模板布置出三大洞室的錨桿型式及知識工程應用界面。
圖1 地下廠房主要洞室群錨桿布置
在知識工程陣列編輯器中來輸入代碼,并創(chuàng)建若干列表,列表對應相應的幾何圖形集,通過代碼定義列表(利用CATIA知識工程中的詞典Gernerative functions)來實現(xiàn)把創(chuàng)建的元素(利用詞典中的點構(gòu)造函數(shù)、運算構(gòu)造函數(shù)、線構(gòu)造函數(shù)、平面構(gòu)造函數(shù)等來創(chuàng)建幾何元素)依次按循環(huán)放入相應的幾何圖形集,相互關(guān)系見圖2,其設(shè)計難點主要在于如何實現(xiàn)長短錨桿交錯布置及參數(shù)的循環(huán)算法,設(shè)計步驟思路如下:
提取洞室外輪廓面→錨桿間距相隔的洞室輪廓線(用等間距的面橫向切割洞室輪廓面得到輪廓線)→將輪廓線由中心面一分為二→左半部分偶數(shù)序號輪廓線錨桿布置(單輪廓線上的的長短錨桿交錯布置通過內(nèi)部判斷輪廓線的等間距的點的奇偶來實現(xiàn))→左半部分奇數(shù)序號輪廓線錨桿布置(左半部分所有輪廓線的錨桿交錯布置通過輪廓線的奇偶數(shù)進行判斷)。
右半部分輪廓線錨桿布置與左半部分相同,只需在選擇halfc=split(c,`主要輪廓中心面`,true)中修改“true”為“false”得到另一側(cè)輪廓,再執(zhí)行知識工程陣列得到另一邊的錨桿布置,其最終布置見圖2。
圖2 知識工程陣列中列表、幾何元素之間的關(guān)系
代碼開始前先進行循環(huán)變量定義及幾何元素定義:let i(integer);let k(integer);let p(point);let pl(plane);let c(curve);let top(point);let halfc(curve);let phf(point);let j(integer);let L(line)。其中循環(huán)創(chuàng)建幾何元素是通過i,j,k 來進行實現(xiàn):k 為輪廓線總數(shù)目,i 為輪廓線的序號,j 為輪廓線上錨桿布置點的序號。
需實現(xiàn):第1 根輪廓線第1 點長錨桿,第2 點短錨桿,第3點長錨桿,第4 點短錨桿……
第2 根輪廓線第1 點短錨桿,第2 點長錨桿,第3 點短錨桿,第4 點長錨桿……
……
第i 根輪廓線第1 點短錨桿,第2 點長錨桿,第3 點短錨桿,第4 點長錨桿……
通過((j+i)+(i-1)*(k-1)-1)來實現(xiàn)循環(huán)輪廓線上每一個點的錨桿布置并存儲在列表中。
實現(xiàn)錨桿布置的關(guān)鍵代碼如下所示:
i=1 /*設(shè)定起始循環(huán)數(shù)值*/
k=int(length(`主要輪廓走線`)/`拱頂支護參數(shù)錨桿間距`)/*
設(shè)定外圍參數(shù)來控制循環(huán)數(shù)量*/
for i while i<=k
{ /*根據(jù)知識工程陣列中的Generative functions 創(chuàng)建需要的幾何元素,將定義好的元素給定相應的列表存放,并對應PART 中的相應的幾何圖形集,那么根據(jù)循環(huán)產(chǎn)生的元素就會依次生成放在幾何圖形集中。*/
p=CreateOrModifyDatum("point",`ALL point`,`關(guān)系知識工程陣列.2列表.1`,i)
/*定義外部幾何圖形集元素與列表對應,Dictionary 列表提供了可以在關(guān)系式中應用的函數(shù)、操作符以及特征屬性等項[1]*/
p=pointoncurve (`主要輪廓走線`,`主要輪廓起點`,`拱頂支護參數(shù)錨桿間距` *i,true) /*點構(gòu)造函數(shù)*/
pl=CreateOrModifyDatum("plane",`ALL plane`,`關(guān)系 知識工程陣列.2列表.2`,i)
/*同上,在洞室中心線上建立面集*/
pl=planenormal(`主要輪廓走線`,p) /*平面構(gòu)造函數(shù)*/
c=CreateOrModifyDatum("curve",`ALL opcurve` ,`關(guān)系知識工程陣列.2列表.3`,i) /*同上建立曲線集*/
c=intersect(`主要輪廓掃掠.1` ,`關(guān)系知識工程陣列.2列表.2` ->GetItem(i))
/*線框構(gòu)造函數(shù),利用洞室外輪廓面與每一個中心線上相隔布置間距的法方平面相交得到一個相交輪廓線*/
c.Color="Green" /*給線條賦色*/
top=CreateOrModifyDatum ("point",`ALL oppoints` ,`關(guān)系知識工程陣列.2列表.4`,i)
top=intersect (`關(guān)系知識工程陣列.2列表.3`->GetItem(i),`主要輪廓中心面` )
/*建立相交輪廓線上的起始端點,為陣列輪廓上錨桿布置做準備*/
halfc=CreateOrModifyDatum ("curve",`ALL ophalfcurve`,`關(guān)系知識工程陣列.2列表.5`,i) /*將相交輪廓線切割成兩半,先得到一半輪廓線*/
halfc=split(c,`主要輪廓中心面`,true)
j=1
if mod(i,2)==0 /*偶數(shù)的半邊輪廓線布置錨桿*/
{
for j while j<=int(length(halfc)/`拱頂支護參數(shù)錨桿間距`)
{
/*在洞室一半的輪廓線上根據(jù)建好的點來放錨桿,交錯布置*/
phf=CreateOrModifyDatum("point",`ALL halfcurvepoints` ,`關(guān)系知識工程陣列.2列表.6`,((j+i)+(i-1)*(k-1)-1))
phf=pointoncurve (halfc ,top ,`拱頂支護參數(shù)錨桿間距` *j ,true)
if mod(j,2)==0
{ L=CreateOrModifyDatum("line",linesonthehalfcurve,`關(guān)系知識工程陣列.2列表.7`,((j+i)+(i-1)*(k-1)-1))
L=lineangle (halfc,pl,phf,true,0mm,`錨桿1 長`,90deg,true)
/*陣列錨桿,通過外部參數(shù)`錨桿1 長`控制錨桿交錯布置長度*/
L.Color="green"
}
else
{ L=CreateOrModifyDatum("line",linesonthehalfcurve,`關(guān)系知識工程陣列.2列表.7`,((j+i)+(i-1)*(k-1)-1))
L=lineangle(halfc,pl,phf,true,0mm,`錨桿2 長`, 90deg,true)
L.Color="blue"
}
}
}
else {……} /*奇數(shù)的半邊輪廓線布置錨桿在此不贅述*/
按以上知識工程代碼步驟創(chuàng)建錨桿陣列,通過替換相應的洞室輪廓線,可創(chuàng)建其他洞室輪廓線上的錨桿陣列。
排水系統(tǒng)布置見圖3,需要在地下廠房上游及兩側(cè)布置三層排水廊道及排水帷幕,排水帷幕主要為排水廊道頂拱和底板上布置的長度不等的排水孔,排水孔為Φ76,間距3 m,通過排水帷幕攔截廠房周圍圍巖的地下水,從而達到降低廠區(qū)地下水的目的,與洞室輪廓線的錨桿知識陣列不同的是,在排水帷幕的布置中使用了結(jié)合UDF 知識工程模板進行知識工程陣列的方式,首先需創(chuàng)建排水孔模板,將其加入自定的目錄庫,定義其相應特征及存儲名稱,以方便代碼中直接輸入相應的名稱就可以識別并調(diào)用該UDF 模板,其次調(diào)用UDF 后,再編寫將其進行陣列的代碼。
1)創(chuàng)建UDF 模板:建立排水孔“輸入條件”,即給定點、排水孔陣列的方向;其次創(chuàng)建相關(guān)參數(shù);排水孔長度、孔間距、孔與排水廊道夾角等參數(shù),編輯草圖定義參數(shù)完成排水孔建模,最后插入知識工程模板中的用戶特征。定義用戶特征時,內(nèi)部部件選擇“輸入條件”以外的所有參數(shù),發(fā)布相關(guān)參數(shù)。
2)調(diào)用UDF 模板及相關(guān)代碼:定義用戶特征中應自動指定SuperType 及生成Type 類型,在目錄knowledgeTypesCustom 生成PktCylinder.CATGScript 文件,以此完成排水孔知識工程模板創(chuàng)建,以下為調(diào)用并陣列模板的知識工程代碼。
let i(integer) /*實數(shù)*/
let p(point) /*點*/
let udf(LDPS1) /*UDF 模板*/
i=1
for i while i<= int(length(`上層設(shè)計過程設(shè)計曲線`)/`排水孔間距`) /*創(chuàng)建UDF 輸入條件的點集*/
{
p=CreateOrModifyDatum ("point",`points`,`關(guān)系知識工程陣列.1points` ,i)
p=pointoncurve(`上層設(shè)計過程設(shè)計曲線`,`上層設(shè)計過程端點`,i*`排水孔間距` ,true)
udf=CreateOrModifyTemplate ("psk",`sldps`,`關(guān)系知識工程陣列.1PSK` ,i) /*調(diào)用UDF 模板*/
udf.P =p
udf.L =`上層設(shè)計過程設(shè)計曲線` /* 設(shè)置UDF 模板輸入條件*/
EndModifyTemplate(udf) /*結(jié)束模板實例化*/
}
按以上知識工程代碼步驟創(chuàng)建的排水帷幕見圖3。
圖3 排水廊道及錨桿布置
通過以上知識工程陣列在洞室錨桿支護布置及排水帷幕布置中的應用,實現(xiàn)了批量自動可視化設(shè)計工作,利用碰撞檢查提高了洞室布置設(shè)計的合理性,同時其成果對于類似工作的批量化操作可重復利用,大大提高了工作效率和質(zhì)量,從側(cè)面也反映出CATIA 知識工程模塊解決類似問題的優(yōu)越性,希望以上的設(shè)計思路及代碼能對其他工程技術(shù)人員解決類似問題時起到一定的借鑒作用。