Hello,小伙伴们,好久不见,我是小鲸鱼,距离我上次发文章已经过去了快1年了,主要有两个有原因,忙和懒。这次我不再写ansys的一些操作了,而是扩展到我也没触碰到的领域,Hypermesh的二次开发
我最近才开始接触二次开发,下面就讲述一下我学习二次开发的过程,并且末尾会附上我自己瞎琢磨的代码——hypermesh中的节点距离测量工具,优点就是比hypermesh中的F4数据还精确到小数点好多位,缺点就是这个二次开发啥用处都没有
下面就是这个代码运行出来的小窗口,是不是比F4量出来的数据还要精确,哈哈
下面我以一个初学者的思维来讲述一下整个代码的含义及用法,刚开始接触的时候,更多的是去研究怎么实现功能,至于说界面好不好看,存不存在不重要,但学着学着发现,没有界面,确实效率比较低,也感觉不正式,没有成就感
Hm的二次开发主要涉及的语言是Tcl和TK,前者是底层的算法逻辑,实现功能的,后者是制作界面GUI按钮文本框的,如果你之前没接触过代码的这些东东,你可能看起来觉得会比较难,但实际也不简单~,网上有很多关于hm二次开发的源代码,感兴趣的都可以去学习,并且altair官方的网盘中有很多关于这方面的资料,让你入门一点问题没有
闲话不扯,下面我就针对我自己写的测量距离的代码来展开,我写的东西都是我自己理解的,若存在错误欢迎大家后台指出
首先开头是proc aa {} {} 这个是程序打包为函数,方便后续调用,它一般的格式是:
Proc 函数名{变量} {
代码主体
}
如果你整个代码中没有要输入的变量,也就空{}就行了,或者写成{args}一样的,如果你打算设置窗口界面和按钮那些,那就不需要proc函数。直接在hm中运行写出的代码就行
destroy .mywin
set w [toplevel .measuretools]
wm attributes $w -topmost 1
其次就是这三句,第一句主要是销毁名称为mywin的窗口,防止出现重复,一般窗口都是用.(点)来代表,toplevel的意思就是创建窗口,后面跟的. Measuretools
细心的读者就会看到是这个窗口的名称,set就是赋值,比如set a 1,就是将1的值赋予a,所以set w [toplevel .measuretools]实际就是将这个窗口赋予w,下面只需用w来引用,wm attributes $w -topmost 1就是就是将窗口置于最前,不会因为你点击任何区域,它就消失了
下面标记的代码都是用作窗口中的文本框,按钮,输入框的,这个格式基本上是固定的,但是也有好几种,一种是直接写的button,一种是ttk::button,一种是hwtk::button
说实话到现在我对这几种建立文本框或按钮的方式还区别不开,让我的理解就是按钮美化程度不同,button是可操作性最强,可以设置颜色,可以设置按钮高度,但是按钮个人感觉比较丑。如下所示就是button创建出来的按钮
下面这段是将定义的按钮,文本框打包,显示出来, 如果没有这段的话,即使你上面用set设定了,也不会有按钮文本框这些出现,一般我了解到的有pack grid这两种方法,貌似有三种,我只记得这两种,但是我喜欢用grid,感觉比较规整一点
再说明一下就是下面这一行代码的含义:
grid $distance_lbl2 -row 2 -column 0 -padx 5 -pady 5 #行和列就不用说了,这段代码的意思就是第二行第0列,后面的-padx –pxdy指的就是x和y方向的间距,这个代码就是控制X dist=这个文本的
下面这个就是建立三个按钮的,-command{}里面就是按钮按一下运行的代码
这个文章中的界面的功能浅讲了一下,下面开始讲解tcl部分,因为没有tk部分,照样能实现想要的功能
*createmarkpanel nodes 1 "请选择第一个节点" #呈现选择节点的窗口
*creatmark这个功能是做hm二次开发最常用的命令,它搭配hm_getmark使用。它可以选择很多东西,比如nodes,surfs,elems,solids,comps等等…….很多很多,它的用法在帮助文档中很详细
在hm中进入帮助文档是用快捷键F1,打开后选择Reference Guides——hypermesh,然后进入index,可以搜索命令
接刚才的*createmarkpanel nodes 1 "请选择第一个节点"命令,输入命令后点回车,就是出现“1”,代表你的命令是运行成功的,出现0就是 意思命令没运行成功,就需要查找一下原因
还有读者可能不知道hm底下的输入框在哪里找,是在view中有个command window,打个勾就好了
*createmark命令只是标记了你选择的节点,如果要知道这个节点的编号,那就需要用hm_getmark nodes 1来使用,因为hm中存在两个寄存器,分别是1和2,所以这就是为什么*createmarkpanel nodes 1,nodes后面跟了一个1,表示吧标记的节点放入寄存器1中,然后hm_getmark nodes 1中的那个1也是去得到寄存器1中的节点编号
如果你运行下面这段代码,它就没有结果:
*createmarkpanel nodes 1 "请选择第一个节点"
hm_getmark nodes 2
因为你是把选择的节点存储在寄存器1中了,但是你getmark却选择的是寄存器2,寄存器2中没存入任何节点,所以无结果输出
代码运行的思路是先标记出第一个节点放入寄存器1,再标记出第二个节点放入寄存器2中,然后分别从寄存器1和2中得到这两个代码的ID,再用hm_getdistance这个命令来得出这两个节点之间的距离,这个距离会同时输出四个值,第一个是直线距离,二三四分别是xyz方向的投影距离,所以后面用了一个lindex的命令去索引它
接下来说一下这个命令bind是干嘛的,其实他是属于TK里面的,也就是说用bind来绑定事件的发生
bind $distance_btn {}
因为之前变量distance_btn的按钮是measure,所以这行代码就是说当measure按钮按下时候{}中的代码所执行的命令
这个代码本身比较简单,今天就写到这里吧,后面再进行详细说明,整个代码运用到的命令总结如下:
1、proc 函数名 {要输出的变量} {代码体} #这个代码就是将代码封装为函数,然后后面直接调用就行,如果整个代码中没有要输入的变量,那{}可以空着不写,也可以写上{args}
2、set命令 #这个就是很重要的赋值命令,如set aaa 5 #也就是把5的值赋给aaa,set first_node [hm_getmark nodes 1]这段的意思就是把[]中输出的值赋给first_node
3、创建按钮hwtk:button,创建文本框hwtk:label,创建输入框hwtk:entry等等..很多,这里暂时只用了这几个,还有一些复选框,下拉框,可以看文末的pdf,比较全的
4、grid/pack就是将自己创建的按钮、文本框这些东西呈现在界面中,后面会跟很多选项,比如创建在第1行,第1列,x、y方向的间距10和5,就是grid 变量 -row 1 -column 1 -padx 10 -pady 5
5、hm_getdistance nodes $first_node $second_node 0测量节点间的距离就是这个api函数,但测距离不止这一个函数,如果不知道都有哪些api,只知道关键词,可以hm下面的输入框中写上info command *关键词*进行模糊搜索
暂时就写这些吧,讲的不是很详细,但是也差不多了,后面再更新其他的hm二次开发,源代码附上:
proc aa {} {
destroy .mywin
set w [toplevel .measuretools]
wm attributes $w -topmost 1
set distance_lbl [label $w.distance_lbl -text "Distance measure tool" -font 20 ]
set distance_lbl1 [hwtk::label $w.distance_lbl1 -text "Distance =" ]
set distance_lbl2 [hwtk::label $w.distance_lbl2 -text "X dist =" ]
set distance_lbl3 [hwtk::label $w.distance_lbl3 -text "Y dist =" ]
set distance_lbl4 [hwtk::label $w.distance_lbl4 -text "Z dist =" ]
set distance_ent [hwtk::entry $w.distance_ent -textvariable distance]
set distance_ent1 [hwtk::entry $w.distance_ent1 -textvariable distance_x]
set distance_ent2 [hwtk::entry $w.distance_ent2 -textvariable distance_y]
set distance_ent3 [hwtk::entry $w.distance_ent3 -textvariable distance_z]
set distance_btn [ttk::button $w.distance_btn -text "Measure" -width 15 ]
set first_node_btn [ttk::button $w.first_node_btn -text "First node" -width 15 -command { *createmarkpanel nodes 1 "请选择第一个节点"}]
set second_node_btn [ttk::button $w.second_node_btn -text "Second node" -width 15 -command { *createmarkpanel nodes 2 "请选择第二个节点"}]
grid $distance_lbl -row 0 -column 1 -padx 5 -pady 5 -sticky nsew
grid $distance_lbl1 -row 1 -column 0 -padx 5 -pady 5
grid $distance_lbl2 -row 2 -column 0 -padx 5 -pady 5
grid $distance_lbl3 -row 3 -column 0 -padx 5 -pady 5
grid $distance_lbl4 -row 4 -column 0 -padx 5 -pady 5
grid $distance_ent -row 1 -column 1 -padx 5 -pady 5
grid $distance_ent1 -row 2 -column 1 -padx 5 -pady 5
grid $distance_ent2 -row 3 -column 1 -padx 5 -pady 5
grid $distance_ent3 -row 4 -column 1 -padx 5 -pady 5
grid $first_node_btn -row 1 -column 2 -padx 10 -pady 5
grid $second_node_btn -row 2 -column 2 -padx 10 -pady 5
grid $distance_btn -row 3 -column 2 -rowspan 2 -padx 10 -pady 5
bind $distance_btn <ButtonPress> {
set first_node [hm_getmark nodes 1]
set second_node [hm_getmark nodes 2]
set dis [hm_getdistance nodes $first_node $second_node 0]
set distance [lindex $dis 0]
set distance_x [lindex $dis 1]
set distance_y [lindex $dis 2]
set distance_z [lindex $dis 3]
}
}
关于tk的资料,见网盘链接:
链接:https://pan.baidu.com/s/1_SMzNfgwqS9ZZjkviGg8Lg
提取码:2022