1. GUI开发简介

Abaqus GUI程序开发时,可以采用两种方式创建GUI图形界面。

(1)使用RSG对话框构造器创建

(2)使用Abaqus GUI工具包创建

RSG对话框构造器是(RSG dialog Builder)是Abaqus/CAE内嵌的GUI插件开发辅助工具,位于Abaqus/CAE主视图“Plug-ins”菜单下的“Abaqus”子菜单中的 "RSG dialog Builder" ,点击后进入下图所示的界面。在该界面中,用户可以创建新的对话框,选择并编辑控件,查看对话框的效果,关联插件执行的内核文件等。该工具使用快捷方便,是插件开发很高效的辅助工具,但是RSG对话框构造器自身的控件种类很少,一共只用22种,对于简单的GUI开发程序基本都能满足。

对于复杂的GUI程序,需要用到更多的控件,此时RSG对话框无法满足需求,需要采用第二种GUI图形界面的创建方式,即直接在源程序文件中编辑GUI命令。

插件程序一般包括4个文件

(1)注册文件~_plugin.py

(2)图形界面文件~DB.py

(3)内核执行文件~Modul.py

(4)图标文件~.png

2. 目标和消息

2.1消息类型和消息ID

Abaqus GUI工具包是通过目标/消息(target/message)机制实现GUI对象之间交互,所有的控件都可以发送消息给其他的控件,也可以接收来自其他控件的消息。一个消息一般包括两部分:消息类型和消息ID。消息类型指发生事件的类型,消息ID表示消息的发送者。

Abaqus GUI工具包中的大部分控件都能指定目标和消息ID的变量,即使某种控件没有指定目标和ID的变量,也可以通过setTarget和SetSelector方法来设定其目标和ID。

例如:

FXButton(parent,'Label',tgt=sef,sel=self.ID_1)#创建一个按钮
groupBox = FXGroupBox(parent)#创建一个控件盒,自身无法设置目标和ID
groupBox.setTarget(self)#设置目标
groupBox.SetSelector(self.ID_2)#设置其消息ID

控件可以发送多种类型的消息,最常用的两种消息类型是SEL_COMMANDSEL_UPDATE.

SEL_COMMAND类型的消息一般表示某个控件被触发,例如,用户按下了按钮。

SEL_UPDATE类型的消息一般是在某一控件需要请求其目标来更新自身状态时才更新。在自动更新过程中,每个控件都会给他的目标发送一个SEL_UPDATE小时,请求自身被更新,通过这种方法来实现应用程序保持最新状态。

2.2消息映射

一个消息通过消息映射传递给消息的处理方,用户可以指定接收到某消息类型以及消息ID时所需要调用的方法(onCmdA,其中A表示方法名称)

消息映射一般通过FXMAPFUNC()函数来定义,函数具有四个变量,分别为self、消息类型(message type)、消息ID(message ID)以及调用的方法(method name),其中方法名必须由类名来指定

当接收到的消息类型和消息ID与某一个FXMAPFUNC()函数中定义的消息类型和消息ID匹配时,相应的方法就会被调用。另外,如果需要在消息映射中定义一段范围内的ID,可以采用函数FXMAPFUNCS(),该函数包括5个参数,分别为self、消息类型(message type)、消息起始ID(message ID)、消息结束ID(message ID)以及调用的方法(method name)。

另外,用户可以使用SELTYPESELID函数从消息处理方法获取消息类型和消息ID。

3. 控件创建

创建新的控件后,然后保存文件,重启Abaqus,在Plug-ins菜单下回出现新的菜单。

可参照软件的列子对程序进行相应的修改,例子如下所示。

注册文件: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__)
thisDir = os.path.dirname(thisPath) toolset = getAFXApp().getAFXMainWindow().getPluginToolset()
toolset.registerGuiMenuButton(
buttonText='创建带孔板',
object=createPlateWithhole_plugin(toolset),
messageId=AFXMode.ID_ACTIVATE,
icon=None,
kernelInitString='import createPlateModul',
applicableModules=ALL,
version='N/A',
author='N/A',
description='N/A',
helpUrl='N/A'
)

界面文件:createPlateWithholeDB.py

