UIDL-Tcl/Tk-APDL聯合編程實現ANSYS二次開發(終極篇)
本次介紹的是ANSYS的二次開發,二次開發不是為了將軟件應用的如何花哨,而是為了更好更快捷的應用軟件,有些軟件對一些問題的分析過程晦澀難懂,或者是操作過程繁瑣,再或者大量重復性工作,二次開發能夠有效解決這些問題,大大方便用戶(尤其是非專業用戶)的使用。
一、UIDL
ANSYS的界面開發語言有UIDL和Tcl/Tk兩種,Tcl/Tk能夠觸及深處因此能夠開發的界面功能更加強大,UIDL則是ANSYS本身的開發語言,能夠對ANSYS的菜單進行一些開發,得到新的菜單功能,或者可以對已有的菜單進行修改等。
對于編程者而言其實界面不那么重要,可有可無,而對于使用者而言界面就變得尤為重要。
ANSYS的界面開發的相關文件位于F:\Program Files\ANSYS Inc\v160\ansys\gui\en-us\UIDL目錄下面,其中的引用文件menulist160.ans就引用了相關的GRN和AUI文件,自行開發的UIDL文件如果要使用,也必須在這個文件進行引用,同時UIDL文件也要放在這個目錄下面。
UIDL開發的文件擴展名是GRN,利用UIDL編寫開發有其固定的格式。
抬頭是控制頭文件,由一系列的UIDL命令組成,且必須以冒號開頭,其結構如下:
:F UIMENU.GRN
:D Modefied %E%,Revision(SID)=%I%
:I 0, 0, 0
:!
第一行:F Filename 控制文件名稱
:N 定義唯一的構造塊名稱
:S 描述構造塊的位置信息,這個當引用后會自動更新
:T 描述構造塊的類型,可分為Menu,Cmd,Help等類型
:A 對不同類型的構造塊有不同的功能,在Menu中為必須的,定義出現在GUI中的子菜單的名稱
:D 描述構造塊的信息
:C 用于執行APDL命令
以下是一段完整的菜單欄的UIDL代碼,創建了一個新的菜單,在菜單欄的最下面,菜單名稱為Input Parameter.
:F Screwmenu.GRN !建立名稱為Scremenu.GRN的控制文件
:D Modefied on %E%,Revision(SID)=%I%
:I 0, 0, 0 !第9,18,27行
:!
:N MenuRoot !定義的構造塊名稱
:S 0, 0, 0 !第9,16,23行
:T Menu !模塊為菜單模塊類型
:A Ansys Main Menu !主菜單的菜單名
:D ANSYS Main MENU !以上四行是模塊首部
Men_UVBA_Main_T1 !以下是數據控制部分
Men_UVBA_Main_T2
Men_UVBA_Main_T3
Fnc_preferences !調用功能模塊
Sep_ !分割線
Men_Preproc !調用菜單模塊
Men_Solution !調用求解模塊
Men_GenlPost !調用通用后處理模塊
Men_TimePost !調用時間歷程后處理模塊
K_LN(DROPTEST)
Sep_
K_LN(DROPTEST)
Men_DropTest
Sep_
Men_ToPo
Men_ROM
Men_DesXplorerVT
K_LN(alpha)
Men_DesOpt
K_LN(ALPHA)
Men_DesOpt_al
Men_ProbDesign
Men_Aux12
Men_RunStat
Sep_
Fnc_UNDO
Sep_
Fnc_FINISH !以上是菜單的一般形式
Sep_
Men_input !添加菜單
K_LN(UTILMENU)
Men_utilMenu
Men_UVBA_Main_B1
Men_UVBA_Main_B2
Men_UVBA_Main_B3
:E END !該行是模塊尾行
:N Men_input
:S 0, 0, 0
:T Menu
:A Input Parameter
:D Input Parameter
:C) Multipro,'start',4 !創建對話框
:C) /prep7
:C) *cset,1,3,A,'Parameter A',5
:C) *cset,4,6,B,'Parameter B',10
:C) *cset,7,9,C,'Parameter C',15
:C) *cset,10,12,D,'Parameter D',20
:C) Multipro,'end'
:E END
將上述UIDL代碼保存在GRN文件中,復制到之前所說的目錄下面,并修改ans文件添加引用,重新打開ANSYS即可自動加載,最終顯示的菜單欄如下所示。

