【ABAQUS的python脚本】霸气建模:开发Abaqus插件,快速创建有限元模型

文摘   2024-09-26 14:52   广西  

在现代工程仿真中,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. 使用方法

  1. 安装插件

  • 将插件文件

    createRectPlate_plugin.py

    createRectPlateDB.pycreateRectPlateModul.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:定义一个命令,用于调用内核模块中的函数。

    • AFXFloatKeywordAFXStringKeyword:定义用户输入的参数。

    • 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.seedPartp.generateMesh:设置网格划分参数并生成网格。

    • a.Instance:将部分实例化到装配体中。

    视频演示

    下面的视频演示了上述过程,主要记录了插件的运行方法:

    总结

    通过开发自定义GUI插件,我们可以显著简化Abaqus中的建模过程。本文介绍的 "it-tumulao-buildRect" 插件不仅提供了用户友好的界面,还允许用户快速创建矩形薄板模型,并自定义多个关键参数。

    往期精彩内容推荐:


    挨踢的土木佬
    一名学习编程的土木佬,计算固体力学,以第一/通讯作者身份在IJNME、IJSS、力学学报、振动工程学报等权威期刊发表论文若干。热衷分享Python编程、数据处理和数值分析(含有限元)新知,不定期更新文章与笔记。
     最新文章