# -* - coding:UTF-8 -*-
from abaqusConstants import *
from abaqusGui import *
from kernelAccess import mdb, session
import os
thisPath = os.path.abspath(__file__)
thisDir = os.path.dirname(thisPath)
#######################################################################
# Class definition
#######################################################################
class createPlateWithholeDB(AFXDataDialog):
ID_Mybutton = AFXDataDialog.ID_LAST #分配ID
def __init__(self, form): AFXDataDialog.__init__(self, form, '带孔板参数化建模程序',
self.OK|self.CANCEL, DIALOG_ACTIONS_SEPARATOR) okBtn = self.getActionButton(self.ID_CLICKED_OK)
okBtn.setText('OK') GroupBox_1 = FXGroupBox(p=self, text='参数', opts=FRAME_GROOVE)
AFXTextField(p=GroupBox_1, ncols=12, labelText='零件名 :',
tgt=form.partnameKw, sel=0)
AFXTextField(p=GroupBox_1, ncols=12, labelText='宽度(w):',
tgt=form.widthKw, sel=0)
AFXTextField(p=GroupBox_1, ncols=12, labelText='高度(h):',
tgt=form.heightKw, sel=0)
AFXTextField(p=GroupBox_1, ncols=12, labelText='半径(r):',
tgt=form.radiusKw, sel=0)
GroupBox_3 = FXGroupBox(p=self, text='示意图', opts=FRAME_GROOVE)
fileName = os.path.join(thisDir, r'planewithhole.png')
icon = afxCreatePNGIcon(fileName)
FXLabel(p=GroupBox_3, text='', ic=icon)
FXMAPFUNC(self, SEL_COMMAND, self.ID_Mybutton,
createPlateWithholeDB.onCmdMybutton)
FXButton(p=self, text='打印', ic=None, tgt=self,
sel=self.ID_Mybutton,
opts=BUTTON_NORMAL,
x=0, y=0, w=0, h=0, pl=0) def onCmdMybutton(self, sender, sel, ptr):
if SELID(sel) == self.ID_Mybutton: #使用SELID函数获取消息ID
print 'Button 1 was pressed.'
#在DOS界面下输出提示信息
mw = getAFXApp().getAFXMainWindow()
mw.writeToMessageArea('Button 1 was pressed.' )
#在abaqus/CAE主窗口下方的提示区显示提示信息
return 1

内核程序:createPlateModul.py

