前言
Python具有以下特点。Python语言是一种动态解释型编程语言,其功能强大,简单易学,支持面向对象编程((object-oriented programming),虽然由于其动态性致使程序解释执行速度比编译语言慢,但是随着Python语言的不断优化以及计算机硬件的迅猛发展,Python语言将会受到越来越多用户的关注。Python具有开源、自由等特征。它的简洁性和易用性使程序的开发过程变得简单,特别适用于快速应用程序开发。以有效提高前后处理效率,节省建模及数据处理时间。
采用Python语言对 Abaqus进行二次开发具有以下优点。
1)可以通过图形交互界面,实现参数的统一管理。
2)可以避免大量重复性的建模工作,避免人为建模错误。对于具有典型共有特征的模型可以建立标准的建模模板,实现完全参数化或者快速建模。
3)可以通过执行内核指令实现Abaqus/CAE不具备的甚至是人工手动操作无法实现的复杂问题建模。
Abaqus 用户图形界面程序主要有两种:简单GUI插件程序和用户自定义GUI应用程序。插件程序可以辅助完成一个或者几个功能,自定义应用程序可集成多功能、多界面,将多个功能组件集成在统一的平台内进行管理,适合大型应用程序开发。上述两类图形界面程序均可以辅助用户提高有限元建模及数据处理效率。
1 图形界面程序
图形界面文件的主要作用是定义各类窗体、控件,关联控件的执行命令及对象。通过定义文本框、单复选按钮、表格等各类控件,用户可以方便地将所需参数集成到统一的图形界面下,形成友好的输入输出界面。其程序部分源代码如下。
1.1 类(class)的结构
如果对“类”比较陌生,咱举一个例子,正如镐头⛏这类工具,首先定义它的属性,再定义有很多种功能一样。一个类(class)首先是定义一些参数属性,再定义一些函数(具有相应的功能),一个类可以包含很多种函数。就如下面所示这样。
class 解释类是什么: def __init__(self, 参数1,参数2,..., 参数n): self.参数1 = 参数1 ....... def function1():# 函数1 #执行功能1 return sth def function2():# 函数1 #执行功能2 return sth
1.2 引入相关的库
abaqusConstants,abaqusGui,kernelAccess,这三个库都是集成在abaqus中的,和 abaqus密切相关的库。
from abaqusConstants import *
from abaqusGui import *
from kernelAccess import mdb, session
import os
1.3 规定相应的功能
先观察案例中的插件程序界面里面有什么东西。
首先是有一个大框把所有东西都装起来,还有标题,再加上注意事项,画面中间还有一些小的参数框和示意图,最下面还有两个按钮。所以在这个部分就要先设计一个自己的对话框,在往对话框中填东西。就往最简单的方向,先造一个够用的小对话框。对话框里首先是底部按钮,参数对话框,示意图。分别讲讲这三个功能是如何用函数来实现的。
# Class definition
# Class definitionclass createPlateWithholeDB(AFXDataDialog): def __init__(self,form): # Construct the base class. # 创建对话框,该对话框有OK、CANCEL按键 AFXDataDialog.__init__(self, form, '带孔板参数化建模程序', self.OK | self.CANCEL, DIALOG_ACTIONS_SEPARATOR) # 定义OK按钮 okBtn = self.getActionButton(self.ID_CLICKED_OK) okBtn.setText('OK') # 定义文本框 GroupBox_1 = FXGroupBox(p=self, text='参数', opts=FRAME_GROOVE) AFXTextField(p=GroupBox_l, ncols=12, labelText='零件名:', tgt=form.partnameKw, sel=O) AFXTextField(p=GroupBox_l, ncols=12, labelText='宽度(w):', tgt=form.widthKw, sel=0) AFXTextField(p=GroupBox_l, 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)
2 内核文件
内核执行文件是插件程序的核心,其作用是驱动Abaqus/CAE执行内部命令,完成CAE建模以及数据处理等功能。本插件程序中的内核执行文件命名为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(pointl=(0.0,0.0),
point2=(width, height))
mdb.models['Model-1'].sketches['_profile_' ].CircleByCenterPerimeter(center=(width/2,
height/2), pointl=(width/2+radius, height/2))
mdb.models['Model-1'].Part(dimensionality=THREE_D,
name=partname, type=DEFORMABLE_BODY) mdb.models['Mode1-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', prelntegrate=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'l.partDisplay.setValues(mesh=ON)session.viewports['Viewport: 1'l.partDisplay.meshOptions.setValues( meshTechnique=ON) session.viewports['Viewport: 1'l.partDisplay.geometryOptions.setValues( referenceRepresentation=OFF) #切换到mesh模块 p= mdb.models['Model-1'l.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'l.setValues(displayedObject=a) #切换到装配模块 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.instanceslpartname+'-1'].edges edges1=el.findAt(((0.0, height/2,0.0),)) region = a.Set(edges=edgesl, name='Set-1') mdb.models['Model-1'].DisplacementBC(name='BC-1', createStepName='Step-', region=region, u1=0.0, amplitude-UNSET, fixed=OFF, distributionType=UNIFORM, fieldName="", localCsys=None) #施加边界条件 edgesl =e1.findAt((width, height/2,0.0),)) region = a.Set(edges=edgesl, name='Set-2') mdb.models['Model-1'].Displacement BC(name='BC-2', createStepName='Step-1', region=region, ul=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=O, waitHours=O, 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)
内核文件代码详细地从画图,搭建模型,组合模型,网格绘制,边界条件加载几个方面介绍。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删