您现在的位置是:首页 >技术杂谈 >【ABAQUS】【PYTHON】参数化有限元example 4/14: Cargo crane网站首页技术杂谈
【ABAQUS】【PYTHON】参数化有限元example 4/14: Cargo crane
文章目录
Program introduction
A light-service, cargo crane is shown above. You have been asked to determine the static deflections
of the crane when it carries a load
of 10 kN(you could set is as a list of Parameter variable).You should also identify the critical members and joints
in the structure: i.e, those with the highest stresses and loads.Because this is a static analysis you will analyze the cargo crane using Abaqus/Standard.
Overview about code
#
# Getting Started with Abaqus: Interactive Edition
#
# Script for static crane example
#
def GetBlockPosition(modelName, blockPrefix):
if blockPrefix == '':
return len(mdb.models[modelName].keywordBlock.sieBlocks)-1
pos = 0
for block in mdb.models[modelName].keywordBlock.sieBlocks:
if block[0:len(blockPrefix)].lower()==blockPrefix.lower():
return pos
pos=pos+1
return -1
from abaqus import *
from abaqusConstants import *
session.viewports['Viewport: 1'].makeCurrent()
session.viewports['Viewport: 1'].maximize()
from caeModules import *
from driverUtils import executeOnCaeStartup
executeOnCaeStartup()
Mdb()
session.viewports['Viewport: 1'].setValues(displayedObject=None)
##
## Sketch profile of truss
##
p = mdb.models['Model-1'].Part(name='Truss', dimensionality=THREE_D,
type=DEFORMABLE_BODY)
p.ReferencePoint(point=(0.0, 0.0, 0.0))
p = mdb.models['Model-1'].parts['Truss']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
d, r = p.datums, p.referencePoints
p.DatumPointByOffset(point=r[1], vector=(0.0, 1.0, 0.0))
p.DatumPointByOffset(point=r[1], vector=(8.0, 1.5, 0.9))
p.DatumPlaneByThreePoints(point1=r[1], point2=d[3], point3=d[2])
p.DatumAxisByPrincipalAxis(principalAxis=YAXIS)
session.viewports['Viewport: 1'].view.fitView()
t = p.MakeSketchTransform(sketchPlane=d[4], sketchUpEdge=d[5],
sketchPlaneSide=SIDE1, sketchOrientation=LEFT, origin=(0.0, 0.0, 0.0))
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
sheetSize=683.38, gridSpacing=17.08, transform=t)
g, v, d1, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=SUPERIMPOSE)
p = mdb.models['Model-1'].parts['Truss']
p.projectReferencesOntoSketch(sketch=s, filter=COPLANAR_EDGES)
session.viewports['Viewport: 1'].view.setValues(nearPlane=648.075,
farPlane=719.271, width=13.6266, height=9.28111, cameraPosition=(-71.5628,
0.978423, 679.645), cameraTarget=(4.83613, 0.978423, 0.544065))
s.Line(point1=(0.0, 0.0), point2=(8.05046582503149, 1.5))
s.CoincidentConstraint(entity1=v.findAt((0.0, 0.0)), entity2=g.findAt((0.0,
0.5)))
s.Line(point1=(8.05046582503149, 1.5), point2=(0.0, 1.0))
s.Line(point1=(0.0, 1.0), point2=(1.59409310185916, 0.297018794285658))
s.CoincidentConstraint(entity1=v.findAt((1.594093, 0.297019)),
entity2=g.findAt((4.025233, 0.75)))
s.Line(point1=(1.59409310185916, 0.297018794285658),
point2=(2.30592731982451, 1.14321701190598))
s.CoincidentConstraint(entity1=v.findAt((2.305927, 1.143217)),
entity2=g.findAt((4.025233, 1.25)))
s.Line(point1=(2.30592731982451, 1.14321701190598),
point2=(3.26033977276254, 0.607481575033539))
s.CoincidentConstraint(entity1=v.findAt((3.26034, 0.607482)),
entity2=g.findAt((4.025233, 0.75)))
s.Line(point1=(3.26033977276254, 0.607481575033539),
point2=(4.16525059699136, 1.25869624736747))
s.CoincidentConstraint(entity1=v.findAt((4.165251, 1.258696)),
entity2=g.findAt((4.025233, 1.25)))
s.Line(point1=(4.16525059699136, 1.25869624736747),
point2=(4.95150583156061, 0.922587451305882))
s.CoincidentConstraint(entity1=v.findAt((4.951506, 0.922587)),
entity2=g.findAt((4.025233, 0.75)))
s.breakCurve(curve1=g.findAt((4.025233, 0.75)),
point1=(0.733189206279801, 0.182644009590149),
curve2=g.findAt((1.95001, 0.720118)),
point2=(1.62787567272877, 0.433001518249512))
s.breakCurve(curve1=g.findAt((4.822279, 0.898509)),
point1=(2.34362044857835, 0.415118813514709),
curve2=g.findAt((2.783134, 0.875349)),
point2=(3.22040910681461, 0.701241612434387))
s.breakCurve(curve1=g.findAt((5.655403, 1.053741)),
point1=(4.04351950354929, 0.772772312164307),
curve2=g.findAt((4.558378, 1.090642)),
point2=(5.02767302451382, 0.95159912109375))
s.breakCurve(curve1=g.findAt((4.025233, 1.25)),
point1=(1.55629884485765, 1.09466052055359),
curve2=g.findAt((1.95001, 0.720118)),
point2=(2.32572264036564, 1.02312982082367))
s.breakCurve(curve1=g.findAt((5.178197, 1.321609)),
point1=(3.79300780849022, 1.23772192001343),
curve2=g.findAt((3.712795, 0.933089)),
point2=(4.168774592922, 1.18407392501831))
s.VerticalDimension(vertex1=v.findAt((0.0, 1.0)),
vertex2=v.findAt((0.0, 0.0)),
textPoint=(-0.304643334343144, 0.0216999053955078), value=1.0)
s.HorizontalDimension(vertex1=v.findAt((0.0, 0.0)),
vertex2=v.findAt((8.050466, 1.5)),
textPoint=(6.26233672422377, -0.443249702453613), value=8.05046582503149)
s.ParallelConstraint(entity1=g.findAt((1.152964, 1.071609)), entity2=g.findAt((
3.235589, 1.200957)))
s.ParallelConstraint(entity1=g.findAt((3.235589, 1.200957)), entity2=g.findAt((
6.107858, 1.379348)))
s.ParallelConstraint(entity1=g.findAt((0.797047, 0.148509)), entity2=g.findAt((
2.427216, 0.45225)))
s.ParallelConstraint(entity1=g.findAt((2.427216, 0.45225)), entity2=g.findAt((
4.105923, 0.765035)))
s.ParallelConstraint(entity1=g.findAt((4.105923, 0.765035)), entity2=g.findAt((
6.500986, 1.211294)))
s.EqualLengthConstraint(entity1=g.findAt((0.797047, 0.148509)),
entity2=g.findAt((2.427216, 0.45225)))
s.EqualLengthConstraint(entity1=g.findAt((2.39114, 0.445528)),
entity2=g.findAt((4.033769, 0.751591)))
s.EqualLengthConstraint(entity1=g.findAt((3.985233, 0.742547)),
entity2=g.findAt((6.416373, 1.195528)))
s.EqualLengthConstraint(entity1=g.findAt((1.152964, 1.071609)),
entity2=g.findAt((3.235589, 1.200957)))
s.EqualLengthConstraint(entity1=g.findAt((3.458891, 1.214826)),
entity2=g.findAt((6.33116, 1.393217)))
mdb.models['Model-1'].ConstrainedSketch(name='Truss', objectToCopy=s)
p = mdb.models['Model-1'].parts['Truss']
d = p.datums
p.Wire(sketchPlane=d[4], sketchUpEdge=d[5], sketchPlaneSide=SIDE1,
sketchOrientation=LEFT, sketch=s)
s.unsetPrimaryObject()
del mdb.models['Model-1'].sketches['__profile__']
session.viewports['Viewport: 1'].view.fitView()
p = mdb.models['Model-1'].parts['Truss']
d, r = p.datums, p.referencePoints
p.DatumPointByOffset(point=d[2], vector=(0.0, 0.0, 2.0))
p.DatumPointByOffset(point=r[1], vector=(0.0, 0.0, 2.0))
p.DatumPointByOffset(point=d[3], vector=(0.0, 0.0, 0.2))
p.DatumPlaneByThreePoints(point1=d[8], point2=d[9], point3=d[7])
t = p.MakeSketchTransform(sketchPlane=d[10], sketchUpEdge=d[5],
sketchPlaneSide=SIDE1, sketchOrientation=LEFT, origin=(4.122203, 0.75,
1.536252))
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
sheetSize=683.38, gridSpacing=17.08, transform=t)
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=SUPERIMPOSE)
p.projectReferencesOntoSketch(sketch=s, filter=COPLANAR_EDGES)
s.retrieveSketch(sketch=mdb.models['Model-1'].sketches['Truss'])
s.move(vector=(-4.14820681508444, -0.75), objectList=(g.findAt((0.0, 0.5)),
g.findAt((1.006308, 0.6875)), g.findAt((2.348053, 0.770833)), g.findAt((
3.354361, 0.958333)), g.findAt((4.696105, 1.041667)), g.findAt((5.702413,
1.229167)), g.findAt((1.006308, 0.1875)), g.findAt((3.018925, 0.5625)),
g.findAt((5.031541, 0.9375)), g.findAt((7.044158, 1.3125)), g.findAt((
1.341744, 1.083333)), g.findAt((6.708722, 1.416667)), g.findAt((4.025233,
1.25)), v.findAt((8.050466, 1.5)), v.findAt((0.0, 1.0))))
d = p.datums
p.Wire(sketchPlane=d[10], sketchUpEdge=d[5], sketchPlaneSide=SIDE1,
sketchOrientation=LEFT, sketch=s)
s.unsetPrimaryObject()
del mdb.models['Model-1'].sketches['__profile__']
##
## dummy part
##
p = mdb.models['Model-1'].Part(name='Truss-all',
objectToCopy=mdb.models['Model-1'].parts['Truss'])
session.viewports['Viewport: 1'].setValues(displayedObject=p)
v = p.vertices
p.WirePolyLine(points=((v.findAt(coordinates=(2.0, 0.375, 1.775)), v.findAt(
coordinates=(2.0, 0.375, 0.225))), (v.findAt(coordinates=(2.0, 0.375,
0.225)), v.findAt(coordinates=(2.666667, 1.166667, 1.7))), (v.findAt(
coordinates=(2.666667, 1.166667, 1.7)), v.findAt(coordinates=(2.666667,
1.166667, 0.3))), (v.findAt(coordinates=(4.0, 0.75, 1.55)), v.findAt(
coordinates=(4.0, 0.75, 0.45))), (v.findAt(coordinates=(4.0, 0.75, 0.45)),
v.findAt(coordinates=(5.333333, 1.333333, 1.4))), (v.findAt(coordinates=(
5.333333, 1.333333, 1.4)), v.findAt(coordinates=(5.333333, 1.333333,
0.6))), (v.findAt(coordinates=(5.333333, 1.333333, 0.6)), v.findAt(
coordinates=(6.0, 1.125, 1.325))), (v.findAt(coordinates=(6.0, 1.125,
1.325)), v.findAt(coordinates=(6.0, 1.125, 0.675)))), mergeType=IMPRINT,
meshable=ON)
##
## create cross brace part in the assembly module
##
a = mdb.models['Model-1'].rootAssembly
session.viewports['Viewport: 1'].setValues(displayedObject=a)
## Set coordinate system (done by default)
a.DatumCsysByDefault(CARTESIAN)
p = mdb.models['Model-1'].parts['Truss']
a.Instance(name='Truss-1', part=p, dependent=ON)
p = mdb.models['Model-1'].parts['Truss-all']
a.Instance(name='Truss-all-1', part=p, dependent=ON)
a.PartFromBooleanCut(name='Cross brace',
instanceToBeCut=a.instances['Truss-all-1'],
cuttingInstances=(a.instances['Truss-1'], ))
p = mdb.models['Model-1'].parts['Cross brace']
a.Instance(name='Cross brace-1', part=p, dependent=ON)
a.suppressFeatures(('Truss-1', 'Truss-all-1', ))
a.features['Truss-1'].resume()
p = mdb.models['Model-1'].parts['Cross brace']
session.viewports['Viewport: 1'].setValues(displayedObject=p)
##
## Create beam profiles and beam sections
##
mdb.models['Model-1'].BoxProfile(name='MainBoxProfile', b=0.05,
a=0.1, uniformThickness=ON, t1=0.005)
mdb.models['Model-1'].BoxProfile(name='BraceBoxProfile', b=0.03,
a=0.03, uniformThickness=ON, t1=0.003)
mdb.models['Model-1'].BeamSection(name='MainMemberSection',
profile='MainBoxProfile', poissonRatio=0.25,
integration=BEFORE_ANALYSIS, table=((2.e11, 8.e10),))
mdb.models['Model-1'].BeamSection(name='BracingSection',
profile='BraceBoxProfile', poissonRatio=0.25,
integration=BEFORE_ANALYSIS, table=((2.e11, 8.e10),))
##
## Flip tangent directions
##
##p = mdb.models['Model-1'].parts['Truss']
##e = p.edges
##edges = e
##regions = regionToolset.Region(edges=edges)
##p.flipTangent(regions=regions)
####
##edges = e.findAt(((4.5, 0.84375, 0.50625), ), ((2.5, 0.46875, 0.28125), ), ((
## 0.5, 0.09375, 0.05625), ), ((4.5, 0.84375, 1.49375), ), ((2.5, 0.46875,
## 1.71875), ), ((0.5, 0.09375, 1.94375), ))
##regions = regionToolset.Region(edges=edges)
##p.flipTangent(regions=regions)
##
## Assign beam sections to the cross brace
##
p = mdb.models['Model-1'].parts['Cross brace']
e = p.edges
edges = e.findAt(((2.666667, 1.166667, 1.35), ),
((2.166667, 0.572917, 0.59375), ), ((2.0, 0.375, 1.3875), ),
((6.0, 1.125, 1.1625), ), ((5.5, 1.28125, 0.78125), ),
((5.333333, 1.333333, 1.2), ), ((4.333333, 0.895833, 0.6875), ),
((4.0, 0.75, 1.275), ))
region = regionToolset.Region(edges=edges)
p.SectionAssignment(region=region, sectionName='BracingSection')
##
## Assign beam sections to the internal bracing
##
p = mdb.models['Model-1'].parts['Truss']
e = p.edges
edges = e.findAt(((3.0, 1.0625, 0.3375), ), ((5.5, 1.28125, 0.61875), ),
((4.333333, 0.895833, 0.4875), ), ((0.5, 0.84375, 0.05625), ),
((2.166667, 0.572917, 0.24375), ), ((3.0, 1.0625, 1.6625), ),
((5.5, 1.28125, 1.38125), ), ((4.333333, 0.895833, 1.5125), ),
((0.5, 0.84375, 1.94375), ), ((2.166667, 0.572917, 1.75625), ))
region = regionToolset.Region(edges=edges)
p.SectionAssignment(region=region, sectionName='BracingSection')
##
## Assign beam sections to the main members
##
p = mdb.models['Model-1'].parts['Truss']
e = p.edges
edges = e.findAt(((4.5, 0.84375, 0.50625), ), ((4.666667, 1.291667, 0.525), ),
((6.5, 1.21875, 0.73125), ), ((7.333333, 1.458333, 0.825), ),
((2.5, 0.46875, 0.28125), ), ((2.0, 1.125, 0.225), ),
((0.5, 0.09375, 0.05625), ), ((4.5, 0.84375, 1.49375), ),
((4.666667, 1.291667, 1.475), ), ((6.5, 1.21875, 1.26875), ),
((7.333333, 1.458333, 1.175), ), ((2.5, 0.46875, 1.71875), ),
((2.0, 1.125, 1.775), ), ((0.5, 0.09375, 1.94375), ))
region = regionToolset.Region(edges=edges)
p.SectionAssignment(region=region, sectionName='MainMemberSection')
##
## Assign beam section orientations to truss 'B'
##
p = mdb.models['Model-1'].parts['Truss']
e = p.edges
edges = e.findAt(((4.5, 0.84375, 0.50625), ), ((3.0, 1.0625, 0.3375), ),
((4.666667, 1.291667, 0.525), ), ((5.5, 1.28125, 0.61875), ),
((6.5, 1.21875, 0.73125), ), ((7.333333, 1.458333, 0.825), ),
((4.333333, 0.895833, 0.4875), ), ((2.5, 0.46875, 0.28125), ),
((0.5, 0.84375, 0.05625), ), ((2.0, 1.125, 0.225), ),
((2.166667, 0.572917, 0.24375), ), ((0.5, 0.09375, 0.05625), ))
region=regionToolset.Region(edges=edges)
p.assignBeamSectionOrientation(region=region, method=N1_COSINES, n1=(-0.1118,
0.0, 0.9936))
##
## Assign beam section orientations to truss 'A'
##
p = mdb.models['Model-1'].parts['Truss']
e = p.edges
edges = e.findAt(((4.5, 0.84375, 1.49375), ), ((3.0, 1.0625, 1.6625), ),
((4.666667, 1.291667, 1.475), ), ((5.5, 1.28125, 1.38125), ),
((6.5, 1.21875, 1.26875), ), ((7.333333, 1.458333, 1.175), ),
((4.333333, 0.895833, 1.5125), ), ((2.5, 0.46875, 1.71875), ),
((0.5, 0.84375, 1.94375), ), ((2.0, 1.125, 1.775), ),
((2.166667, 0.572917, 1.75625), ), ((0.5, 0.09375, 1.94375), ))
region=regionToolset.Region(edges=edges)
p.assignBeamSectionOrientation(region=region, method=N1_COSINES, n1=(-0.1118,
0.0, -0.9936))
##
## Assign beam section orientations to 'Cross brace'
##
p = mdb.models['Model-1'].parts['Cross brace']
e = p.edges
edges = e.findAt(((2.666667, 1.166667, 1.35), ), ((2.166667, 0.572917,
0.59375), ), ((2.0, 0.375, 1.3875), ), ((6.0, 1.125, 1.1625), ), ((5.5,
1.28125, 0.78125), ), ((5.333333, 1.333333, 1.2), ), ((4.333333, 0.895833,
0.6875), ), ((4.0, 0.75, 1.275), ))
region=regionToolset.Region(edges=edges)
p.assignBeamSectionOrientation(region=region, method=N1_COSINES,
n1=(0.0, 1.0, 0.0))
session.viewports['Viewport: 1'].setValues(displayedObject=a)
a.regenerate()
##
##
session.viewports['Viewport: 1'].assemblyDisplay.setValues(
visibleInstances=('Truss-1', 'Cross brace-1'))
session.viewports['Viewport: 1'].assemblyDisplay.geometryOptions.setValues(
geometryEdgesInShaded=OFF, datumPoints=OFF, datumAxes=OFF, datumPlanes=OFF,
datumCoordSystems=OFF, referencePointLabels=OFF, referencePointSymbols=OFF)
##
## Translate the truss
##
p = a.instances['Truss-1']
p.translate(vector=(0.0, -0.5, -1.0))
##
## Translate the cross brace
##
p = a.instances['Cross brace-1']
p.translate(vector=(0.0, -0.5, -1.0))
##
## Create geometry sets
##
session.viewports['Viewport: 1'].assemblyDisplay.setValues(
visibleInstances=('Truss-1', ))
session.viewports['Viewport: 1'].assemblyDisplay.geometryOptions.setValues(
datumPoints=OFF)
v = a.instances['Truss-1'].vertices
verts = v.findAt(((0.0, 0.5, -1.0), ), ((0.0, -0.5, -1.0), ), ((0.0, 0.5,
1.0), ), ((0.0, -0.5, 1.0), ))
a.Set(vertices=verts, name='Attach')
verts = v.findAt(((8.0, 1.0, 0.1), ))
a.Set(vertices=verts, name='Tip-a')
verts = v.findAt(((8.0, 1.0, -0.1), ))
a.Set(vertices=verts, name='Tip-b')
e = a.instances['Truss-1'].edges
edges = e.findAt(((6.5, 0.71875, 0.26875), ))
a.Set(edges=edges, name='Leg-a')
edges = e.findAt(((6.5, 0.71875, -0.26875), ))
a.Set(edges=edges, name='Leg-b')
edges = e.findAt(((4.333333, 0.395833, 0.5125), ))
a.Set(edges=edges, name='Inner-a')
edges = e.findAt(((4.333333, 0.395833, -0.5125), ))
a.Set(edges=edges, name='Inner-b')
session.viewports['Viewport: 1'].assemblyDisplay.setValues(
visibleInstances=('Cross brace-1', ))
session.viewports['Viewport: 1'].view.setValues(
cameraPosition=(7.4736, 8.3559, 20.002),
cameraUpVector=(-0.34023, 0.72044, -0.60432))
session.viewports['Viewport: 1'].assemblyDisplay.setValues(
visibleInstances=('Truss-1', 'Cross brace-1'))
session.viewports['Viewport: 1'].view.setValues(session.views['Iso'])
##
## Create a static general step
##
mdb.models['Model-1'].StaticStep(name='Tip load',
previous='Initial', description='Static tip load on crane',
timePeriod=1, adiabatic=OFF, maxNumInc=100,
stabilization=None, timeIncrementationMethod=AUTOMATIC, initialInc=1,
minInc=1e-05, maxInc=1, matrixSolver=SOLVER_DEFAULT, amplitude=RAMP,
extrapolation=LINEAR, fullyPlastic="")
session.viewports['Viewport: 1'].assemblyDisplay.setValues(step='Tip load')
##
## Modify output requests
##
mdb.models['Model-1'].fieldOutputRequests['F-Output-1'].setValues(
variables=('U', 'RF', 'SF'))
mdb.models['Model-1'].historyOutputRequests['H-Output-1'].setValues(
variables=PRESELECT)
##
## Create constraints between the tips of the truss
##
session.viewports['Viewport: 1'].assemblyDisplay.setValues(interactions=ON)
mdb.models['Model-1'].Equation(name='TipConstraint-1',
terms=((1.0, 'Tip-a', 1), (-1.0, 'Tip-b', 1)))
mdb.models['Model-1'].Constraint('TipConstraint-2',
mdb.models['Model-1'].constraints['TipConstraint-1'])
mdb.models['Model-1'].constraints['TipConstraint-2'].setValues(
terms=((1.0, 'Tip-a', 2), (-1.0, 'Tip-b', 2)))
##
## Create JOIN connectors between truss and bracing
##
v1 = a.instances['Cross brace-1'].vertices
v2 = a.instances['Truss-1'].vertices
a.WirePolyLine(points=((v1.findAt(coordinates=(2.0, -0.125, 0.775)), v2.findAt(
coordinates=(2.0, -0.125, 0.775))), (v1.findAt(coordinates=(2.666667,
0.666667, 0.7)), v2.findAt(coordinates=(2.666667, 0.666667, 0.7))), (
v1.findAt(coordinates=(2.0, -0.125, -0.775)), v2.findAt(coordinates=(2.0,
-0.125, -0.775))), (v1.findAt(coordinates=(2.666667, 0.666667, -0.7)),
v2.findAt(coordinates=(2.666667, 0.666667, -0.7))), (v1.findAt(
coordinates=(4.0, 0.25, -0.55)), v2.findAt(coordinates=(4.0, 0.25,
-0.55))), (v1.findAt(coordinates=(4.0, 0.25, 0.55)), v2.findAt(
coordinates=(4.0, 0.25, 0.55))), (v1.findAt(coordinates=(5.333333,
0.833333, 0.4)), v2.findAt(coordinates=(5.333333, 0.833333, 0.4))), (
v1.findAt(coordinates=(5.333333, 0.833333, -0.4)), v2.findAt(coordinates=(
5.333333, 0.833333, -0.4))), (v1.findAt(coordinates=(6.0, 0.625, -0.325)),
v2.findAt(coordinates=(6.0, 0.625, -0.325))), (v1.findAt(coordinates=(6.0,
0.625, 0.325)), v2.findAt(coordinates=(6.0, 0.625, 0.325)))),
mergeType=IMPRINT, meshable=OFF)
e1 = a.edges
edges1 = e1.findAt(((6.000025, 0.625, 0.325), ), ((6.000025, 0.625, -0.325), ),
((5.333358, 0.833333, -0.4), ), ((5.333358, 0.833333, 0.4), ), ((4.000025,
0.25, 0.55), ), ((4.000025, 0.25, -0.55), ), ((2.666692, 0.666667, -0.7),
), ((2.000025, -0.125, -0.775), ), ((2.666692, 0.666667, 0.7), ), ((
2.000025, -0.125, 0.775), ))
a.Set(edges=edges1, name='Wire-1-Edge-1')
mdb.models['Model-1'].ConnectorSection(name='ConnSect-1',
translationalType=JOIN)
region=a.sets['Wire-1-Edge-1']
a.SectionAssignment(sectionName='ConnSect-1', region=region)
session.viewports['Viewport: 1'].assemblyDisplay.setValues(loads=ON, bcs=ON,
predefinedFields=ON, interactions=OFF)
##
## Apply encastre bc to set 'Attach'
##
region = a.sets['Attach']
mdb.models['Model-1'].EncastreBC(name='Fixed end', createStepName='Tip load',
region=region)
##
## Apply concentrated force to set 'Tip-b'
##
region = a.sets['Tip-b']
mdb.models['Model-1'].ConcentratedForce(name='Tip load',
createStepName='Tip load', region=region, cf2=-10000.0)
##
## Assign global seed
##
p = mdb.models['Model-1'].parts['Truss']
p.seedPart(size=2.0)
p = mdb.models['Model-1'].parts['Cross brace']
p.seedPart(size=2.0)
##
## Assign element type
##
elemType1 = mesh.ElemType(elemCode=B33)
p = mdb.models['Model-1'].parts['Cross brace']
e = p.edges
edges = e
pickedRegions =(edges, )
p.setElementType(regions=pickedRegions, elemTypes=(elemType1, ))
p = mdb.models['Model-1'].parts['Truss']
e = p.edges
edges = e
pickedRegions =(edges, )
p.setElementType(regions=pickedRegions, elemTypes=(elemType1, ))
##
## Generate mesh
##
p = mdb.models['Model-1'].parts['Truss']
p.generateMesh()
p = mdb.models['Model-1'].parts['Cross brace']
p.generateMesh()
##
## Add keywords
##
mdb.models['Model-1'].keywordBlock.synchVersions()
mdb.models['Model-1'].keywordBlock.insert(GetBlockPosition('Model-1', '*End Assembly')-1, """*NORMAL, TYPE=ELEMENT
Inner-a, Inner-a, -0.3962, 0.9171, 0.0446
Inner-b, Inner-b, 0.3962, -0.9171, 0.0446
Leg-a, Leg-a, -0.1820, 0.9829, 0.0205
Leg-b, Leg-b, 0.1820, -0.9829, 0.0205""")
##
## Create job
##
mdb.Job(name='Crane', model='Model-1',
description='3-D model of light-service cargo crane')
a.regenerate()
session.viewports['Viewport: 1'].setValues(displayedObject=a)
##
## Save model database
##
mdb.saveAs('Crane.cae')
1.Getting Started with Abaqus: Interactive Edition
片段
def GetBlockPosition(modelName, blockPrefix):
if blockPrefix == '':
return len(mdb.models[modelName].keywordBlock.sieBlocks)-1
pos = 0
for block in mdb.models[modelName].keywordBlock.sieBlocks:
if block[0:len(blockPrefix)].lower()==blockPrefix.lower():
return pos
pos=pos+1
return -1
from abaqus import *
from abaqusConstants import *
session.viewports['Viewport: 1'].makeCurrent()
session.viewports['Viewport: 1'].maximize()
from caeModules import *
from driverUtils import executeOnCaeStartup
executeOnCaeStartup()
Mdb()
执行结果
## 内容解析
引入 abaqusConstants 类
abaqusConstants
是Abaqus Python API中的一个模块,其中包含了Abaqus中使用的常量和标志位的定义。通过导入abaqusConstants
模块,Python脚本可以使用这些常量和标志位来调用Abaqus的函数和方法,以便进行模拟、后处理和其他操作。
这个模块包含了各种常量,例如节点类型、单元类型、边界条件类型、材料模型类型、积分点类型
等等。使用这些常量可以方便地调用Abaqus API的函数和方法,而无需记住这些常量的具体值。
例如,通过abaqusConstants
模块,可以使用NODE
常量来表示节点的类型,而不是直接使用整数值1
。这样可以使代码更清晰易读,并减少错误的可能性。
下面是一些abaqusConstants
模块中定义的常量的示例:
from abaqusConstants import *
# 定义节点类型常量
NODE = NODAL
# 定义单元类型常量
ELEMENT = C3D8
# 定义材料模型类型常量
MATERIAL_MODEL = ISOTROPIC_HARDENING
# 定义积分点类型常量
INTEGRATION_POINT = GAUSS_POINT_2D
注意,当导入abaqusConstants
模块时,可以使用通配符符号*
来导入所有定义的常量,例如from abaqusConstants import *
。然而,这种方法可能会导致命名冲突和代码难以维护,因此建议仅导入需要使用的常量。
引入session 类
session
是Abaqus/CAE中的一个对象,它代表了当前Abaqus会话的状态和操作。在Abaqus/CAE中,用户可以通过GUI界面进行模型创建、修改和后处理等操作,而session
对象则是在Python脚本中进行这些操作的主要接口。
通过session
对象,Python脚本可以访问和修改Abaqus/CAE中的各种对象和属性,例如模型、材料、边界条件、荷载、分析步等等
。可以使用session
对象的方法来创建模型
、修改模型属性、运行分析、执行后处理等操作。
以下是一些使用session
对象的示例:
from abaqus import *
from abaqusConstants import *
from caeModules import *
# 设置当前视口
session.viewports['Viewport: 1'].makeCurrent()
# 创建一个新模型
myModel = mdb.Model(name='MyModel')
# 创建一个新部件并设置属性
myPart = myModel.Part(name='MyPart', dimensionality=THREE_D, type=DEFORMABLE_BODY)
# 创建一个新材料
myMaterial = myModel.Material(name='MyMaterial')
# 创建一个新荷载
myLoad = myModel.loads['MyLoad']
# 运行分析
myJob = mdb.Job(name='MyJob', model=myModel)
myJob.submit()
在这个示例中,使用session
对象的viewports
属性来设置当前视口。然后,创建了一个新的Abaqus模型,并使用session
对象的Model
属性来访问和修改模型属性。接下来,创建了一个新部件、一个新材料和一个新荷载,并使用session
对象的loads
属性来访问和修改荷载属性。最后,创建了一个新的Abaqus作业,并使用session
对象的Job
属性来访问和修改作业属性,然后提交作业以运行分析。
需要注意的是,session
对象只能在Abaqus/CAE中使用,无法直接在Python脚本中使用。在Python脚本中,可以使用Abaqus Python API中的其他对象和函数来进行模拟和后处理操作。
引入caeModules,driverUtils 类
caeModules
和driverUtils
是Abaqus Python API中的两个模块,用于在Python脚本中调用Abaqus/CAE中的各种模块和函数。
caeModules
模块包含了Abaqus/CAE中各种模块的定义,例如Part、Assembly、Interaction、Load等等。通过导入caeModules
模块,Python脚本可以使用这些模块来创建、修改和管理Abaqus模型。
以下是一个使用caeModules
模块的示例:
from abaqus import *
from abaqusConstants import *
from caeModules import *
# 创建一个新模型
myModel = mdb.Model(name='MyModel')
# 创建一个新部件并设置属性
myPart = myModel.Part(name='MyPart', dimensionality=THREE_D, type=DEFORMABLE_BODY)
# 创建一个新荷载
myLoad = myModel.loads['MyLoad']
在这个示例中,使用caeModules
模块的Model
属性来创建一个新的Abaqus模型,然后使用Part
属性来创建一个新的部件,并使用loads
属性来创建一个新的荷载。
driverUtils
模块包含了一些与Abaqus/CAE的驱动程序相关的函数和类。例如,通过executeOnCaeStartup()
函数,可以在Abaqus/CAE启动时自动执行Python脚本中的指定函数。另外,Driver
类可以用于在Python脚本中控制Abaqus/CAE的交互式会话。
以下是一个使用driverUtils
模块的示例:
from abaqus import *
from abaqusConstants import *
from caeModules import *
from driverUtils import executeOnCaeStartup, Driver
# 在Abaqus/CAE启动时自动执行hello()函数
def hello():
print('Hello, Abaqus!')
executeOnCaeStartup(hello)
# 创建一个新模型
myModel = mdb.Model(name='MyModel')
# 打开Abaqus/CAE的交互式会话
session.viewports['Viewport: 1'].makeCurrent()
session.viewports['Viewport: 1'].maximize()
myDriver = Driver()
myDriver.run()
在这个示例中,使用driverUtils
模块的executeOnCaeStartup()
函数来注册一个名为hello()
的函数,在Abaqus/CAE启动时自动执行。然后,使用Driver
类来打开Abaqus/CAE的交互式会话,并使用run()
方法来运行会话。
executeOnCaeStartup(),Mdb()
executeOnCaeStartup()
和Mdb()
都是driverUtils
模块中定义的函数。
executeOnCaeStartup()
函数用于在Abaqus/CAE**启动时自动执行**
Python脚本中的指定函数。在这个函数中可以指定一个Python函数,当Abaqus/CAE启动时就会自动执行这个函数。这个函数可以用于设置一些全局变量、初始化一些参数或执行一些特定的操作。示例代码如下:
from driverUtils import executeOnCaeStartup
def myFunction():
print('Hello from myFunction!')
executeOnCaeStartup(myFunction)
在这个示例中,myFunction()
函数将在Abaqus/CAE启动时自动执行,并输出一条消息。
Mdb()
函数用于创建一个新的Abaqus模型数据库
,它返回一个表示新模型数据库的对象。在创建新模型数据库后,可以使用模型数据库对象来创建新的模型、部件、材料、荷载等。示例代码如下:
from abaqus import *
from abaqusConstants import *
from caeModules import *
from driverUtils import executeOnCaeStartup
executeOnCaeStartup()
# 创建一个新模型数据库
myModelDB = Mdb()
在这个示例中,使用driverUtils
模块的executeOnCaeStartup()
函数来执行一些初始化操作。然后,使用Mdb()
函数创建一个新的Abaqus模型数据库,并将其赋值给一个变量myModelDB
。此时,myModelDB
表示一个空的Abaqus模型数据库对象。
定义GetBlockPosition的函数
def GetBlockPosition(modelName, blockPrefix):
# modelName:要搜索的Abaqus模型(model)的名称。
# blockPrefix:要查找的关键字块的前缀(prefix)。
if blockPrefix == '':
return len(mdb.models[modelName].keywordBlock.sieBlocks)-1
# 函数首先检查blockPrefix是否为空字符串。如果是,则返回最后一个关键字块的位置。
pos = 0
# 否则,函数遍历modelName模型的关键字块列表,并检查每个关键字块的前缀是否与blockPrefix匹配。
for block in mdb.models[modelName].keywordBlock.sieBlocks:
if block[0:len(blockPrefix)].lower()==blockPrefix.lower():
return pos
pos=pos+1
# 如果找到了匹配的关键字块,则返回其位置。
# 如果没有找到匹配的关键字块,则返回-1。
return -1
这个函数可以用于在Abaqus模型中自动查找
特定类型的关键字块
,例如材料定义、单元定义、荷载定义等等。通过使用这个函数,Python脚本可以自动从模型中提取需要的信息,并进行后续处理。
2.1 Sketch profile of truss - ReferencePoint / DatumPoint
这段代码用于在Abaqus模型中创建一个简单的桁架结构,并将其显示在Abaqus/CAE的视口中。
片段
# 第一行代码使用setValues()方法将当前视口的displayedObject属性设置为None,
# 从而清除当前视口中显示的对象。这是为了确保后续创建的模型能够正确显示在视口中。
session.viewports['Viewport: 1'].setValues(displayedObject=None)
# 接下来,创建一个名为Truss的新部件,并将其设置为三维可变形体。
p = mdb.models['Model-1'].Part(name='Truss', dimensionality=THREE_D,
type=DEFORMABLE_BODY)
# 然后,在部件上创建一个参考点,用于后续创建几何特征。
p.ReferencePoint(point=(0.0, 0.0, 0.0))
# 然后,获取Truss部件对象,
p = mdb.models['Model-1'].parts['Truss']
# 并将其设置为当前视口的显示对象。这使得后续创建的几何特征将直接显示在视口中。
session.viewports['Viewport: 1'].setValues(displayedObject=p)
# 接下来,使用DatumPointByOffset()方法在参考点上创建两个偏移点,用于创建桁架的两个端点。
d, r = p.datums, p.referencePoints
p.DatumPointByOffset(point=r[1], vector=(0.0, 1.0, 0.0))
p.DatumPointByOffset(point=r[1], vector=(8.0, 1.5, 0.9))
# 然后,使用DatumPlaneByThreePoints()方法在这三个点上创建一个平面,用于后续创建桁架的横杆。
p.DatumPlaneByThreePoints(point1=r[1], point2=d[3], point3=d[2])
# 最后,使用DatumAxisByPrincipalAxis()方法创建一个沿着Y轴方向的主轴,用于后续创建桁架的竖杆。
p.DatumAxisByPrincipalAxis(principalAxis=YAXIS)
# 最后一行代码使用fitView()方法将视口调整为适合于新创建的模型的大小和位置,从而确保整个模型在视口中完全可见。
session.viewports['Viewport: 1'].view.fitView()
总的来说,这段代码用于在Abaqus/CAE中创建并显示一个简单的桁架结构。它演示了如何使用Abaqus Python API在Python脚本中创建模型并将其显示在Abaqus/CAE的视口中。
执行结果
2.2 Sketch profile of truss - MakeSketch(创建草图+几何约束)
这段代码用于在Abaqus模型中创建一个桁架结构的草图,并将其转换为桁架的线条。
执行结果
片段
# 首先,创建一个草图变换(sketch transform),用于将草图平面和方向与桁架的参考平面和方向对齐。
t = p.MakeSketchTransform(sketchPlane=d[4], sketchUpEdge=d[5],
sketchPlaneSide=SIDE1, sketchOrientation=LEFT, origin=(0.0, 0.0, 0.0))
# 然后,在模型中创建一个规定的草图(ConstrainedSketch),并将其设置为超级叠加对象(primary object)。
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
sheetSize=683.38, gridSpacing=17.08, transform=t)
g, v, d1, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=SUPERIMPOSE)
# 接下来,使用projectReferencesOntoSketch()方法将桁架参考几何体`投影`到草图上,以便在草图中创建桁架线条。
p = mdb.models['Model-1'].parts['Truss']
p.projectReferencesOntoSketch(sketch=s, filter=COPLANAR_EDGES)
session.viewports['Viewport: 1'].view.setValues(nearPlane=648.075,
farPlane=719.271, width=13.6266, height=9.28111, cameraPosition=(-71.5628,
0.978423, 679.645), cameraTarget=(4.83613, 0.978423, 0.544065))
# 然后,使用s.Line()方法创建桁架的线条,
s.Line(point1=(0.0, 0.0), point2=(8.05046582503149, 1.5))
# 并使用s.CoincidentConstraint()方法将线条约束到桁架参考几何体上。
s.CoincidentConstraint(entity1=v.findAt((0.0, 0.0)), entity2=g.findAt((0.0,
0.5)))
s.Line(point1=(8.05046582503149, 1.5), point2=(0.0, 1.0))
s.Line(point1=(0.0, 1.0), point2=(1.59409310185916, 0.297018794285658))
s.CoincidentConstraint(entity1=v.findAt((1.594093, 0.297019)),
entity2=g.findAt((4.025233, 0.75)))
s.Line(point1=(1.59409310185916, 0.297018794285658),
point2=(2.30592731982451, 1.14321701190598))
s.CoincidentConstraint(entity1=v.findAt((2.305927, 1.143217)),
entity2=g.findAt((4.025233, 1.25)))
s.Line(point1=(2.30592731982451, 1.14321701190598),
point2=(3.26033977276254, 0.607481575033539))
s.CoincidentConstraint(entity1=v.findAt((3.26034, 0.607482)),
entity2=g.findAt((4.025233, 0.75)))
s.Line(point1=(3.26033977276254, 0.607481575033539),
point2=(4.16525059699136, 1.25869624736747))
s.CoincidentConstraint(entity1=v.findAt((4.165251, 1.258696)),
entity2=g.findAt((4.025233, 1.25)))
s.Line(point1=(4.16525059699136, 1.25869624736747),
point2=(4.95150583156061, 0.922587451305882))
s.CoincidentConstraint(entity1=v.findAt((4.951506, 0.922587)),
entity2=g.findAt((4.025233, 0.75)))
# 接下来,使用s.breakCurve()方法在线条上创建新的连接点,以便在草图中创建桁架的横杆和竖杆。
s.breakCurve(curve1=g.findAt((4.025233, 0.75)),
point1=(0.733189206279801, 0.182644009590149),
curve2=g.findAt((1.95001, 0.720118)),
point2=(1.62787567272877, 0.433001518249512))
s.breakCurve(curve1=g.findAt((4.822279, 0.898509)),
point1=(2.34362044857835, 0.415118813514709),
curve2=g.findAt((2.783134, 0.875349)),
point2=(3.22040910681461, 0.701241612434387))
s.breakCurve(curve1=g.findAt((5.655403, 1.053741)),
point1=(4.04351950354929, 0.772772312164307),
curve2=g.findAt((4.558378, 1.090642)),
point2=(5.02767302451382, 0.95159912109375))
s.breakCurve(curve1=g.findAt((4.025233, 1.25)),
point1=(1.55629884485765, 1.09466052055359),
curve2=g.findAt((1.95001, 0.720118)),
point2=(2.32572264036564, 1.02312982082367))
s.breakCurve(curve1=g.findAt((5.178197, 1.321609)),
point1=(3.79300780849022, 1.23772192001343),
curve2=g.findAt((3.712795, 0.933089)),
point2=(4.168774592922, 1.18407392501831))
# 然后,使用s.VerticalDimension()方法和s.HorizontalDimension()方法创建桁架线条之间的水平和垂直尺寸。
s.VerticalDimension(vertex1=v.findAt((0.0, 1.0)),
vertex2=v.findAt((0.0, 0.0)),
textPoint=(-0.304643334343144, 0.0216999053955078), value=1.0)
s.HorizontalDimension(vertex1=v.findAt((0.0, 0.0)),
vertex2=v.findAt((8.050466, 1.5)),
textPoint=(6.26233672422377, -0.443249702453613), value=8.05046582503149)
# 最后,使用s.ParallelConstraint()方法
# 和s.EqualLengthConstraint()方法对线条进行并行和等长约束。
s.ParallelConstraint(entity1=g.findAt((1.152964, 1.071609)), entity2=g.findAt((
3.235589, 1.200957)))
s.ParallelConstraint(entity1=g.findAt((3.235589, 1.200957)), entity2=g.findAt((
6.107858, 1.379348)))
s.ParallelConstraint(entity1=g.findAt((0.797047, 0.148509)), entity2=g.findAt((
2.427216, 0.45225)))
s.ParallelConstraint(entity1=g.findAt((2.427216, 0.45225)), entity2=g.findAt((
4.105923, 0.765035)))
s.ParallelConstraint(entity1=g.findAt((4.105923, 0.765035)), entity2=g.findAt((
6.500986, 1.211294)))
s.EqualLengthConstraint(entity1=g.findAt((0.797047, 0.148509)),
entity2=g.findAt((2.427216, 0.45225)))
s.EqualLengthConstraint(entity1=g.findAt((2.39114, 0.445528)),
entity2=g.findAt((4.033769, 0.751591)))
s.EqualLengthConstraint(entity1=g.findAt((3.985233, 0.742547)),
entity2=g.findAt((6.416373, 1.195528)))
s.EqualLengthConstraint(entity1=g.findAt((1.152964, 1.071609)),
entity2=g.findAt((3.235589, 1.200957)))
s.EqualLengthConstraint(entity1=g.findAt((3.458891, 1.214826)),
entity2=g.findAt((6.33116, 1.393217)))
# 接下来,使用mdb.models['Model-1'].ConstrainedSketch()方法创建一个具有相同几何形状和约束的新草图。
mdb.models['Model-1'].ConstrainedSketch(name='Truss', objectToCopy=s)
# 然后,获取Truss部件对象,
p = mdb.models['Model-1'].parts['Truss']
d = p.datums
# 并使用p.Wire()方法将新草图转换为桁架的线条。
p.Wire(sketchPlane=d[4], sketchUpEdge=d[5], sketchPlaneSide=SIDE1,
sketchOrientation=LEFT, sketch=s)
# 最后,使用s.unsetPrimaryObject()方法将当前草图的超级叠加对象属性取消设置
s.unsetPrimaryObject()
这段代码用于在Abaqus/CAE中创建桁架结构的草图,并将其转换为桁架的线条。它演示了如何使用Abaqus Python API在Python脚本中创建模型和几何特征,并如何使用几何约束和操作对特征进行编辑和转换。
超级叠加对象(primary object)
超级叠加对象(primary object)是在Abaqus/CAE中用于创建草图、几何特征和模型的一种特殊对象。一个草图或几何特征可以被指定为超级叠加对象,这样它就可以与其他对象重叠并与其对齐
,而不会影响其他对象的位置和形状。
在创建草图或几何特征时,可以使用setPrimaryObject()
方法将其指定为超级叠加对象。一旦指定为超级叠加对象,该对象就会被放置在其他对象的顶部,并可以与其他对象重叠。在草图中,超级叠加对象通常用于创建几何特征;
在几何特征中,超级叠加对象通常用于创建其他几何特征
。
在Abaqus/CAE中,超级叠加对象通常用于创建复杂的几何特征和模型。使用超级叠加对象可以避免几何特征之间的冲突和干扰,从而使几何特征更加容易编辑和修改。
projectReferencesOntoSketch()将几何引用对象(例如边、面和体)投影到草图平面
projectReferencesOntoSketch()
方法用于将几何引用对象(例如边、面和体)投影到草图平面上,并在草图中创建相应的几何图形。下面是一个示例,演示如何使用projectReferencesOntoSketch()
方法将一个立方体的侧面边投影到草图中,并在草图中创建相应的线条。
from abaqus import *
from abaqusConstants import *
from caeModules import *
# 创建模型、部件和草图
myModel = mdb.Model(name='myModel')
myPart = myModel.Part(name='myPart', dimensionality=THREE_D, type=DEFORMABLE_BODY)
mySketch = myPart.MakeSketch(name='mySketch', sheetSize=10.0)
# 创建立方体并获取其侧面边
myPart.Cube(center=(0,0,0), size=2.0)
sideEdge = myPart.edges.findAt((1.0, 0.0, 0.0))
# 将侧面边投影到草图中,并在草图中创建相应的线条
mySketch.projectReferencesOntoSketch(filter=COPLANAR_EDGES,
sketchPlane=myPart.faces[0], sketchUpEdge=None, sketchPlaneSide=SIDE1, sketchOrientation=RIGHT)
mySketch.Line(point1=(0.0,0.0), point2=(1.0,0.0))
# 创建模型视口并显示草图和几何对象
myViewport = session.Viewport(name='myViewport')
myViewport.setValues(displayedObject=myPart)
myViewport.partDisplay.setValues(sectionAssignments=ON)
myViewport.assemblyDisplay.setValues(sectionAssignments=ON)
myViewport.setValues(displayedObject=mySketch)
myViewport.view.fitView()
# 显示模型视口
myViewport.maximize()
myViewport.view.setProjection(projection=PARALLEL)
myViewport.view.setValues(nearPlane=10.0, farPlane=20.0,
width=10.0, height=10.0, cameraPosition=(10.0, 10.0, 10.0),
cameraTarget=(0.0, 0.0, 0.0))
在这个示例中,首先创建了一个模型、部件和草图。然后,使用Cube()
方法在部件中创建一个立方体,并使用edges.findAt()
方法获取立方体的侧面边。接下来,使用projectReferencesOntoSketch()
方法将侧面边投影到草图中,并在草图中创建相应的线条。最后,创建一个模型视口并显示草图和几何对象。
需要注意的是,projectReferencesOntoSketch()
方法需要指定投影的平面、投影的对象类型和投影的方向。在本示例中,投影的平面为立方体的第一个面,投影的对象类型为共面边,投影的方向为右侧。此外,需要注意的是,在投影完成后,需要手动在草图中创建相应的几何对象,如本示例中的线条。
2.3
执行结果
片段
del mdb.models['Model-1'].sketches['__profile__']
session.viewports['Viewport: 1'].view.fitView()
p = mdb.models['Model-1'].parts['Truss']
d, r = p.datums, p.referencePoints
p.DatumPointByOffset(point=d[2], vector=(0.0, 0.0, 2.0))
p.DatumPointByOffset(point=r[1], vector=(0.0, 0.0, 2.0))
p.DatumPointByOffset(point=d[3], vector=(0.0, 0.0, 0.2))
p.DatumPlaneByThreePoints(point1=d[8], point2=d[9], point3=d[7])
t = p.MakeSketchTransform(sketchPlane=d[10], sketchUpEdge=d[5],
sketchPlaneSide=SIDE1, sketchOrientation=LEFT, origin=(4.122203, 0.75,
1.536252))
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
sheetSize=683.38, gridSpacing=17.08, transform=t)
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=SUPERIMPOSE)
p.projectReferencesOntoSketch(sketch=s, filter=COPLANAR_EDGES)
s.retrieveSketch(sketch=mdb.models['Model-1'].sketches['Truss'])
s.move(vector=(-4.14820681508444, -0.75), objectList=(g.findAt((0.0, 0.5)),
g.findAt((1.006308, 0.6875)), g.findAt((2.348053, 0.770833)), g.findAt((
3.354361, 0.958333)), g.findAt((4.696105, 1.041667)), g.findAt((5.702413,
1.229167)), g.findAt((1.006308, 0.1875)), g.findAt((3.018925, 0.5625)),
g.findAt((5.031541, 0.9375)), g.findAt((7.044158, 1.3125)), g.findAt((
1.341744, 1.083333)), g.findAt((6.708722, 1.416667)), g.findAt((4.025233,
1.25)), v.findAt((8.050466, 1.5)), v.findAt((0.0, 1.0))))
d = p.datums
p.Wire(sketchPlane=d[10], sketchUpEdge=d[5], sketchPlaneSide=SIDE1,
sketchOrientation=LEFT, sketch=s)
s.unsetPrimaryObject()
del mdb.models['Model-1'].sketches['__profile__']
解析
这段代码是用于在Abaqus/CAE中创建桁架结构的示例。下面是对每行代码的解释:
del mdb.models['Model-1'].sketches['__profile__']
删除原有的草图。
session.viewports['Viewport: 1'].view.fitView()
将视口中的模型缩放以适应视口大小。
p = mdb.models['Model-1'].parts['Truss']
d, r = p.datums, p.referencePoints
p.DatumPointByOffset(point=d[2], vector=(0.0, 0.0, 2.0))
p.DatumPointByOffset(point=r[1], vector=(0.0, 0.0, 2.0))
p.DatumPointByOffset(point=d[3], vector=(0.0, 0.0, 0.2))
p.DatumPlaneByThreePoints(point1=d[8], point2=d[9], point3=d[7])
获取Truss部件对象,并在该部件中创建三个偏移点和一个三点平面。
t = p.MakeSketchTransform(sketchPlane=d[10], sketchUpEdge=d[5],
sketchPlaneSide=SIDE1, sketchOrientation=LEFT, origin=(4.这行代码不完整,可能是由于输入时意外按下了回车键。根据上下文推测,这行代码的完整形式应该是:
s = mdb.models['Model-1'].ConstrainedSketch(name='__profile__',
sheetSize=683.38, gridSpacing=17.08, transform=t)
创建一个名为__profile__
的约束草图,并将其命名为s
。该草图的大小为sheetSize=683.38
,网格间隔为gridSpacing=17.08
,变换对象为t
。
g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints
s.setPrimaryObject(option=SUPERIMPOSE)
p.projectReferencesOntoSketch(sketch=s, filter=COPLANAR_EDGES)
s.retrieveSketch(sketch=mdb.models['Model-1'].sketches['Truss'])
s.move(vector=(-4.14820681508444, -0.75), objectList=(g.findAt((0.0, 0.5)),
g.findAt((1.006308, 0.6875)), g.findAt((2.348053, 0.770833)), g.findAt((
3.354361, 0.958333)), g.findAt((4.696105, 1.041667)), g.findAt((5.702413,
1.229167)), g.findAt((1.006308, 0.1875)), g.findAt((3.018925, 0.5625)),
g.findAt((5.031541, 0.9375)), g.findAt((7.044158, 1.3125)), g.findAt((
1.341744, 1.083333)), g.findAt((6.708722, 1.416667)), g.findAt((4.025233,
1.25)), v.findAt((8.050466, 1.5)), v.findAt((0.0, 1.0))))
获取约束草图s
中的几何、顶点、尺寸和约束,并将草图s
指定为超级叠加对象。然后,使用projectReferencesOntoSketch()
方法将部件中的几何对象投影到草图s
中。接下来,使用retrieveSketch()
方法将Truss部件中的草图复制到草图s
中,然后使用move()
方法移动草图中的几何对象以与部件中的几何对象对齐。最后,将草图s
中的几何对象用于创建部件中的线。
d = p.datums
p.Wire(sketchPlane=d[10], sketchUpEdge=d[5], sketchPlaneSide=SIDE1,
sketchOrientation=LEFT, sketch=s)
获取Truss部件中的所有基准面和基准轴,并使用草图s
中的几何对象创建一个线框架。
s.unsetPrimaryObject()
del mdb.models['Model-1'].sketches['__profile__']
将草图s
的超级叠加对象属性取消,然后删除草图。
3 dummy part
片段
##
## dummy part
##
p = mdb.models['Model-1'].Part(name='Truss-all',
objectToCopy=mdb.models['Model-1'].parts['Truss'])
session.viewports['Viewport: 1'].setValues(displayedObject=p)
v = p.vertices
p.WirePolyLine(points=((v.findAt(coordinates=(2.0, 0.375, 1.775)), v.findAt(
coordinates=(2.0, 0.375, 0.225))), (v.findAt(coordinates=(2.0, 0.375,
0.225)), v.findAt(coordinates=(2.666667, 1.166667, 1.7))), (v.findAt(
coordinates=(2.666667, 1.166667, 1.7)), v.findAt(coordinates=(2.666667,
1.166667, 0.3))), (v.findAt(coordinates=(4.0, 0.75, 1.55)), v.findAt(
coordinates=(4.0, 0.75, 0.45))), (v.findAt(coordinates=(4.0, 0.75, 0.45)),
v.findAt(coordinates=(5.333333, 1.333333, 1.4))), (v.findAt(coordinates=(
5.333333, 1.333333, 1.4)), v.findAt(coordinates=(5.333333, 1.333333,
0.6))), (v.findAt(coordinates=(5.333333, 1.333333, 0.6)), v.findAt(
coordinates=(6.0, 1.125, 1.325))), (v.findAt(coordinates=(6.0, 1.125,
1.325)), v.findAt(coordinates=(6.0, 1.125, 0.675)))), mergeType=IMPRINT,
meshable=ON)
这段代码创建了一个名为Truss-all
的新部件,并从现有的名为Truss
的部件中复制了所有对象。然后,使用WirePolyLine()
方法创建了一个线框架,该线框架由一系列点组成,这些点是通过findAt()
方法从Truss-all
部件中的顶点中选择的。最后,使用mergeType=IMPRINT
将新的线框架与Truss-all
部件合并,并设置meshable=ON
以使该部件可网格化。
需要注意的是,这段代码中的点坐标是在Truss-all部件的局部坐标系中指定的。此外,使用WirePolyLine()
方法创建的线框架的起点和终点是通过相邻的点之间的线段自动确定的。因此,代码中指定的点的顺序非常重要。