Abaqus Python二次开发1-后处理
1、参考
2、Session对象的使用
2.1 Viewport及其相关对象
2.1.1 rpy脚本日志
打开ABAQUS CAE后,rpy脚本日志(abaqus.rpy)如下,一个Viewport对象’Viewport: 1’已经建立。
# -*- coding: mbcs -*-
#
# Abaqus/CAE Release 2016 replay file
# Internal Version: 2015_09_25-04.31.09 126547
# Run by Admin on Sat Apr 13 14:10:43 2024
#
# from driverUtils import executeOnCaeGraphicsStartup
# executeOnCaeGraphicsStartup()
#: Executing "onCaeGraphicsStartup()" in the site directory ...
from abaqus import *
from abaqusConstants import *
session.Viewport(name='Viewport: 1', origin=(0.0, 0.0), width=277.064270019531,
height=185.775238037109)
session.viewports['Viewport: 1'].makeCurrent()
session.viewports['Viewport: 1'].maximize()
from caeModules import *
from driverUtils import executeOnCaeStartup
executeOnCaeStartup()
session.viewports['Viewport: 1'].partDisplay.geometryOptions.setValues(
referenceRepresentation=ON)
2.1.2 打开一个odb文件(先更新其版本)
session.upgradeOdb("D:/work/abaqus/code/chapter14/HertzContact.odb",
"C:/Users/Admin/AppData/Local/Temp/HertzContact.odb", )
o= session.openOdb('C:/Users/Admin/AppData/Local/Temp/HertzContact.odb')
2.1.3 新建一个Viewport对象
myViewport=session.Viewport(name='myViewport',border=ON,titleBar=ON,titleStyle=CUSTOM,customTitleString='egxam')
session.viewports['Viewport: 1'].minimize()
myViewport.setValues(width=150,height=100,origin=(0,0))
2.1.4 显示odb对象
myViewport.setValues(displayedObject=o)
from abaqusConstants import *
myViewport.odbDisplay.setPrimaryVariable(variableLabel='S',outputPosition=INTEGRATION_POINT,refinement=(INVARIANT,'Mises'))
myViewport.odbDisplay.display.setValues(plotState=(CONTOURS_ON_DEF,))
myViewport.odbDisplay.commonOptions.setValues(deformationScaling=UNIFORM,uniformScaleFactor=1,visibleEdges=FEATURE)
myViewport.viewportAnnotationOptions.setValues(triad=ON,state=OFF,annotations=OFF,title=OFF,legendDecimalPlaces=0,legendNumberFormat=FIXED,legendBox=OFF)
2.1.5 对轴对称问题扩展显示3d结果
myViewport.odbDisplay.basicOptions.setValues(sweepElem=ON,sweepStartAngleElem=10,sweepEndAngleElem=120)
>>> myViewport.view.rotate(yAngle=30)
>>> myViewport.view.fitView()
>>> myViewport.view.setViewpoint(viewVector=(1,1,1))
>>> myViewport.view.fitView()
2.2 path对象
2.2.1 根据节点号建path
>>> path0=session.Path(name='Path-0',type=NODE_LIST,expression=(('BASE-1',(2,'26:16:-1',)),))
2.2.2 根据圆的径向和周向建path
>>> path1=session.Path(name='Path-1',type=RADIAL,expression=((0,0,0),(0,0,1),(0,-1.0,0)),circleDefinition=ORIGIN_AXIS,numSegments=20,radialAngle=0,startRadius=0,endRadius=CIRCLE_RADIUS)
>>> path2=session.Path(name='Path-2',type=CIRCUMFERENTIAL,expression=((0,0,0),(0,0,1),(0,-1.0,0)),circleDefinition=ORIGIN_AXIS,numSegments=20,startAngle=0,endAngle=120,radius=CIRCLE_RADIUS)
2.3 XYData对象
2.3.1用二维数组建XYData
>>> xyData1=session.XYData(data=((1,2),(2,4),(3,6)),name='Data1',legendLabel='Data1',xValuesLabel='x',yValuesLabel='y')
>>> print(xyData1.data)
((1.0, 2.0), (2.0, 4.0), (3.0, 6.0))
2.3.2从文本文件建XYData
>>> xyData2=session.XYDataFromFile(fileName='D:\\work\\abaqus\\code\\chapter14\\dataFile.txt',name='Data2',xField=1,yField=3)
>>> print(xyData2.data)
((1.0, 4.0), (3.0, 8.0), (5.0, 12.0), (7.0, 16.0))
>>> print(session.xyDataObjects['Data2'].data )
((1.0, 4.0), (3.0, 8.0), (5.0, 12.0), (7.0, 16.0))
2.3.2从ODB文件建XYData
读取上图4个单元的Mises应力值,注意session.xyDataListFromField得到的是xyDataObjects组成的表,xyDataObjects的data为((时间,应力),)二维数组
>>> myDatas=session.xyDataListFromField(odb=o,outputPosition=INTEGRATION_POINT,
... variable=(('S',INTEGRATION_POINT,((INVARIANT,'Mises'),)),),
... elementLabels=(('BALL-1',(16,17,)),('BASE-1',(46,91,)),))
>>> myDatas.data
AttributeError: 'list' object has no attribute 'data'
>>> myDatas
[xyDataObjects['S:Mises PI: BALL-1 E: 16 IP: 1'], xyDataObjects['S:Mises PI: BALL-1 E: 17 IP: 1'], xyDataObjects['S:Mises PI: BASE-1 E: 46 IP: 1'], xyDataObjects['S:Mises PI: BASE-1 E: 91 IP: 1']]
>>> myDatas[0].data
((0.0, 0.0), (0.0575000010430813, 545.926025390625), (0.141874998807907, 657.686279296875), (0.217812493443489, 721.672607421875), (0.502578139305115, 884.13427734375), (0.758867204189301, 959.973815917969), (1.0, 1024.65600585938))
从path读取应力:
注意20段21个点竟然有22个应力值,?因为接触点0位置有两个应力值?data为tuple类型
>>> myData=session.XYDataFromPath(path=path1,shape=UNDEFORMED,labelType=TRUE_DISTANCE,includeIntersections=False,name='myData',variable=(('S',INTEGRATION_POINT,((INVARIANT,'Mises'),)),))
>>> myData.data
((0.0, 1321.88549804688), (0.0, 1024.65600585938), (0.0500000007450581, 1593.16662597656), (0.100000001490116, 2020.07702636719), (0.150000005960464, 2290.76171875), (0.200000002980232, 2464.67138671875), (0.25, 2575.916015625), (0.300000011920929, 2599.04760742188), (0.350000023841858, 2560.650390625), (0.400000035762787, 2449.23193359375), (0.450000047683716, 2317.66381835938), (0.500000059604645, 2156.81103515625), (0.550000071525574, 1996.16442871094), (0.600000083446503, 1863.08544921875), (0.650000095367432, 1730.00634765625), (0.700000107288361, 1602.94653320313), (0.75000011920929, 1500.44799804688), (0.800000131130219, 1397.94958496094), (0.850000143051147, 1295.451171875), (0.900000154972076, 1213.74206542969), (0.950000166893005, 1134.19897460938), (1.00000011920929, 1054.65576171875))
2.4 XYCurve和XYPlot对象
注意XYData依附于XYCurve,XYCurve依附于Chart,Chart依附于XYPlot,XYPlot依附于ViewPort,另外,Abaqus的对象仓库有点像字典类型,对象的成员属性不能用赋值命令,而应用方法(函数)来设置。
>>> myXYPlot=session.XYPlot(name='myXYPlot')
>>> chartName=myXYPlot.charts.keys()[0]
>>> chartName
'Chart-1'
>>> chart=myXYPlot.charts[chartName]
>>> chart
session.charts['Chart-1']
>>> myCurve=session.Curve(xyData=myData)
>>> chart.setValues(curvesToPlot=(myCurve,),)
>>> cvname=session.viewports.keys()[0]
>>> cvname
'Viewport: 1'
>>> cv=session.viewports[cvname]
>>> cvport=cv
>>> cvport
session.viewports['Viewport: 1']
>>> cvport.setValues(displayedObject=myXYPlot)
2.5 WriteXYReport和WriteFieldReport函数
2.5.1 WriteXYReport
>>> from abaqusConstants import *
>>> session.xyReportOptions.setValues(pageWidth=60,numDigits=6,totals=True,minMax=True,
... pageWidthLimited=SPECIFY,numberFormat=ENGINEERING)
>>> session.writeXYReport(fileName='data.txt',xyData=myData)
2.5.2 WriteFieldReport
用Leaf提取部分单元,再用cvport.odbDisplay.displayGroup.replace(leaf=myLeaf)替换进行显示:
>>> cvport.setValues(displayedObject=o)
>>> import displayGroupOdbToolset as dGO
>>> myLeaf=dGO.LeafFromModelElemLabels(elementLabels=(('BALL-1',('1:40:1',)),))
>>> cvport.odbDisplay.displayGroup.replace(leaf=myLeaf)
利用session.writeFieldReport将这部分单元应力结果写入报告文档中
session.writeFieldReport(fileName='abaqus.rpt',append=OFF,sortItem='Element Label',odb=o,step=0,frame=6,
outputPosition=INTEGRATION_POINT,variable=(('S',INTEGRATION_POINT,((
INVARIANT,'Mises'),)),))