# -* - coding:UTF-8 -*-
from abaqus import *
from abaqusConstants import *
def createPlateFunction(partname, width, height, radius):
mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=200.0)
mdb.models['Model-1'].sketches['__profile__'].rectangle(point1=(0.0, 0.0),
point2=(width, height))
mdb.models['Model-1'].sketches['__profile__'].CircleByCenterPerimeter(center=(
width/2, height/2), point1=(width/2+radius, height/2))
mdb.models['Model-1'].Part(dimensionality=THREE_D, name=partname, type=
DEFORMABLE_BODY)
mdb.models['Model-1'].parts[partname].BaseShell(sketch=
mdb.models['Model-1'].sketches['__profile__'])
p = mdb.models['Model-1'].parts[partname]
session.viewports['Viewport: 1'].setValues(displayedObject=p)
del mdb.models['Model-1'].sketches['__profile__']
#几何创建完成
mdb.models['Model-1'].Material(name='AL')
mdb.models['Model-1'].materials['AL'].Elastic(table=((70000.0, 0.3), ))
mdb.models['Model-1'].HomogeneousShellSection(name='al', preIntegrate=OFF,
material='AL', thicknessType=UNIFORM, thickness=1.0, thicknessField='',
idealization=NO_IDEALIZATION, poissonDefinition=DEFAULT,
thicknessModulus=None, temperature=GRADIENT, useDensity=OFF,
integrationRule=SIMPSON, numIntPts=5)
f = p.faces
faces = f.getSequenceFromMask(mask=('[#1 ]', ), )
region = p.Set(faces=faces, name='Set-2')
p.SectionAssignment(region=region, sectionName='al', offset=0.0,
offsetType=MIDDLE_SURFACE, offsetField='',
thicknessAssignment=FROM_SECTION)
#建立材料并赋予属性
session.viewports['Viewport: 1'].partDisplay.setValues(mesh=ON)
session.viewports['Viewport: 1'].partDisplay.meshOptions.setValues(
meshTechnique=ON)
session.viewports['Viewport: 1'].partDisplay.geometryOptions.setValues(
referenceRepresentation=OFF)
#切换到mesh模块
p = mdb.models['Model-1'].parts[partname]
p.seedPart(size=4.0, deviationFactor=0.1, minSizeFactor=0.1) f = p.faces
pickedRegions = f.findAt(((width/2, 0.0, 0.0), ))
p.setMeshControls(regions=pickedRegions, elemShape=QUAD,algorithm=MEDIAL_AXIS)
#设定网格划分格式
p.generateMesh()
#网格划分
a = mdb.models['Model-1'].rootAssembly
session.viewports['Viewport: 1'].setValues(displayedObject=a)
session.viewports['Viewport: 1'].assemblyDisplay.setValues(
optimizationTasks=OFF, geometricRestrictions=OFF, stopConditions=OFF)
#切换到装配模块
a = mdb.models['Model-1'].rootAssembly
a.DatumCsysByDefault(CARTESIAN)
p = mdb.models['Model-1'].parts[partname]
a.Instance(name=partname+'-1', part=p, dependent=ON)
#创建装配实例
mdb.models['Model-1'].StaticStep(name='Step-1', previous='Initial', nlgeom=ON)
session.viewports['Viewport: 1'].assemblyDisplay.setValues(step='Step-1')
#创建分析步
session.viewports['Viewport: 1'].view.setValues(nearPlane=335.564,
farPlane=385.546, width=212.48, height=142.547, viewOffsetX=13.3712,
viewOffsetY=-7.13345)
a = mdb.models['Model-1'].rootAssembly
e1 = a.instances[partname+'-1'].edges
edges1 = e1.findAt(((0.0, height/2, 0.0), ))
region = a.Set(edges=edges1, name='Set-1')
mdb.models['Model-1'].DisplacementBC(name='BC-1', createStepName='Step-1',
region=region, u1=0.0, u2=0.0, u3=0.0, ur1=0.0, ur2=0.0, ur3=0.0,
amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='',
localCsys=None)
#施加边界条件
edges1 = e1.findAt(((width, height/2, 0.0), ))
region = a.Set(edges=edges1, name='Set-2')
mdb.models['Model-1'].DisplacementBC(name='BC-2', createStepName='Step-1',
region=region, u1=2.0, u2=UNSET, u3=UNSET, ur1=UNSET, ur2=UNSET, ur3=UNSET,
amplitude=UNSET, fixed=OFF, distributionType=UNIFORM, fieldName='',
localCsys=None)
#施加位移载荷
mdb.Job(name='Job-hole', model='Model-1', description='', type=ANALYSIS,
atTime=None, waitMinutes=0, waitHours=0, queue=None, memory=50,
memoryUnits=PERCENTAGE, getMemoryFromAnalysis=True,
explicitPrecision=SINGLE, nodalOutputPrecision=SINGLE, echoPrint=OFF,
modelPrint=OFF, contactPrint=OFF, historyPrint=OFF, userSubroutine='',
scratch='', multiprocessingMode=DEFAULT, numCpus=1, numGPUs=0)
#创建job