圖1
由于在創建新菜單的時候用來ANSYS自帶的APDL命令multipro,因此點擊該菜單會自動彈出一個對話框用于設置幾個參數。點擊對話框的OK按鈕后及設置了4個參數,可以在ANSYS的主菜單欄查看,如下所示。

圖2
這里面用到的*cset和multipro命令可以查看筆者之前的文章查看其用法。
可以注意到,上面一大段的UIDL代碼創建新菜單的同時也引用了ANSYS的原來很多菜單,因此可以修改或者刪除其中的一些命令,那么菜單就可以按照自己的意愿分布。
如果將UIDL代碼縮短為如下:
:F Screwmenu.GRN !建立名稱為Scremenu.GRN的控制文件
:D Modefied on %E%,Revision(SID)=%I%
:I 0, 0, 0 !第9,18,27行
:!
:N MenuRoot !定義的構造塊名稱
:S 0, 0, 0 !第9,16,23行
:T Menu !模塊為菜單模塊類型
:A Ansys Main Menu !主菜單的菜單名
:D ANSYS Main MENU !以上四行是模塊首部
Sep_
Men_input !添加菜單
K_LN(UTILMENU)
Men_utilMenu
Men_UVBA_Main_B1
Men_UVBA_Main_B2
Men_UVBA_Main_B3
:E END !該行是模塊尾行
:N Men_input
:S 0, 0, 0
:T Menu
:A Input Parameter
:D Input Parameter
:C) Multipro,'start',4 !創建對話框
:C) /prep7
:C) *cset,1,3,A,'Parameter A',5
:C) *cset,4,6,B,'Parameter B',10
:C) *cset,7,9,C,'Parameter C',15
:C) *cset,10,12,D,'Parameter D',20
:C) Multipro,'end'
:E END
那么重新打開ANSYS后即可顯示如下圖所示的菜單分布。

圖3
很明顯,此時只剩下一個創建的按鈕而已。
基于此,再結合APDL,可以將某個結構的自動化分析過程完全做成幾個菜單就能解決的問題,不需要人為的干預。
本次實例創建一個建模(螺旋體),創建的單菜單欄代碼如下:
:F Helixmenu.GRN
:D Modefied on %E%,Revision(SID)=%I%
:I 0, 0, 0
:!
:N MenuRoot
:S 0, 0, 0
:T Menu
:A Ansys Main Menu
:D ANSYS Main MENU
Men_input
K_LN(UTILMENU)
Men_utilMenu
Men_UVBA_Main_B1
Men_UVBA_Main_B2
Men_UVBA_Main_B3
:E END
:N Men_input
:S 0, 0, 0
:T Menu
:A Creat Helix
:D Creat Helix
:C) ~tcl,'source creathelix.tcl'
:E END
在ANSYS中構件的菜單如下圖所示:

