拷贝做过Abaqus二次开发的人都知道,Plug-ins菜单下的RSG对话框生成器,能很方便地生成插件程序对话框。对话框制作好之后,如保存为standard plug-in格式,则能自动转为Abaqus Gui toolkit脚本。虽然不能再用RSG对话框生成器进行编辑,但这种代码才是二次开发的语言,我们可以修改成更高级的对话框GUI。
而在对插件程序GUI做二次开发时,每当代码有更改,想要查看修改后的界面,必须要重启Abaqus,随着调试次数的增多,以及版本提升造成的打开缓慢,一次次打开Abaqus会显得不胜其烦,不知不觉会产生焦虑感。
我们改完脚本后,有没有什么方法,不用重新打开Abaqus,也能立刻显示对话框更改后的界面呢?
当然是有的。
其实帮助文档中,已经提供了一个方法。
打开帮助文档(版本6.14)中的 Abaqus GUI Toolkit User's Guide
点击 2.4 Running the prototype application
帮助中提示我们可以用二次开发的方法,即使不用重启Abaqus ,也能立刻看到效果。首先去”SIMULIA Learning Community“去下载一个附件。
下载需要注册账号,我已经下载好了,大家可以在附件中下载(解压后的prototypeApp.zip)
附件解压缩后,是6个脚本:
帮助中并没有阐述下一步该怎么做,我来说明一下接下来该如何设置。
先来解释一下这6个脚本的作用:
1、appIcons.py,打开后是大大的F和D字母,它能作为xpm格式,通过FXXPMIcon()构造方法创建图标
2、prototypeApp.py,启动脚本,它能创建并打开Abaqus应用程序。这个脚本的代码格式是固定的。
3、prototypeMainWindow.py,它是主窗口脚本,负责Abaqus自带工具集和自定义工具集的注册,以及自带模块和自定义的注册。工具集和模块中都分别包括了菜单、工具条、工具箱和树。这个脚本中,除了注册了常见的工具集和模块,还单独注册一个自定义的工具集:PrototypeToolsetGui,并把这个工具集放置在菜单和工具箱中。
4、prototypeToolsetGui.py,自定义的工具集。这个脚本能够新建图标按钮F和D,把这两个图标通过映射的方式,与自定义的插件程序做关联。
5、testDB.py,对话框脚本,我们通过RSG对话框生成器做出来的插件对话框,用standard-in格式保存后,能自动生成这个脚本。
6、testForm.py,Form模式脚本,作用是用来收集从对话框中输入的信息。这个脚本能调用对话框脚本。它也能通过RSG对话框生成器自动生成,只不过生成的名称是test_plugin.py。这里之所以要改名为testForm.py,是因为有两种模式,一种是Form模式,还有一种是Procedure模式,在做二次开发时,为了便于区分,把自动生成的_plugin改为了Form。除了改名之外,还必须删除自动生成的脚本中最后几行注册代码。
这6个脚本有两个作用:
一是能将Plug-ins菜单中的某个插件程序,转为左侧工具箱中的F和D图标按钮。(为什么要转为两个图标,下文讲解)
二是以往我们通过脚本修改插件程序后,必须重启Abaqus,才能看到改后的效果。而现在不用重启Abaqus主窗口,只要重新打开对话框,就能立刻看到改后的界面,等待时的焦虑感瞬间扫光。
这几个脚本毕竟只是个模板,怎么用于我们自己的插件程序呢?
我已经在社区下载脚本的基础上,做好另一套脚本,可以直接打开Abaqus,保留了F和D图标按钮,并也能实现即时查看更改后的对话框功能。大家可以在下方附件免费下载(解压后的New Abaqus.rar)。
下载后解压缩,打开文件夹。
双击”startup.bat“,能打开Abaqus/CAE主窗口。
在主窗口的左侧,工具箱中有很醒目的F和D,F表示Form,D表示Dialogbox。
点击D,弹出一个自定义的插件(我做的很简单的插件,仅做演示用),点击OK可生成一个梁。
我们来做个演示,查看即时更改的功能:
用脚本编译器打开beamCreateDB.py,把对话框脚本做一些更改。为了不出现语法错误,建议只改 ' ' 中的字符串。这里比如:把34行的 'Dimension' 改为 '尺寸:' ,改后保存。
把对话框关闭后,点击“D”,可以发现对话框立刻做了更改。
同样,打开beamCreateForm.py,这个脚本是收集在对话框输入的数据。比如将第28行的40改为150,保存。
先点击”F”,再点击”D”,会发现length的默认值从之前的40,改为了150。
这里的”F”对应的是Form模式脚本,它负责创建关键字,并启动对话框脚本,自己也带有默认值。
如果对控件代码有所了解,可以直接添加控件语句:
这套脚本是通用的,大家可以把自己的插件程序用于这套脚本上,按照以下步骤更改:
Step 1、在RSG中把插件对话框保存为standard plug-in格式,一般是3个脚本文件+图片。假设内核脚本名称是abc.py,另外两个脚本就是abcDB.py和abc_plugin.py。
Step 2、把这3个脚本文件和图片,全部拷贝到My Abaqus文件夹下。
Step 3、把abc_plugin.py,改名为abcForm.py
Step 4、打开刚改完名的abcForm.py脚本,做如下三处修改:
1)把定义的类名改为abcForm(一般在第10行),可参考beamCreateForm.py第15行,注意第一个字母大写,如下图
2)找到实例方法getFirstDialog(),在import abcDB语句后面增加一行:reload(abcDB)。具体可参考beamCreateForm.py脚本的第40行,如下图
3)删除(或注释)最后的几行注册语句,如下图。其余不变,保存。
Step 5、打开myToolsetGui.py脚本,做如下修改:
1)把第8行改为:import abcForm
2)第24行改为:self.form = abcForm.AbcForm(self) ,注意后面的AbcForm是类名,”A“是大写的
3)第38行,改为:reload(abcForm)
4)第39行,改为:self.form = abcForm.AbcForm(self) ,与第24行一样
5)第45行,改为:return 'import abc'
更改完毕。
大家试一试,是不是可以点击D按钮打开插件呢?还可以试试更改脚本,体验实时更新对话框吧。
把插件程序做成按钮图标,用到了 Abaqus主窗口GUI的二次开发 和 Abaqus插件程序GUI二次开发 的一些内容,前者在我的课程《基于Python语言Abaqus插件程序GUI二次开发技术训练营31讲》中有全套讲解(点击图片试看)。
回到主题,不用重启Abaqus就能即时打开更改后的对话框,是如何实现的呢?其实不难理解,大家一定观察到了,在myToolsetGui.py和beamCreateForm.py这两个脚本中有用了reload()方法。
在myToolsetGui.py中,在第38行增加了reload(testForm)。它的作用是重新加载testForm模块,这个模块已经与F字母按钮做了映射。当我们修改脚本后,再次点击F字母时,就已经重新加载了testForm模块,打开的是新的模式脚本。
同样,testForm.py中,第40行增加了reload(testDB)。它能重新加载testDB模块,这个模块是对话框脚本,已经与D字母做了映射。当我们修改对话框脚本后,再次点击D字母,脚本已经重新被加载,打开的是新的对话框。也就实现了不用重启Abaqus,也能实时看到更改后的界面。
小结一下:我们并不能直接修改Plug-ins菜单下的插件程序,而是绕了一个弯,通过自定义Abaqus主窗口的方式,把Plug-ins菜单下的插件程序与两个图标按钮做关联,并做适当修改,同时注册到工具箱中,就能在修改后实时查看插件程序的界面了。需要修改两个脚本,一是 _plugins脚本,二是myToolsetGui脚本,分别都要添加reload()方法,通过重新加载Form脚本和对话框脚本的方式,来实现即时查看更改的目的。
做这两个按钮的好处,就是方便对插件对话框的GUI做更改。
为什么要对对话框的GUI做更改呢?
RSG对话框生成器中自带的控件,确实可以做出简单的对话框,但也就只能做简单的对话框了。因为几乎每个RSG提供的控件中的功能接口都很少,大量的功能接口被隐藏了,还有一些控件用RSG是做不出来的。无论是控件的隐藏功能,还是做不出来的控件,想要使用它们,都必须以脚本的形式开发出来。
而在开发过程中,需要一次次的调试,如果每次调式都伴随着重启Abaqus,那是一件很头疼的事。所以如果有不用重启就能打开调式后的对话框的方法,使用起来则很痛快。