Abaqus-GUI开发-RSG的更多相关文章

  1. Python GUI开发环境的搭建

    原文:Python GUI开发环境的搭建 最近对Python的开发又来了兴趣,对于Python的开发一直停留在一个表面层的认识,玩的部分比较大. Python的入手简单,语法让人爱不释手,在网络通信方 ...

  2. 漫谈GUI开发—各种平台UI开发概况

    前言: 在看这边文章前,可以建议看下:图形界面操作系统发展史——计算机界面发展历史回顾 从CS到BS,现在的前端开发,其实也是GUI开发范畴.现今 各平台的UI开发概况 HTML&CSS,Wi ...

  3. php 图形用户界面GUI 开发

    php 图形用户界面GUI 开发 一.下载指定系统扩展 1 2 http://pecl.php.net/package/ui http://pecl.php.net/package/ui/2.0.0/ ...

  4. 程序员之路:python3+PyQt5+pycharm桌面GUI开发(转)

    程序员之路:python3+PyQt5+pycharm桌面GUI开发 http://blog.sina.com.cn/s/blog_989218ad0102wz1k.html 先看效果: 图 1 没错 ...

  5. Python3+PyQt5+PyCharm 桌面GUI开发环境搭建

    Python3+PyQt5+PyCharm 桌面GUI开发环境搭建 一.安装python PyQt5所支持的python版本是不低于3.5版本 python3.5以上的版本安装:https://www ...

  6. Java -GUI开发九九乘法表

    Java GUI开发九九乘法表 (1)实现目标: 利用java自带的awt包,基础控件开发一个九九乘法表,点击可以显示对应的乘法口诀. (2)控件选择: 点击——Button 显示——TextFiel ...

  7. Python3 GUI开发(PyQt)安装和配置

    Python3 GUI开发(PyQt5)安装和配置: 下载安装好Miniconda3, 并且安装好jupyter 注意:最好关闭360杀毒软件或者把cmd加入信任,否则运行activate会有问题. ...

  8. 客户端软件GUI开发技术漫谈:原生与跨平台解决方案分析

    原生开发应用开发 Microsoft阵营的 Winform WinForm是·Net开发平台中对Windows Form的一种称谓. 如果你想深入的美化UI,需要耗费很大的力气,对于目前主流的CSS样 ...

  9. 使用 Eclipse 可视化插件 windowbuilder 进行Java GUI开发(插件安装的两种方法)

    对于Java GUI开发 其实最方便的方法是用插件制作,当然先了解完代码原理是最好的. eclispe安装windowbuilder有两种方式,一种是离线安装,一种是在线安装. 一.第一种在线安装: ...

随机推荐

  1. 杭电oj————2057(java)

    question:A+ B again 思路:额,没啥思路/捂脸,用java的long包里的方法,很简单,只是有几次WA,有几点要注意一下 注意:如果数字有加号要删除掉,这里用到了正则表达式“\\+” ...

  2. 一个小时学会jQuery(转载)

    目录 一.jQuery简介与第一个jQuery程序 1.1.jQuery简介 1.2.jQuery特点 1.3.jQuery版本 1.4.获得jQuery库 1.5.第一个jQuery程序 二.jQu ...

  3. EF CodeFirst数据注解特性详解

    数据注解特性是.NET特性,可以在EF或者EF Core中,应用于实体类上或者属性上,以重写默认的约定规则. 在EF 6和EF Core中,数据注解特性包含在System.ComponentModel ...

  4. sql查询 —— 连接查询

    -- 执行sql文件 test.sql -- 打开终端 -- cd sql文件所在路径 -- 进入mysql -- use 数据库 -- 执行 source test.sql; -- 自关联 -- 一 ...

  5. 解决Creating Server TCP listening socket 54.179.160.162:7001: bind: Cannot assign requested address

    背景:之前在测试环境搭过一个redis集群,运维把服务器重启之后我重新开启redis集群始终起不来,但是有没有任何日志,经过如下步骤最终解决问题 1.修改日志路径,根据日志查看为什么会启动失败[前期操 ...

  6. python面试的100题(4)

    4.打乱一个排好序的list对象alist? import random alist = [1,2,3,4,5] random.shuffle(alist) print(alist) 结果为:[2, ...

  7. 根据wsdl生成soap请求格式

    本文链接:https://blog.csdn.net/a_Little_pumpkin/article/details/84725118根据wsdl文件如何生成soap请求的格式呢?使用最方便的工具S ...

  8. egg.js 配置cors跨域

    1.egg简述 Egg.js,为企业级框架和应用而生,是阿里开源的企业级 Node.js 框架. 2.特点 Egg 奉行『约定优于配置』,按照一套统一的约定进行应用开发,团队内部采用这种方式可以减少开 ...

  9. Makefile中的wildcard/notdir/patsubst

    在Makefile规则中,通配符会被自动展开. 但在变量的定义和函数引用时,通配符将失效.这种情况下如果需要通配符有效,就需要使用函数“wildcard”,它的用法是:$(wildcard PATTE ...

  10. Bugku - Misc图穷匕见 - Writeup

    Bugku - Misc图穷匕见 - Writeup 原文链接:http://www.cnblogs.com/WangAoBo/p/6950547.html 题目 给了一个jpg图片,下载图片 分析 ...