在ABAQUS中创建加载、边界条件时,需要使用set,创建set时需要使用对象集合对象中的Set函数,这个函数需要提供加入对象集合的列表,但这个对象列表好像并不能自行创建,只能通过ABAQUS各类对象集合中的findAt、getSequenceFromMask、getByBoundingSphere、getByBoundingCylinder或getByBoundingSphere函数得到,但这几个函数在直接使用PYTHON编程时都不太好用。
- findAt必须指定精确的位置(精确到1e-6),这在实际中可能很难达到;
- getSequenceFromMask这个函数需要传递一个对象掩码,这在程序编写时不可能得到,因而这个函数通常是rpy文件记录的abaqus操作中才会出现;
- getByBoundingBox、getByBoundingCylinder和getByBoundingSphere三个函数都要求所选择的对象必须完全处于指定的包围盒/柱/球内部,这容易误选中一些目标对象附近较小的对象,并不准确;
好在对象集合中提供了getClosest这个函数,可以得到距离指定的点最近的对象集合,而且可以指定搜索的精度。这个函数返回一个字典,如下所示
{0: (mdb.models['Model-1'].rootAssembly.instances['Part-1-1'].edges[74], (-4156.92193816531, -2400.0, 5250.0))}
返回的这个字典中键为序号,值为一个tuple,tuple中第一项是一个对象,第二项是该对象所处的精确位置,因而可以使用findAt函数通过这个精确的位置坐标获取相应的对象列表传递给Set函数创建相应的Set对象,如下所示。
model1 = mdb.models['Model-1']
rootAss1 = model1.rootAssembly
ins1 = rootAss1.instances['Part-1-1']
e1 = ins1.edges.getClosest(coordinates=((1000,1000, 5250.0)),), searchTolerance=2.0)
e1Set = rootAss1.Set(edges= ins1.edges.findAt(coordinates=(e1[0][1],)), name='e1set0')