程 浩,胡合江,余 巍
(中國電力工程顧問集團中南電力設計院有限公司,湖北 武漢 430071)
目前,隨著BIM技術的迅速普及,廣大設計企業對正向設計方法的探索不斷深入,各軟件之間設計信息和數據傳輸的需求也隨之不斷增加。結合前述原因,在Staad.Pro軟件完成上部結構的內力分析之后接續基礎設計的需求顯得日益迫切,而其中的關鍵在于支座反力的讀取。由于Staad.Pro軟件的模型文件和內力結果文件都是公開的,其輸入命令流和輸出結果的格式也有相關的說明,因此可以考慮編寫程序完成這一過程,國內已有不少相關的研究:胡小龍等[6]基于Staad.Pro軟件的計算結果編寫相關的計算程序,以完成鍋爐爐架及變電構架的設計;喬愛科等[7]利用VC++和AutoCAD二次開發工具ARX編制了自動化的可視化后處理應用軟件,可提取Staad.Pro軟件計算模型的數據,擴展了其后處理功能;魏亮等[8]介紹了一些Staad.Pro軟件二次開發的經驗,并對開發過程中存儲、查詢數據的2種方案的效率進行比較;李金光等[9]介紹了基于Staad.Pro軟件開發的3個輔助程序,提高了工作效率;葉蔥蔥[10]使用VB對Staad.Pro軟件進行二次開發,完成了輸煤棧橋混凝土構件和基礎設計的程序。從以上研究中可知,對Staad.Pro軟件進行二次開發以讀取支座反力是一種簡便可行的方法,本文將對一些相關問題進行討論。
Staad.Pro的輸入文件為*.std格式,輸出結果文件為*.anl格式,都可直接采用記事本打開查看,可以比較方便地分析其內容的組織和格式,編寫相應的代碼以獲取需要的內容,文獻[8]介紹了一些讀取這兩個文件的基本要點。對于支座反力而言,需要從*.std文件中讀取支座坐標以及荷載工況等,從*.anl文件中讀取各支座在各工況下的反力值,為保證程序能夠正確穩定的讀取,還有以下需要注意的問題:
(1)Staad.Pro默認在輸出文件中打印輸入文件中的所有內容,因此在一般情況下,僅需從*.anl文件中就可讀取到所有的信息。當在輸入命令流中使用SET ECHO OFF命令時,自該命令之后的內容將不再輸出文件中打印,對于此種情況,需考慮同時從*.std文件中讀取部分信息。
(2)Staad.Pro默認采用Y軸作為豎向軸,但也提供了SET Z UP命令將Z軸作為豎向軸,因此在讀取過程中必須檢測輸入文件中是否存在此命令,以正確判斷支座反力的方向。
(3)需要在命令流中添加PRINT SUPPORT REACTIONS命令才能將支座反力輸出到*.anl文件中,當輸入命令流中不存在此命令時,需要提示用戶進行操作。此外,PRINT ANALYSIS RESULTS也能達到同樣的目的,但它是PRINT SUPPORT REAC TIONS、PRINT MEMBER FORCES以及PRINT JOINT DISPLACEMENTS三個命令之和,當只需要輸出支座反力而不需要其他結果時,此命令將導致*.anl文件較大,對文件讀取速度有較大的影響,應盡量避免。
(4)Staad.Pro可通過命令流控制所需要輸出的荷載工況和支座。對于荷載工況,可以采用LOAD LIST即“有效荷載”命令控制輸出的荷載工況,Staad.Pro將僅輸出在LOAD LIST之后所列出的荷載工況。對于支座反力同理,在PRINT SUPPORT REACTIONS命令之后添加LIST,可以僅輸出其后所列出的支座的反力。因此,從輸出文件中并不一定能獲取所有的支座反力,在出現此情況時對用戶發出提示是比較有必要的。在輸出文件的PROBLEM STATISTICS項中列出了項目的總體信息,如圖1所示,可以獲取到當前項目中的支座及荷載工況的數量,便于與實際讀取到的數量進行比較。

圖1 輸出文件中的PROBLEM STATISTICS項
(5)部分命令流有簡寫的方式,如PRINT SUPPORT REACTIONS簡寫為PRI SUP REA,PRINT ANALYSIS RESULTS簡寫為PRI ANA RES,更多簡寫的命令可查詢Staad.Pro的相關技術說明,讀取過程中需要對完整和簡寫的情況均進行識別。
(6)支座反力輸出的單位和格式。支座反力輸出內容的示例,如圖2所示。首行的“-UNIT KN METE”列出了支座反力的單位。Staad.Pro中長度和力的單位見表1和表2,在讀取或后續的輸出過程中需注意進行轉換。從圖2中可見,支座反力在輸出文件中是依次按節點和工況順序輸出的,不同的支座之間沒有其他標記,只在每個支座首行的開頭列出了支座編號。此外,當支座反力的輸出結果跨越多頁時,在每頁的開頭都將重新列出表頭,即圖2中方框內的部分,在讀取的過程中應予以忽略。

