程 浩,胡合江,余 巍
(中國電力工程顧問集團(tuán)中南電力設(shè)計(jì)院有限公司,湖北 武漢 430071)
目前,隨著BIM技術(shù)的迅速普及,廣大設(shè)計(jì)企業(yè)對(duì)正向設(shè)計(jì)方法的探索不斷深入,各軟件之間設(shè)計(jì)信息和數(shù)據(jù)傳輸?shù)男枨笠搽S之不斷增加。結(jié)合前述原因,在Staad.Pro軟件完成上部結(jié)構(gòu)的內(nèi)力分析之后接續(xù)基礎(chǔ)設(shè)計(jì)的需求顯得日益迫切,而其中的關(guān)鍵在于支座反力的讀取。由于Staad.Pro軟件的模型文件和內(nèi)力結(jié)果文件都是公開的,其輸入命令流和輸出結(jié)果的格式也有相關(guān)的說明,因此可以考慮編寫程序完成這一過程,國內(nèi)已有不少相關(guān)的研究:胡小龍等[6]基于Staad.Pro軟件的計(jì)算結(jié)果編寫相關(guān)的計(jì)算程序,以完成鍋爐爐架及變電構(gòu)架的設(shè)計(jì);喬愛科等[7]利用VC++和AutoCAD二次開發(fā)工具ARX編制了自動(dòng)化的可視化后處理應(yīng)用軟件,可提取Staad.Pro軟件計(jì)算模型的數(shù)據(jù),擴(kuò)展了其后處理功能;魏亮等[8]介紹了一些Staad.Pro軟件二次開發(fā)的經(jīng)驗(yàn),并對(duì)開發(fā)過程中存儲(chǔ)、查詢數(shù)據(jù)的2種方案的效率進(jìn)行比較;李金光等[9]介紹了基于Staad.Pro軟件開發(fā)的3個(gè)輔助程序,提高了工作效率;葉蔥蔥[10]使用VB對(duì)Staad.Pro軟件進(jìn)行二次開發(fā),完成了輸煤棧橋混凝土構(gòu)件和基礎(chǔ)設(shè)計(jì)的程序。從以上研究中可知,對(duì)Staad.Pro軟件進(jìn)行二次開發(fā)以讀取支座反力是一種簡便可行的方法,本文將對(duì)一些相關(guān)問題進(jìn)行討論。
Staad.Pro的輸入文件為*.std格式,輸出結(jié)果文件為*.anl格式,都可直接采用記事本打開查看,可以比較方便地分析其內(nèi)容的組織和格式,編寫相應(yīng)的代碼以獲取需要的內(nèi)容,文獻(xiàn)[8]介紹了一些讀取這兩個(gè)文件的基本要點(diǎn)。對(duì)于支座反力而言,需要從*.std文件中讀取支座坐標(biāo)以及荷載工況等,從*.anl文件中讀取各支座在各工況下的反力值,為保證程序能夠正確穩(wěn)定的讀取,還有以下需要注意的問題:
(1)Staad.Pro默認(rèn)在輸出文件中打印輸入文件中的所有內(nèi)容,因此在一般情況下,僅需從*.anl文件中就可讀取到所有的信息。當(dāng)在輸入命令流中使用SET ECHO OFF命令時(shí),自該命令之后的內(nèi)容將不再輸出文件中打印,對(duì)于此種情況,需考慮同時(shí)從*.std文件中讀取部分信息。
(2)Staad.Pro默認(rèn)采用Y軸作為豎向軸,但也提供了SET Z UP命令將Z軸作為豎向軸,因此在讀取過程中必須檢測(cè)輸入文件中是否存在此命令,以正確判斷支座反力的方向。
(3)需要在命令流中添加PRINT SUPPORT REACTIONS命令才能將支座反力輸出到*.anl文件中,當(dāng)輸入命令流中不存在此命令時(shí),需要提示用戶進(jìn)行操作。此外,PRINT ANALYSIS RESULTS也能達(dá)到同樣的目的,但它是PRINT SUPPORT REAC TIONS、PRINT MEMBER FORCES以及PRINT JOINT DISPLACEMENTS三個(gè)命令之和,當(dāng)只需要輸出支座反力而不需要其他結(jié)果時(shí),此命令將導(dǎo)致*.anl文件較大,對(duì)文件讀取速度有較大的影響,應(yīng)盡量避免。
(4)Staad.Pro可通過命令流控制所需要輸出的荷載工況和支座。對(duì)于荷載工況,可以采用LOAD LIST即“有效荷載”命令控制輸出的荷載工況,Staad.Pro將僅輸出在LOAD LIST之后所列出的荷載工況。對(duì)于支座反力同理,在PRINT SUPPORT REACTIONS命令之后添加LIST,可以僅輸出其后所列出的支座的反力。因此,從輸出文件中并不一定能獲取所有的支座反力,在出現(xiàn)此情況時(shí)對(duì)用戶發(fā)出提示是比較有必要的。在輸出文件的PROBLEM STATISTICS項(xiàng)中列出了項(xiàng)目的總體信息,如圖1所示,可以獲取到當(dāng)前項(xiàng)目中的支座及荷載工況的數(shù)量,便于與實(shí)際讀取到的數(shù)量進(jìn)行比較。
圖1 輸出文件中的PROBLEM STATISTICS項(xiàng)
(5)部分命令流有簡寫的方式,如PRINT SUPPORT REACTIONS簡寫為PRI SUP REA,PRINT ANALYSIS RESULTS簡寫為PRI ANA RES,更多簡寫的命令可查詢Staad.Pro的相關(guān)技術(shù)說明,讀取過程中需要對(duì)完整和簡寫的情況均進(jìn)行識(shí)別。
(6)支座反力輸出的單位和格式。支座反力輸出內(nèi)容的示例,如圖2所示。首行的“-UNIT KN METE”列出了支座反力的單位。Staad.Pro中長度和力的單位見表1和表2,在讀取或后續(xù)的輸出過程中需注意進(jìn)行轉(zhuǎn)換。從圖2中可見,支座反力在輸出文件中是依次按節(jié)點(diǎn)和工況順序輸出的,不同的支座之間沒有其他標(biāo)記,只在每個(gè)支座首行的開頭列出了支座編號(hào)。此外,當(dāng)支座反力的輸出結(jié)果跨越多頁時(shí),在每頁的開頭都將重新列出表頭,即圖2中方框內(nèi)的部分,在讀取的過程中應(yīng)予以忽略。
表2 Staad.Pro命令流中的力單位
圖2 輸出文件中的支座反力
表1 Staad.Pro命令流中的長度單位
如前所述,*.std和*.anl的文件格式都是公開的,因此一般的開發(fā)語言都能夠直接讀取其中的信息,本文以C#為例介紹支座反力的讀取方式。
其中金錢是一塊塊脊柱骨,外圓內(nèi)空,如同一枚枚金錢。所謂釣蟾就是將丹田之氣,過海底上脊椎,撐命門,入玄關(guān)。因?yàn)槿牒5字掠形查傁玛P(guān),這關(guān)口是真氣極不容易過的,所以叫釣蟾!”
(1)文件內(nèi)容的讀取。C#提供了StreamReader類用于讀取文本文件,為方便后續(xù)的查找操作,可采用逐行讀取的方式,對(duì)于讀取到的每一行內(nèi)容,調(diào)用string類的ToUpper方法將其統(tǒng)一轉(zhuǎn)換成大寫,再將其存儲(chǔ)到List
(2)關(guān)鍵信息的提取。提取關(guān)鍵信息的主要過程就是對(duì)文件的查找和搜索過程,一般這些關(guān)鍵內(nèi)容都是隨著某些關(guān)鍵字一起出現(xiàn),如“NUMBER OF SUPPORTS”等,因此首先需要找到關(guān)鍵字所在的位置,再獲取相關(guān)的內(nèi)容。還有部分關(guān)鍵信息具有特定的格式,如支座反力的首行數(shù)據(jù)以支座編號(hào)開始,后續(xù)為工況編號(hào)以及6個(gè)內(nèi)力數(shù)據(jù),中間由一個(gè)或多個(gè)空格分隔,而其它行只有工況編號(hào)以及6個(gè)內(nèi)力。C#提供了正則表達(dá)式Regex類,可以用于查找和匹配具有特定字符或格式的字符串,對(duì)于需要的信息,在了解其關(guān)鍵字和格式之后即可編寫出用于匹配的模式,如對(duì)于支座數(shù)量的獲取可以采用匹配模式:NUMBERs+OFs+SUPPORTSs+[1-9]d*,對(duì)于支座反力的首行采用匹配模式:^s+[1-9]d*s+[1-9]d*(s+(-?d+)(.d+)?){6}$等,在獲取匹配的內(nèi)容之后,再進(jìn)行字符串的分割和提取操作即可得到所需要的內(nèi)容。
(3)數(shù)據(jù)的存儲(chǔ)。文獻(xiàn)[8]通過將數(shù)組和散列表對(duì)比,發(fā)現(xiàn)使用散列表來存儲(chǔ)數(shù)據(jù)的效率遠(yuǎn)高于數(shù)組。C#中的Dictionary容器即是一種散列表,因此適合用來存儲(chǔ)支座反力。首先構(gòu)建由節(jié)點(diǎn)號(hào)、荷載工況號(hào)和支座反力組成的JointLoad類來存儲(chǔ)一個(gè)支座在一個(gè)工況下的支座反力;然后建立以荷載工況號(hào)為key,JointLoad為value的Dictionary
對(duì)于支座反力的讀取和輸出往往有獲取其極值或排序等其它操作,一種比較方便的方式是利用C#面向?qū)ο蟮奶匦裕瑒?chuàng)建繼承于Dictionary
圖3為某工程500 kV變電構(gòu)架,其上部結(jié)構(gòu)采用Staad.Pro進(jìn)行內(nèi)力分析,在桿件截面設(shè)計(jì)完成之后,基礎(chǔ)采用基于Revit開發(fā)的變電構(gòu)支架基礎(chǔ)設(shè)計(jì)程序進(jìn)行三維正向設(shè)計(jì),基礎(chǔ)采用天然基礎(chǔ)。
圖3 某500 kV變電構(gòu)架
在基礎(chǔ)設(shè)計(jì)過程中需要輸入柱腳的設(shè)計(jì)荷載,程序雖然提供了荷載輸入的功能,但是因柱腳和荷載工況較多,需要設(shè)計(jì)人員在Staad.Pro軟件中篩選部分荷載工況之后再輸入到軟件當(dāng)中,這往往會(huì)耗費(fèi)較多的時(shí)間,且存在遺漏最不利工況的可能。程序在后續(xù)開發(fā)過程中引入了本文上述介紹的方法,提供了從Staad.Pro讀取上部結(jié)構(gòu)荷載的功能,在上部結(jié)構(gòu)設(shè)計(jì)完成之后,直接從輸出文件中讀取支座反力,再經(jīng)必要的設(shè)置和調(diào)整,即可獲取基礎(chǔ)的設(shè)計(jì)荷載。
如圖4所示,對(duì)于荷載工況,Staad.Pro本身只進(jìn)行單工況和組合工況的區(qū)分,對(duì)于組合工況則并不區(qū)分具體的類型,也不區(qū)分是否為地震工況,在設(shè)置導(dǎo)入的荷載工況時(shí),程序可對(duì)荷載工況的類型進(jìn)行初步判斷,并可由用戶進(jìn)行調(diào)整。
圖4 Staad.Pro荷載工況導(dǎo)入設(shè)置界面
導(dǎo)入之后的基礎(chǔ)設(shè)計(jì)荷載如圖5所示,其中荷載作用點(diǎn)標(biāo)高可從支座的坐標(biāo)中讀取以作為默認(rèn)值,也可由用戶進(jìn)行修改。此后,基礎(chǔ)設(shè)計(jì)程序即可使用導(dǎo)入的荷載完成基礎(chǔ)計(jì)算及后續(xù)設(shè)計(jì)過程。
圖5 導(dǎo)入后的基礎(chǔ)設(shè)計(jì)荷載
本工程通過在基礎(chǔ)設(shè)計(jì)程序中引入支座反力讀取的模塊,實(shí)現(xiàn)了從Staad.Pro上部結(jié)構(gòu)計(jì)算到基礎(chǔ)設(shè)計(jì)荷載輸入的接口,簡化了人工篩選及輸入荷載工況的過程,提高了基礎(chǔ)設(shè)計(jì)程序的便利性和設(shè)計(jì)工作效率。
本文介紹了通過讀取Staad.Pro輸入和輸出文件以獲取支座反力的一些要點(diǎn),指出了在解析文件格式過程中的一些關(guān)鍵問題;并以C#語言為例,介紹了讀取支座反力的具體方法;最后通過在程序開發(fā)以及實(shí)際工程中的應(yīng)用,驗(yàn)證了其在基礎(chǔ)設(shè)計(jì)過程中的可行性及便利性。