前言
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 规定相应的功能
先观察案例中的插件程序界面里面有什么东西。
首先是有一个大框把所有东西都装起来,还有标题,再加上注意事项,画面中间还有一些小的参数框和示意图,最下面还有两个按钮。所以在这个部分就要先设计一个自己的对话框,在往对话框中填东西。就往最简单的方向,先造一个够用的小对话框。对话框里首先是底部按钮,参数对话框,示意图。分别讲讲这三个功能是如何用函数来实现的。
按钮用.getActionButton()来定义,
参数对话框用AFXTextField(p=GroupBox_l, ncols=’, labelText='零件名:', tgt=form.partnameKw, sel=O)。值得注意,因为我们有四个参数,名字,宽度,高度,直径,所以参数对话框就需要四个。
示意图用afxCreatePNGIcon()函数创建。详细代码如下:
# 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)
内核文件代码详细地从画图,搭建模型,组合模型,网格绘制,边界条件加载几个方面介绍。
个人总结,难免有纰漏和错误,还请诸君指正。关于abaqus二次开发大家想了解哪些方面,多多参与留言哦。
古人言,故不积跬步,无以至千里;不积小流,无以成江海。学习一门技术也是这样,只有持之以恒,才能不断精进。