表2 Staad.Pro命令流中的力單位

圖2 輸出文件中的支座反力

表1 Staad.Pro命令流中的長度單位
如前所述,*.std和*.anl的文件格式都是公開的,因此一般的開發語言都能夠直接讀取其中的信息,本文以C#為例介紹支座反力的讀取方式。
其中金錢是一塊塊脊柱骨,外圓內空,如同一枚枚金錢。所謂釣蟾就是將丹田之氣,過海底上脊椎,撐命門,入玄關。因為入海底之下有尾閭下關,這關口是真氣極不容易過的,所以叫釣蟾!”
(1)文件內容的讀取。C#提供了StreamReader類用于讀取文本文件,為方便后續的查找操作,可采用逐行讀取的方式,對于讀取到的每一行內容,調用string類的ToUpper方法將其統一轉換成大寫,再將其存儲到List
(2)關鍵信息的提取。提取關鍵信息的主要過程就是對文件的查找和搜索過程,一般這些關鍵內容都是隨著某些關鍵字一起出現,如“NUMBER OF SUPPORTS”等,因此首先需要找到關鍵字所在的位置,再獲取相關的內容。還有部分關鍵信息具有特定的格式,如支座反力的首行數據以支座編號開始,后續為工況編號以及6個內力數據,中間由一個或多個空格分隔,而其它行只有工況編號以及6個內力。C#提供了正則表達式Regex類,可以用于查找和匹配具有特定字符或格式的字符串,對于需要的信息,在了解其關鍵字和格式之后即可編寫出用于匹配的模式,如對于支座數量的獲取可以采用匹配模式:NUMBERs+OFs+SUPPORTSs+[1-9]d*,對于支座反力的首行采用匹配模式:^s+[1-9]d*s+[1-9]d*(s+(-?d+)(.d+)?){6}$等,在獲取匹配的內容之后,再進行字符串的分割和提取操作即可得到所需要的內容。
(3)數據的存儲。文獻[8]通過將數組和散列表對比,發現使用散列表來存儲數據的效率遠高于數組。C#中的Dictionary容器即是一種散列表,因此適合用來存儲支座反力。首先構建由節點號、荷載工況號和支座反力組成的JointLoad類來存儲一個支座在一個工況下的支座反力;然后建立以荷載工況號為key,JointLoad為value的Dictionary
對于支座反力的讀取和輸出往往有獲取其極值或排序等其它操作,一種比較方便的方式是利用C#面向對象的特性,創建繼承于Dictionary
圖3為某工程500 kV變電構架,其上部結構采用Staad.Pro進行內力分析,在桿件截面設計完成之后,基礎采用基于Revit開發的變電構支架基礎設計程序進行三維正向設計,基礎采用天然基礎。

圖3 某500 kV變電構架
在基礎設計過程中需要輸入柱腳的設計荷載,程序雖然提供了荷載輸入的功能,但是因柱腳和荷載工況較多,需要設計人員在Staad.Pro軟件中篩選部分荷載工況之后再輸入到軟件當中,這往往會耗費較多的時間,且存在遺漏最不利工況的可能。程序在后續開發過程中引入了本文上述介紹的方法,提供了從Staad.Pro讀取上部結構荷載的功能,在上部結構設計完成之后,直接從輸出文件中讀取支座反力,再經必要的設置和調整,即可獲取基礎的設計荷載。
如圖4所示,對于荷載工況,Staad.Pro本身只進行單工況和組合工況的區分,對于組合工況則并不區分具體的類型,也不區分是否為地震工況,在設置導入的荷載工況時,程序可對荷載工況的類型進行初步判斷,并可由用戶進行調整。

圖4 Staad.Pro荷載工況導入設置界面
導入之后的基礎設計荷載如圖5所示,其中荷載作用點標高可從支座的坐標中讀取以作為默認值,也可由用戶進行修改。此后,基礎設計程序即可使用導入的荷載完成基礎計算及后續設計過程。

圖5 導入后的基礎設計荷載
本工程通過在基礎設計程序中引入支座反力讀取的模塊,實現了從Staad.Pro上部結構計算到基礎設計荷載輸入的接口,簡化了人工篩選及輸入荷載工況的過程,提高了基礎設計程序的便利性和設計工作效率。
本文介紹了通過讀取Staad.Pro輸入和輸出文件以獲取支座反力的一些要點,指出了在解析文件格式過程中的一些關鍵問題;并以C#語言為例,介紹了讀取支座反力的具體方法;最后通過在程序開發以及實際工程中的應用,驗證了其在基礎設計過程中的可行性及便利性。