圖4
二、APDL
參數化某結構的建模過程如下:
/prep7
R=25
H=3
N=10
Rr=1
*DIM,THETA,ARRAY,N*3+1
*VFILL,THETA(1),RAMP,0,360/3
*AFUN,DEG
CSYS,1
*DO,I,1,N*3+1
K,I,R,THETA(I),H*(I-1)
*ENDDO
*DO,I,1,N*3
L,I,I+1
*ENDDO
*DO,I,0,N*3-1
LWPLAN,-1,I+1,0
CYL4,0,0,Rr
*ENDDO
*DO,I,1,N*3
VDRAG,I,,,,,,I
*ENDDO
ET,1,45
TYPE,1
VMESH,ALL
三、Tcl/Tk
Tcl稱為“工具命令語言”"Tool Command Language",是一種腳本語言。Tk則是基于Tcl的圖形界面開發工具箱,與UIDL相比,更能夠觸及深層,因此更加靈活,開發的界面受限更少。Tcl/Tk在用于圖形化界面開發的時候比較好用,界面開發較為靈活,除了上面的這種簡單界面的開發,也能夠開發比較系統全面的界面,結合Tcl語言本身就能夠完成很多的工作,對于參數化過程非常方便。
#Tcl/Tk編寫界面
set w [toplevel .ef]
set Font "Times 14 bold"
wm title $w "Creat Model"
#初始化參數值
set R 25
set N 10
set H 3
set Rr 1
set wf $w.wf
frame $wf -relief groove -borderwidth 2
set w0 $wf.0
frame $w0
#導入參考圖片
set img [image create photo -file E:/CAE_Tech/process_files/97/model.gif]
label $w0.img -image $img -anchor nw
grid $w0.img -sticky nw
#布置label和entry
set w1 $wf.1
frame $w1
label $w1.1 -text "R:" -width 5 -font $Font
label $w1.2 -text "H:" -width 5 -font $Font
label $w1.3 -text "N:" -width 5 -font $Font
label $w1.4 -text "Rr:" -width 5 -font $Font
entry $w1.5 -textvariable R -width 10 -font $Font -justify center
entry $w1.6 -textvariable H -width 10 -font $Font -justify center
entry $w1.7 -textvariable N -width 10 -font $Font -justify center
entry $w1.8 -textvariable Rr -width 10 -font $Font -justify center
button $w1.b1 -text "Creat" -width 8 -font $Font -command {creatmodel}
button $w1.b2 -text "Cancel" -width 8 -font $Font -command {destroy .ef}
for {set i 1} {$i <= 4} {incr i} {
grid $w1.$i -row $i -column 1
}
for {set i 5} {$i <= 8} {incr i} {
grid $w1.$i -row [expr $i-4] -column 2
}
grid $w1.b1 -row 5 -column 1 -pady 5
grid $w1.b2 -row 5 -column 2 -pady 5
pack $wf.0 -padx 10 -pady 10 -side top
pack $wf.1 -padx 10 -pady 10 -side top
pack $wf
#wm resizable $w 0 0
wm state $w normal
以上Tcl/Tk代碼構建了一個界面窗口,用于設置幾個基本參數,并且定義了子進程。
通過wish86編譯后的界面如下圖所示:

圖5
四、Tcl/Tk與APDL
采用Tcl/Tk與APDL聯合編程能夠通過界面實現參數化設計過程,非常直觀。Tcl/Tk與APDL的通信主要依靠三個ANSYS API函數實現,分別是:
ans_sendcommand:向ANSYS傳遞APDL命令;
ans_getvalue:從ANSYS數據庫中獲取變量;
ans_getvector:從ANSYS數據庫中獲取向量。
采用Tcl/Tk和APDL編寫的子進程如下:
proc creatmodel {} {
global R
global H
global N
global Rr
ans_sendcommand "/prep7"
ans_sendcommand "*DIM,THETA,ARRAY,$N*3+1"
ans_sendcommand "*VFILL,THETA(1),RAMP,0,360/3 "
ans_sendcommand "*AFUN,DEG"
ans_sendcommand "CSYS,1"
ans_sendcommand "*DO,I,1,$N*3+1"
ans_sendcommand "K,I,$R,THETA(I),$H*(I-1)"
ans_sendcommand "*ENDDO"
ans_sendcommand "*DO,I,1,$N*3"
ans_sendcommand "L,I,I+1"
ans_sendcommand "*ENDDO"
ans_sendcommand "*DO,I,0,$N*3-1"
ans_sendcommand "LWPLAN,-1,I+1,0"
ans_sendcommand "CYL4,0,0,$Rr"
ans_sendcommand "*ENDDO"
ans_sendcommand "*DO,I,1,$N*3"
ans_sendcommand "VDRAG,I,,,,,,I"
ans_sendcommand "*ENDDO"
ans_sendcommand "ET,1,45"
ans_sendcommand "TYPE,1"
ans_sendcommand "VMESH,ALL"
}
五、UIDL、Tcl/Tk以及APDL
通過UIDL編寫功能菜單,Tcl/Tk編寫彈出窗口界面,APDL編寫參數化進程,再將整個過程串聯即可在ANSYS實現自動化建模的二次開發過程。
最終如下所示,在ANSYS的主菜單欄僅有一個Creat Helix菜單,點擊該菜單后,彈出Tcl/Tk創建的窗口,設置基本參數后點擊Creat即可自動創建。

圖6
自動創建的模型如下所示:

圖7
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















