“ 对于ABAQUS GUI的二次开发, 最头疼的莫过于每次更改From或者DB的时候都需要重启ABAQUS才能看见更改后的效果,而反复的重启ABAQUS会拖慢电脑运行速度, 实在是一个磨炼心性的好办法。而网上虽然有很多关于prototypeApp的讨论, 但是一直感觉隔了一层窗户纸, 就是不通透。而本文将阐述一下然后把这个prototypeApp梳理通透, 形成一个可以方便快捷的GUI开发调试框架。”
或许有人好奇, 我为什么非要把prototypeApp折腾成这个样子? 这是因为我想要一个集使用开发调试使用于一体的自己开发的主窗口GUI界面, 像这样:
如果不对prototypeApp进行优化, 那么每次调试插件的时候, 要么得在单独的环境中调试, 要么就会把自己开发的主窗口GUI源文件搞得一团乱麻.
而经过我优化的prototypeApp则可以很好地和主窗口GUI形成一个整体, 作为集开发调试使用于一体的ABAQUS环境. 这样一来, 通过RSG自动生成的插件, copy至plugins文件夹后, 经过prototype调试合格后, 即可直接注册到自己想注册的位置并进行使用. 这样一来就形成了一个闭环生态, 并且可以在使用过程中, 不断优化调试.
此项目在gitee上开源(见附件):
项目文件结构:
食用方法:
一 : 将待调试的插件copy至plugins文件夹下, 并为之新建一个__init__.py, 使之成为一个python包;
二 : 修改Form文件(即_plugin文件):
修改AFXGuiCommand的objectName参数, 使之可以从根目录找打kernel文件
修改getFirstDialog方法, 在return之前加入reload函数
注释自动生成的注册代码
三 : 修改prototypeToolsetGui.py文件:
在类之前仿照如下代码加入待调试插件的Form
修改onCmdForm函数, 在reload之后重新导入并as一次TestForm
修改getKernelInitializationCommand方法导入kernel文件, 其地址应与AFXGuiCommand的objectName参数相同
以下为开发过程记录, 感兴趣的可以看看.
01
—
prototypeApp
初始的prototypeApp文件如下:
该项目我在gitee上做了开源, 所以会有一些多出来开源所需的模板文件, 对各个文件进行如下说明:
.gitignore:开源模板文件
appIcons.py:prototypeApp项目图标文件
LICENSE:开源模板文件
prototype.bat:prototypeApp项目BAT文件, 用于运行该项目
prototypeApp.py:prototypeApp项目App文件
prototypeMainWindow.py:prototypeApp项目主窗口文件
prototypeToolsetGui.py:prototypeApp项目ToolSet注册文件
README.en.md:开源模板文件
README.md:开源模板文件
testDB.py:prototypeApp项目DB文件
testForm.py:prototypeApp项目Form文件
02
—
重载DB和Form的原理
我们自己开发的GUI为什么不会重载,而prototypeApp项目却可以重载呢?这需要我们到它的源代码中寻找答案。
而这种排查代码的工作, 最好要从头开始,App文件作为整个项目的入口文件, 自然就是我们需要的开始点:
我们先开App文件:
这就是一个正常的App文件, 没有任何异常。
我们再打开主窗口文件:
发现除了注册了一个自定义的ToolSet之外, 也就是一个正常的主窗口, 如此我们继续查看ToolSet的注册文件:
恩, 终于有点端倪了, 我的鼠标选中行, 出现了一个reload函数, 它的参数是import 的 testForm, 而reload, 顾名思义嘛, 就是重新载入的意思, 所以这就是重新加载Form文件的关键了。我们还可以看到onCmdForm这个方法是被绑定到了formIcon上, 也就是F, 而D则绑定了激活DB的方法。
我们再看From文件:
恩, 这里(鼠标选中)reload了DB文件, 如此一来也找到了DB的reload方法,我们再看DB文件:
这只是一个正常的DB文件
03
—
框架搭建
既然已经理顺了reload的原理, 那么我们就可以大胆的将testForm.py和testDB.py删除(这又不是我们的项目), 然后新建一些python包文件, 方便后续管理:
新建python包文件icons,将appIcons.py拖入其中;
新建python包文件plugins, 用于存放我们开发的插件, 在里面放一个测试用的插件, 我使用的是使用python进行ABAQUS批处理-Gui代码;
新建python包文件myGui,用于存放我们自定义的GUI集, 将prototypeToolsetGui.py拖入其中。
如此整体项目结构为:
鼠标选中处, 应保证导入了自定义的GUI集。
然后我们先修改batchAnalysis_plugin.py(相对于testForm.py), 进行reload DB文件, 共计三处修改:
由于该插件属于RSG自动生成, 如果我们要自己进行注册, 需要将该文件末尾的注册文件部分代码注释或删除;
仿照testForm.py添加reload函数
修改下图选中行, 以让程序可以从根目录找到kernel文件
最后我们修改ToolSet注册文件:
该文件中的testForm.py被导入为testForm,而其内部Form为TestForm, 而我们要行李代桃僵之策:
然后将文件内所有testForm.TestForm 替换为TestForm.
运行程序, 可以正常开启ABAQUS, 但是发生一个奇怪的问题:
修改DB的时候可以重载, 而修改Form的时候不能重载!
经过反复排查, 终于发现了关键所在, 由于我们李代桃僵的时候在程序开头就as了TestForm, 所以程序一直在使用这个TestForm, 即使重载了testForm, 程序使用的依然是as的那个TestForm而非重载后的testForm里面的Form文件.
这里我暂时没有什么好办法, 直接在reload(testForm)之后重新as了一下TestForm, 如下:
如果插件存在kernel程序, 则需要在类中使用getKernelInitializationCommand方法导入kernel文件, 否则在运行插件时会提示找不到kernel文件, ToolSet文件如图:
再次启动ABAQUS, 经调试, Form与DB均可以重载.
框架搭建完成.