UIDL-Tcl/Tk-APDL联合编程实现ANSYS二次开发(终极篇)
责任编辑:chjiegg     时间:2021-01-27     来源:《技术邻》——长安CAE
责任编辑:chjiegg
时间:2021-01-27  来源:《技术邻》——长安CAE
分类: 开发资源
浏览量: 800

本次介绍的是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


来源:《技术邻》——长安CAE

点赞人: 麦田客 

舒洁  回复 2021-11-04 22:12:03
点赞
回复:

Copyright © 2021 .长沙麦涛网络科技有限公司 All rights reserved. 湘ICP备20015126号-2
联系我们