在现代工程仿真中,Abaqus 是一款功能强大且应用广泛的有限元分析软件。然而,对于许多工程师和研究人员来说,Abaqus 的复杂操作流程可能成为提高工作效率的障碍。为了简化建模过程,提升建模效率,本公众号开发了一款名为 "it-tumulao-buildRect" 的Abaqus插件。该插件不仅提供了一个用户友好的图形界面,还允许用户快速创建矩形薄板模型,并自定义多个关键参数。通过这款插件,本文将演示如何利用Abaqus的插件开发功能来简化建模过程。
插件介绍
1. 功能概述
"it-tumulao-buildRect" 是由本公众号开发的一款Abaqus插件,主要用于演示插件开发的基本用法。该插件提供了一个用户友好的图形界面,允许用户输入以下关键参数:
长度 (L):矩形薄板的长度。
宽度 (W):矩形薄板的宽度。
厚度 (T):矩形薄板的厚度。
部分名称 (Part Name):创建的薄板部分的名称。
弹性模量 (Elastic Modulus, E):材料的弹性模量。
泊松比 (Poisson Ratio, ν):材料的泊松比。
网格划分种子 (Seed Size):用于控制网格划分的种子大小。
2. 使用方法
安装插件
将插件文件
(
createRectPlate_plugin.py
、createRectPlateDB.py
、createRectPlateModul.py
和rectplate.png
)放入Abaqus的插件目录中,例如
D:\SIMULIA\Abaqus\plugins\
。重启Abaqus。
启动插件
打开Abaqus,进入
Plugins
菜单。选择
it-tumulao-buildRect
。
输入参数
在弹出的对话框中,输入所需的参数值。
点击
OK
按钮,插件将自动创建并显示矩形薄板模型。
代码详解
首先,在当前工作文件夹中创建abaqus_plugins
文件夹,该文件夹主要用于存储abaqus插件,当abaqus打开时,便会在当前工作目录下寻找abaqus_plugins
文件夹中的插件,整体文件目录如下:
.
└── abaqus_plugins
└── create_rect_it_tumulao
├── createRectPlateDB.py
├── createRectPlateModul.py
├── createRectPlate_plugin.py
└── rectplate.png
2 directories, 4 files
下面是上述代码的一些解释:
1. 注册文件
createRectPlate_plugin.py
是插件的主入口文件,负责注册插件并初始化用户界面。以下是该文件的内容:
# -*- coding: utf-8 -*-
from abaqusGui import *
from abaqusConstants import ALL
import osutils, os
class CreateRectPlate_plugin(AFXForm):
def __init__(self, owner):
AFXForm.__init__(self, owner)
self.radioButtonGroups = {}
self.cmd = AFXGuiCommand(mode=self, method='createRectPlate',
objectName='createRectPlateModul', registerQuery=False)
self.lengthKw = AFXFloatKeyword(self.cmd, 'length', True, 100.0)
self.widthKw = AFXFloatKeyword(self.cmd, 'width', True, 100.0)
self.thicknessKw = AFXFloatKeyword(self.cmd, 'thickness', True, 1.0)
self.partNameKw = AFXStringKeyword(self.cmd, 'partName', True, 'rect_plate')
self.elasticModulusKw = AFXFloatKeyword(self.cmd, 'ElasticModulus', True, 210000.0)
self.poissonRatioKw = AFXFloatKeyword(self.cmd, 'PoissonRatio', True, 0.3)
self.seedKw = AFXFloatKeyword(self.cmd, 'seed', True, 10.0)
def getFirstDialog(self):
import createRectPlateDB
return createRectPlateDB.CreateRectPlateDB(self)
def doCustomChecks(self):
if self.lengthKw.getValue() <= 0:
showAFXErrorDialog(getAFXApp().getAFXMainWindow(), 'Length must be positive')
return False
if self.widthKw.getValue() <= 0:
showAFXErrorDialog(getAFXApp().getAFXMainWindow(), 'Width must be positive')
return False
if self.thicknessKw.getValue() <= 0:
showAFXErrorDialog(getAFXApp().getAFXMainWindow(), 'Thickness must be positive')
return False
if self.elasticModulusKw.getValue() <= 0:
showAFXErrorDialog(getAFXApp().getAFXMainWindow(), 'Elastic Modulus must be positive')
return False
if self.poissonRatioKw.getValue() < 0 or self.poissonRatioKw.getValue() >= 0.5:
showAFXErrorDialog(getAFXApp().getAFXMainWindow(), 'Poisson Ratio must be between 0 and 0.5')
return False
if self.seedKw.getValue() <= 0:
showAFXErrorDialog(getAFXApp().getAFXMainWindow(), 'Seed size must be positive')
return False
return True
def okToCancel(self):
return False
thisPath = os.path.abspath(__file__)
thisDir = os.path.dirname(thisPath)
toolset = getAFXApp().getAFXMainWindow().getPluginToolset()
toolset.registerGuiMenuButton(
buttonText='it-tumulao-buildRect',
object=CreateRectPlate_plugin(toolset),
messageId=AFXMode.ID_ACTIVATE,
icon=None,
kernelInitString='import createRectPlateModul',
applicableModules=ALL,
version='1.0',
author='it_tumulao',
description='Build a rect plate using Aba Plug-ins. by it_tumulao',
helpUrl='N/A'
)
关键代码解释:
AFXForm.__init__(self, owner)
:初始化Abaqus表单。AFXGuiCommand
:定义一个命令,用于调用内核模块中的函数。AFXFloatKeyword
和AFXStringKeyword
:定义用户输入的参数。doCustomChecks
:进行参数验证,确保输入的参数合法。toolset.registerGuiMenuButton
:注册插件到Abaqus的菜单栏。
2. 图形界面文件
createRectPlateDB.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 CreateRectPlateDB(AFXDataDialog):
def __init__(self, form):
AFXDataDialog.__init__(self, form, 'Create Rectangular Plate',
self.OK | self.CANCEL, DIALOG_ACTIONS_SEPARATOR)
okBtn = self.getActionButton(self.ID_CLICKED_OK)
okBtn.setText('OK')
GroupBox_1 = FXGroupBox(p=self, text='Parameters', opts=FRAME_GROOVE)
AFXTextField(p=GroupBox_1, ncols=12, labelText='Length (L):', tgt=form.lengthKw, sel=0)
AFXTextField(p=GroupBox_1, ncols=12, labelText='Width (W):', tgt=form.widthKw, sel=0)
AFXTextField(p=GroupBox_1, ncols=12, labelText='Thickness (T):', tgt=form.thicknessKw, sel=0)
AFXTextField(p=GroupBox_1, ncols=12, labelText='Part Name:', tgt=form.partNameKw, sel=0)
AFXTextField(p=GroupBox_1, ncols=12, labelText='Elastic Modulus (E):', tgt=form.elasticModulusKw, sel=0)
AFXTextField(p=GroupBox_1, ncols=12, labelText='Poisson Ratio (ν):', tgt=form.poissonRatioKw, sel=0)
AFXTextField(p=GroupBox_1, ncols=12, labelText='Seed Size:', tgt=form.seedKw, sel=0)
GroupBox_2 = FXGroupBox(p=self, text='Diagram', opts=FRAME_GROOVE)
fileName = os.path.join(thisDir, 'rectplate.png')
icon = afxCreatePNGIcon(fileName)
FXLabel(p=GroupBox_2, text='', ic=icon)
关键代码解释:
AFXDataDialog.__init__(self, form, 'Create Rectangular Plate', self.OK | self.CANCEL, DIALOG_ACTIONS_SEPARATOR)
:初始化数据对话框。AFXTextField
:创建文本输入框,用于接收用户输入的参数。FXGroupBox
:创建分组框,用于组织用户界面。afxCreatePNGIcon(fileName)
:创建PNG图标的图标,用于显示示意图。
3. 内核执行文件
createRectPlateModul.py
负责执行模型创建的具体逻辑。以下是该文件的内容:
# -*- coding: utf-8 -*-
from abaqus import *
from abaqusConstants import *
import section
import regionToolset
import part
import material
def createRectPlate(length, width, thickness, partName, ElasticModulus, PoissonRatio, seed):
# Create a sketch
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__', sheetSize=200.0)
s.rectangle(point1=(0.0, 0.0), point2=(length, width))
# Create a part
p = mdb.models['Model-1'].Part(name=partName, dimensionality=THREE_D, type=DEFORMABLE_BODY)
p.BaseShell(sketch=s)
del mdb.models['Model-1'].sketches['__profile__']
# Set the viewport
session.viewports['Viewport: 1'].setValues(displayedObject=p)
# Create material
matName = 'Steel'
mdb.models['Model-1'].Material(name=matName)
mdb.models['Model-1'].materials[matName].Elastic(table=((ElasticModulus, PoissonRatio),))
# Create shell section
secName = 'Section-1'
mdb.models['Model-1'].HomogeneousShellSection(
idealization=NO_IDEALIZATION,
integrationRule=GAUSS,
material=matName,
name=secName,
numIntPts=5,
poissonDefinition=DEFAULT,
preIntegrate=OFF,
temperature=GRADIENT,
thickness=thickness,
thicknessField='',
thicknessModulus=None,
thicknessType=UNIFORM,
useDensity=OFF
)
# Assign section to part
p = mdb.models['Model-1'].parts[partName]
f = p.faces
region = p.Set(faces=f, name='Set-1')
p.SectionAssignment(region=region, sectionName=secName, offset=0.0,
offsetType=MIDDLE_SURFACE, offsetField='',
thicknessAssignment=FROM_SECTION)
# Switch to mesh module
session.viewports['Viewport: 1'].partDisplay.setValues(mesh=ON)
session.viewports['Viewport: 1'].partDisplay.meshOptions.setValues(meshTechnique=ON)
p = mdb.models['Model-1'].parts[partName]
p.seedPart(size=seed, deviationFactor=0.1, minSizeFactor=0.1)
p.generateMesh()
# Switch to assembly module
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'].ConstrainedSketch
:创建一个新的草图。mdb.models['Model-1'].Part
:基于草图创建一个三维部分。mdb.models['Model-1'].Material
:定义材料属性。mdb.models['Model-1'].HomogeneousShellSection
:创建壳体截面。p.seedPart
和p.generateMesh
:设置网格划分参数并生成网格。a.Instance
:将部分实例化到装配体中。
视频演示
下面的视频演示了上述过程,主要记录了插件的运行方法:
总结
通过开发自定义GUI插件,我们可以显著简化Abaqus中的建模过程。本文介绍的 "it-tumulao-buildRect" 插件不仅提供了用户友好的界面,还允许用户快速创建矩形薄板模型,并自定义多个关键参数。
往期精彩内容推荐:
【开源有限元网格工具介绍】用 meshio 读取、转换网格格式
Gmsh专题文章:【开源有限元网格工具介绍】Gmsh:强大的三维有限元网格生成器
开源有限元求解器专题: