基于Python的Abaqus二次开发实例讲解(asian582013.6.26)基于Python的Abaqus的二次开发便捷之处在于:1、所有的代码均可以先在Abaqus\CAE中操作一遍后再通过rp文件读取,然后再在此基础上进行相应的修改;2、Python是一种解释性语言,读起来非常清晰,因此在修改程序的过程中,不存在程序难以理解的问题;3、Python是一种通用性的、功能非常强大的面向对象编程语言,有许多成熟的类似于Matlab函数的程序在网络上流传,为后期进一步的数据处理提供了方便。
为了更加方便地完成Abaqus的二次开发,需进行一些相关约定:1、所有参数化直接通过点的坐标值进行,直接对几何尺寸的参数化反而更加繁琐;2、程序参数化已不允许在模型中添加太多的Tie,因此不同零部件的绑定直接通过共节点来进行,这就要求建模方法与常规的建模方法有所区别。
思路如下:将一个整机拆成几个大的Part来建立,一个Part中包含许多零件,这样在划分网格式时就可以自动实现共节点的绑定。
不同的零件可通过建立不同的Set来进行区分,不同Part 的绑定可以通过Tie来实现。
将一个复杂的结构拆成几个恰当的Part来建立,一方面可以将复杂的模型简单化,使建立复杂模型成为可能;另一方面,不同的Part可单独调用,从而又可实现程序的模块化,增加程序的适应范围,延长程序的使用寿命,也方便后期程序的维护和修改。
3、通过py文件建立起的模型要进行参数优化,已不适合采用Isight中Abaqus模块,需要用到Isight的Simcode模块。
下面详细解释一个臂架的py文件。
#此程序用来绘制臂架前段#导入相关模块#-*-coding:mbcs-*-from abaqus import*from abaqusConstants import*#定义整个臂架的长、宽、高L0=14300W0=1650H0=800#创建零件P01_12L1=H0+200W1=200T1=12s =mdb.models['Model-1'].ConstrainedSketch(name='__profile__',sheetSize=2000.0)g,v,d,c =s.geometry,s.vertices,s.dimensions,s.constraints s.setPrimaryObject(option=STANDALONE)s.rectangle(point1=(W0/2,L1/2),point2=(W0/2+W1,-L1/2))s.rectangle(point1=(-W0/2,L1/2),point2=(-W0/2-W1,-L1/2))p =mdb.models['Model-1'].Part(name='Part-1',dimensionality=THREE_D,type=DEFORMABLE_BODY)p =mdb.models['Model-1'].parts['Part-1']p.BaseShell(sketch=s)session.viewports['Viewport:1'].setValues(displayedObject=p)del mdb.models['Model-1'].sketches['__profile__']#定义零件的厚度p =mdb.models['Model-1'].parts['Part-1']f =p.facespickedFaces01=f.findAt (((W0/2,L1/2,0),),((-W0/2,L1/2,0),),)p.assignThickness(faces=pickedFaces01,thickness=T1)p.Set(faces=pickedFaces01,name='P01_12')#创建辅助平面和辅助坐标系p =mdb.models['Model-1'].parts['Part-1']p.DatumCsysByThreePoints(name='Datum csys-1',coordSysType=CARTESIAN,origin=(0.0,0.0,0.0),line1=(1.0,0.0,0.0),line2=(0.0,1.0,0.0))p =mdb.models['Model-1'].parts['Part-1']p.DatumPlaneByPrincipalPlane(principalPlane=XYPLANE,offset=L0)#创建零件P02_12L2=L1W2=W1T2=12p =mdb.models['Model-1'].parts['Part-1']d =p.datums#将草图原点参数化t =p.MakeSketchTransform(sketchPlane=d[5],sketchUpEdge=d[4].axis2,sketchPlaneSide=SIDE1,sketchOrientation=RIGHT,origin=(0.0,0.0,L0))s =mdb.models['Model-1'].ConstrainedSketch(name='__profile__',sheetSize=29006.85,gridSpacing=725.17,transform=t)g,v,d1,c =s.geometry,s.vertices,s.dimensions,s.constraints s.setPrimaryObject(option=SUPERIMPOSE)p =mdb.models['Model-1'].parts['Part-1']注:通过点的坐标进行参数化是模型参数化的最好选择。
注:建立一个零件后就立即对该零件建立一个Set ,Set 的建立可以方便后期的相关处理。
需要通过findAt()命令来选取相应的体、面、线或点。
注:所建立的第一个参考可以不编号。
注:从第二个草图开始就需要对草图的原点进行参数化。
s.rectangle(point1=(W0/2,L2/2),point2=(W0/2+W2,-L2/2))s.rectangle(point1=(-W0/2,L2/2),point2=(-W0/2-W2,-L2/2))p =mdb.models['Model-1'].parts['Part-1']d2=p.datumsp.Shell(sketchPlane=d2[5],sketchUpEdge=d2[4].axis2,sketchPlaneSide=SIDE1,sketchOrientation=RIGHT,sketch=s)s.unsetPrimaryObject()del mdb.models['Model-1'].sketches['__profile__']#定义零件的厚度p =mdb.models['Model-1'].parts['Part-1']f =p.facespickedFaces02=f.findAt(((W0/2,L1/2,L0),),((-W0/2,L1/2,L0),),)p.assignThickness (faces=pickedFaces02,thickness=T2)p.Set(faces=pickedFaces02,name='P02_12')#创建零件P03_12和零件P04_08T3=12T4=8p =mdb.models['Model-1'].parts['Part-1']d =p.datumst =p.MakeSketchTransform(sketchPlane=d[5],sketchUpEdge=d[4].axis2,sketchPlaneSide=SIDE1,sketchOrientation=RIGHT,origin=(0.0,0.0,L0))s =mdb.models['Model-1'].ConstrainedSketch(name='__profile__',sheetSize=29006.85,gridSpacing=725.17,transform=t)g,v,d1,c =s.geometry,s.vertices,s.dimensions,s.constraints s.setPrimaryObject(option=SUPERIMPOSE)#创建草图p =mdb.models['Model-1'].parts['Part-1']s.Line(point1=(-W0/2-W1,H0/2),point2=(-W0/2,H0/2))s.Line(point1=(W0/2,H0/2),point2=(W0/2+W1,H0/2))s.Line(point1=(-W0/2-W1,-H0/2),point2=(-W0/2,-H0/2))s.Line(point1=(W0/2,-H0/2),point2=(W0/2+W1,-H0/2))p =mdb.models['Model-1'].parts['Part-1']d2=p.datumsp.ShellExtrude(sketchPlane=d2[5],sketchUpEdge=d2[4].axis2,sketchPlaneSide=SIDE1,sketchOrientation=RIGHT,sketch=s,depth=L0,flipExtrudeDirection=ON)s.unsetPrimaryObject()del mdb.models['Model-1'].sketches['__profile__']#定义零件P03_12的厚度p =mdb.models['Model-1'].parts['Part-1']f =p.facespickedFaces03=f.findAt(((-W0/2,H0/2,L0/2),),((W0/2,H0/2,L0/2),),)p.assignThickness(faces=pickedFaces03,thickness=T3)注:给几何面赋厚度,可以在后期赋壳单元属性时直接选取几何面的厚度;也可以通过壳单元属性给建立的Set 赋予厚度。