一个优秀的Abaqus插件不但要有内核程序,还要有与之匹配的图形用户界面。通常,我们会使用Abaqus RSG制作插件对话框。RSG很易于使用,不过正是过于容易,各个控件的一些功能往往是被限制了,在RSG中无法开启。
其实,Abaqus提供了Abaqus GUI Toolkit,也就是通常所说的Abaqus GUI二次开发。这些隐藏功能可以通过二次开发打开或调整,以实现我们不同的需求。
Abaqus GUI 二次开发与Abaqus内核二次开发一样,使用的都是Python语言。本篇文章列举6个Abaqus的控件,以说明如何通过代码实现它们更多的功能。
下图是一个不含内核程序的对话框,用RSG制作而成。它比较简单,包含标签页(标签项)、分组框、标签、图片、文本框和文件选择对话框等6个控件。
将该插件保存为Standard plug-in格式,即可获得两个脚本。
以上两个文件,以_plugin结尾的是注册脚本,以DB结尾的是对话框脚本。用代码编辑器打开fangzhenxiuDB.py,便可对对话框脚本进行编辑。以下通过修改代码的方式,对该对话框中的6个控件进行修改和扩展。
1、标签页和标签项控件
标签页FXTabBook是布局的一种,在它的基础上可以创建一组标签项,正如上图中的3个标签项,这些标签项可以自由切换,每个标签页可以容纳很多控件。
在脚本中,标签页的构造函数如下图:
其中,参数p是父控件,tgt是消息目标,sel是消息ID,这两个参数是一对搭档,通常成对出现。参数opts是选项,默认值是TABBOOK_NORMAL,表示标签项位于该控件的上方。除此之外,还有几个可用的选项,如表1所示。
表1 FXTabBook的opts参数值
参数opts | 描述 |
TABBOOK_NORMAL | 标签项位于上方(默认值) |
TABBOOK_TOPTABS | 标签项位于上方 |
TABBOOK_BOTTOMTABS | 标签项位于下方 |
TABBOOK_SIDEWAYS | 标签项位于左侧 |
TABBOOK_LEFTTABS | 标签项位于左侧 |
TABBOOK_RIGHTTABS | 标签项位于右侧 |
例如,将opts改设为TABBOOK_LEFTTABS和TABBOOK_BOTTOMTABS后,对话框的样式如下面两个图所示。
以上是对标签页控件FXTabBook的位置做更改。不但如此,还可以对标签项FXTabItem做修改,比如在Tab A的前面添加小图标。在脚本中,默认的标签项构造函数为下图,参数ic即为图标,此处为None。
附件中提供了一个像素为18x18的小图标,我们首先用afxCreateIcon()创建一个图标对象,再把该图标赋值为参数ic,修改后的语句如下图。
这样,标签页中会出现一个足球的小图标。
2、分组框控件
分组框FXGroupBox是一种带有灰色边框的容器。对话框中通常用于将几个可以共同实现某一功能的控件进行分组,将这些控件放在同一个分组框内,不仅可以方便地进行管理,还能够让同一分组框内的多个单选按钮自动设为一组,只能同时选中其中的一个。这种方式不会受到放在外部或另一个分组框内的单选按钮的影响。
脚本中,分组框的构造函数如下图。
参数opts默认为FRAME_GROOVE,表示分组框以灰色线条包裹,我们还可以添加为表2中的三个值。
表2 FXGroupBox的opts参数值
参数opts | 描述 |
GROUPBOX_TITLE_LEFT | 标题位于左上方(默认值) |
GROUPBOX_TITLE_CENTER | 标题位于方中上方 |
GROUPBOX_TITLE_RIGHT | 标题位于右上方 |
例如,将opts设为FRAME_GROOVE|GROUPBOX_TITLE_CENTER后,分组框这三个字会至于中间。
如果没有FRAME_GROOVE,灰色线条将会消失。
3、标签
标签控件FXLabel通常用于在对话框中显示一段文本或图片,用于信息提示等场景。如本对话框中的“你好,仿真秀”以及仿真秀logo都是由FXLabel生成的。
比如,一行“你好,仿真秀”,是由以下构造函数创建的。
文本标签可以有换行和提示的功能。如果想换行,在文本中添加“\n”,例如:
还可以把鼠标停留在标签文字上显示提示信息,可以在文字中添加“\t”,例如:
此外,对话框中默认字体其实可以更改为其他字体,修改方式如下图。
再打开对话框,标签文字的字体已经更改为以下格式。
以上语句用FXFont()创建了一个字体对象,其构造函数中参数wt表示字体粗细;sl表示字体倾斜;enc是encoding,表示字体编码;setw是set width,定义字体的宽度;h为hints,表示提示。这些参数的设置较多,具体请参考Abaqus官方文档Abaqus GUI Toolkit Reference Guide中的FXFont函数。
创建完毕后,用标签的setFont()方法,将字体对象用于当前文字,即可将更改字体。
需要注意,并不是所有控件都能设置字体,只有控件对象具有实例方法setFont()才可以更改字体。
4、图片
图片也是用标签控件FXLabel创建,此处创建图片的构造方法为:
此处由于没有文字,所以参数text设为空,如果添加文字,那么文字会自动出现在图片的右侧,例如:
呈现的效果如下图
通过设置FXLabel的参数opts(此处otps采用默认值,没有显示),可以调整文本和图片的位置关系,具体参数值见表3。
表3 FXLabel的opts参数值
参数opts | 描述 |
TEXT_OVER_ICON | 文本置于图片上方,两者重叠 |
TEXT_AFTER_ICON | 文本位于图片右侧(默认) |
TEXT_BEFORE_ICON | 文本位于图片左侧 |
TEXT_ABOVE_ICON | 文本位于图片上方 |
TEXT_BELOW_ICON | 文本位于图片下方 |
例如把opts设为TEXT_BEFORE_ICON,得到的效果如下图
5、文本框
文本框控件AFXTextField是很常用的一种控件,它是由标签和单行输入框组成的。脚本中的构造方法为:
其中,第二个参数ncols表示输入框可完全容纳数字的位数,它决定了输入框的宽度,脚本中设为20。第三个参数labelText为文本标签,表现为文本框左侧的字符串。与标签控件一样,它也可以用“\n”换行,以及“\t”设置光标停留的提示信息。
参数tgt和sel是上面提到过,此处tgt设为form.keyword01Kw,它存在于注册脚本中,它是一种字符串类型的关键字,如下图:
当tgt为字符串类型关键字时,参数sel需设为0。
AFXTextField()也有选项参数opts,用来指定输入框的数据类型和其他作用,常见的类型详见表4。
表4 AFXTextField的opts参数值
参数opts | 描述 |
AFXTEXTFIELD_STRING | 字符串 |
AFXTEXTFIELD_INTEGER | 整型 |
AFXTEXTFIELD_FLOAT | 浮点型 |
AFXTEXTFIELD_COMPLEX | 复数 |
AFXTEXTFIELD_CHECKBUTTON | 前面有复选按钮 |
AFXTEXTFIELD_RADIOBUTTON | 前面有单选按钮 |
AFXTEXTFIELD_VERTICAL | 标签和输入框分两行 |
AFXTEXTFIELD_READONLY | 输入框只读 |
例如,参数opts使用AFXTEXTFIELD_CHECKBUTTON时,文本框的前面会有一个复选框按钮,不勾选时无法输入,选中时才可使用,如下图所示。
再比如,参数opts使用AFXTEXTFIELD_READONLY,输入框会被隐藏,文本内容成为不可编辑的标签,如下图所示。
6、文件选择对话框
文件选择对话框控件也十分常用,用于打开或保存文件。这个控件实际是由文本框控件和按钮控件通过水平框架布局组成的。
点击按钮,会弹出一个对话框
脚本中的文件选择对话框控件代码如下图所示:
文件选择对话框控件实现机制比较复杂,除了对话框中的文本框和按钮,它还依靠下图中的类代码。
不过,我们无需去探究它的实现过程,只需要在它的基础上探索被隐藏的功能。
比如,第104-第106行是该控件的构造函数AFXFileSelectorDialog(),其中第106行的AFXSELECTFILE_ANY其实是参数mode的值(默认代码中省略了“mode=”的字样),它表示文件的选择方式。默认情况下,我们只能单选文件,其实通过修改mode的参数值,还可以改为多选文件或选择文件夹,mode的参数值的设置方式如表5所示。
表5 AFXFileSelectorDialog的mode参数值
参数enc | 描述 |
AFXSELECTFILE_ANY | 文件单选,用于保存时文件可不存在 |
AFXSELECTFILE_EXISTING | 文件单选,通常用于打开文件 |
AFXSELECTFILE_MULTIPLE | 文件多选 |
AFXSELECTFILE_DIRECTORY | 选择文件夹 |
此外,默认的文件过滤器中是没有限制的,当文件较多时找文件会比较麻烦,我们可以自定义要选择打开的文件类型。
将上面的代码做以下修改,便可以定制我们想要的文件类型,比如只显示.cae、.odb或.inp等格式
默认情况下,当选择.odb文件时,后面的只读复选框处于可以使用的状态,而其他类型的文件则不可用。
如果想要设置选中.cae格式时也让复选框可用,可以修改上述第107的代码为:
这样,只读选项也适用于.cae文件了
以上列举了6个常用控件,它们都由RSG制作出来的,然而RSG并没有完全发挥出它们的全部功能,这些功能需要通过Abaqus GUI二次开发才能实现。除了这6个控件,Abaqus中其他的几乎所有控件都有被隐藏的功能,等待着我们去发掘。
在我的这套《基于Python语言Abaqus插件程序GUI二次开发技术训练营31讲(初中高篇)》课程中,详细讲解了Abaqus提供的绝大多数控件的二次开发方法,从代码的角度对它们进行剖析,揭秘它们更多的功能。此外,还课程还列举了7个高级实例,从更高层次灵活运用Abaqus GUI,使我们的Abaqus插件更加高级和完善。