Abaqus GUI程序开发简介
在Abaqus GUI程序开发中,可以使用两种方法来创建GUI图形界面。
第一种方法是使用RSG对话框构造器创建。RSG对话框构造器是Abaqus/CAE内嵌的GUI插件开发辅助工具,可以在Abaqus/CAE主视图的"Plug-ins"菜单下的"Abaqus"子菜单中找到"RSG dialog Builder"。点击后,进入一个界面,用户可以在该界面中创建新的对话框,选择和编辑控件,查看对话框的效果,以及关联插件执行的内核文件等。虽然RSG对话框构造器自身的控件种类很少,仅有22种,但对于简单的GUI开发程序基本上是足够的,并且使用该工具非常方便,能够提高插件开发的效率。
第二种方法是使用Abaqus GUI工具包创建。Abaqus GUI工具包是另一种创建GUI图形界面的方式,该工具包提供了更加丰富和灵活的控件选项,可以满足更复杂的GUI开发需求。使用Abaqus GUI工具包创建GUI界面需要编写Python脚本,通过调用工具包中的函数来创建和配置控件,实现界面的各种功能。相比于RSG对话框构造器,使用Abaqus GUI工具包需要更多的编程知识和工作量,但可以获得更高的自定义和扩展性。
综上所述,无论是使用RSG对话框构造器还是Abaqus GUI工具包创建GUI图形界面,都可以根据具体需求选择适合的方法进行开发。
对于复杂的GUI程序,当需要使用更多的控件时,RSG对话框就不能满足需求了。这时,我们需要采用第二种方式来创建GUI图形界面,即直接在源程序文件中编辑GUI命令。
通常,插件程序由四个文件组成:
(1)注册文件:~_plugin.py
(2)图形界面文件:~DB.py
(3)内核执行文件:~Modul.py
(4)图标文件:~.png
消息类型和消息ID
Abaqus GUI工具包利用目标/消息机制实现了GUI对象之间的交互。所有的控件都可以发送消息给其他控件,也可以接收其他控件发送的消息。一个消息通常由消息类型和消息ID两部分组成。消息类型指示事件的类型,消息ID表示消息的发送者。
Abaqus GUI工具包中的大多数控件都能指定目标和消息ID的变量。即使某些控件没有指定目标和ID的变量,也可以通过setTarget和SetSelector方法来设置它们的目标和ID。
例如:
FXButton(parent, ‘Label’, tgt=self, sel=self.ID_1) # 创建一个按钮
groupBox = FXGroupBox(parent) # 创建一个控件盒,自身无法设置目标和ID
groupBox.setTarget(self) # 设置目标
groupBox.SetSelector(self.ID_2) # 设置消息ID
控件可以发送多种类型的消息,其中最常用的两种消息类型是SEL_COMMAND和SEL_UPDATE。SEL_COMMAND类型的消息通常表示某个控件被触发,例如,用户按下了按钮。SEL_UPDATE类型的消息通常在某个控件需要请求其目标更新自身状态时进行更新。在自动更新过程中,每个控件都会向它的目标发送一个SEL_UPDATE消息,请求自身被更新,通过这种方法来保持应用程序的最新状态。
消息映射
当用户需要将一个消息通过消息映射传递给消息的处理方时,可以使用FXMAPFUNC()函数来定义消息映射。这个函数有四个参数,分别是self、消息类型、消息ID和调用的方法(使用类名来指定方法名)。
当接收到的消息类型和消息ID与某个FXMAPFUNC()函数中定义的消息类型和消息ID匹配时,相应的方法就会被调用。如果需要在消息映射中定义一段范围内的ID,可以使用FXMAPFUNCS()函数,它有5个参数,分别是self、消息类型、消息起始ID、消息结束ID和调用的方法。
另外,用户可以使用SELTYPE和SELID函数从消息处理方法中获取消息类型和消息ID。
控件创建
创建新的控件后,保存文件并重新启动Abaqus,然后在菜单栏下的"插件"选项中会出现新的菜单。您可以根据软件示例对程序进行相应的修改,示例如下所示:
注册文件:createPlateWithhole_plugin.py
# -* - coding:UTF-8 -*-
from abaqusGui import *
from abaqusConstants import ALL
import osutils, os
###########################################################################
# Class definition
###########################################################################
class createPlateWithhole_plugin(AFXForm):
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def __init__(self, owner):
# Construct the base class.
#
AFXForm.__init__(self, owner)
self.radioButtonGroups = {
}
self.cmd = AFXGuiCommand(mode=self, method='createPlateFunction',
objectName='createPlateModul', registerQuery=False)
pickedDefault = ''
self.partnameKw = AFXStringKeyword(self.cmd, 'partname', True, 'part-1')
self.widthKw = AFXFloatKeyword(self.cmd, 'width', True,100)
self.heightKw = AFXFloatKeyword(self.cmd, 'height', True,100)
self.radiusKw = AFXFloatKeyword(self.cmd, 'radius', True,5)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def getFirstDialog(self):
import createPlateWithholeDB
return createPlateWithholeDB.createPlateWithholeDB(self)
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def doCustomChecks(self):
# Try to set the appropriate radio button on. If the user did
# not specify any buttons to be on, do nothing.
#
for kw1,kw2,d in self.radioButtonGroups.values():
try:
value = d[ kw1.getValue() ]
kw2.setValue(value)
except:
pass
return True
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def okToCancel(self):
# No need to close the dialog when a file operation (such
# as New or Open) or model change is executed.
#
return False
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Register the plug-in
#
thisPath = os.path.abspath(__file__