我正在使用getclosest命令来查找顶点。
ForceVertex1 = hatInstance.vertices.getClosest(coordinates=((x,y,z,))
这是一个字典对象,其中包含Key 0和两个值(hatInstance.vertices [1]和顶点的坐标)具体输出:
{0: (mdb.models['EXP-100'].rootAssembly.instances['hatInstance-100'].vertices[1], (62.5242172081597, 101.192447407436, 325.0))}
每当我尝试创建一个集合时,都不接受顶点
mainAssembly.Set(vertices=ForceVertex1[0][0],name='LoadSet1')
我也尝试了另一种方式:
tolerance = 1.0e-3
vertex = []
for vertex in hatInstance.vertices:
x = vertex.pointOn[0][0]
print x
y = vertex.pointOn[0][1]
print y
z = vertex.pointOn[0][2]
print z
break
if (abs(x-xTarget)) < tolerance and abs(y-yTarget) < tolerance and abs(z-zTarget) < tolerance):
vertex.append(hatInstance.vertices[vertex.index:vertex.index+1])
xTarget等是我的坐标,尽管我仍然没有得到顶点对象
答案 0 :(得分:1)
对于那些与之斗争的人,我解决了它。
不要使用getClosest命令,因为它会返回一个字典对象,尽管手册推荐了这个。我无法将此字典对象,特别是一个键和一个值转换为独立对象(顶点)
而是使用Instance.vertices.getByBoundingSphere(center =,radius =) 中心基本上是坐标的元组,半径是公差。这将返回一个顶点数组
答案 1 :(得分:0)
如果你想要几何对象,你只需要访问字典。 一种方法是:
ForceVertex1 = hatInstance.vertices.getClosest(coordinates=((x,y,z,))[0][0]
这将仅返回顶点对象,您可以将其分配给集合或其他任何内容。
答案 2 :(得分:0)
编辑:找到了一个解决方案来实际解决原始问题:
part=mdb.models[modelName].parts[partName]
v=part.vertices.getClosest(coordinates=(((x,y,z)),))
请注意坐标((()),)的格式要求,这是三组带逗号的括号。这将找到最接近指定点的顶点。为了使用它来创建集合,我发现您需要对Abaqus Python接口进行按摩,以使用其“ getSequenceFromMask”方法的格式返回顶点。为了创建集合,边,面和/或顶点必须是“序列”类型,它在Abaqus内部。为此,我然后使用以下代码:
v2=part.verticies.findAt((((v[0][1])),))
part.Set(name='setName', vertices=v2)
请注意,v [0] [1]将为您提供顶点所在的点。再次使用带有三组括号和逗号的findAt方法(((point)),)注意指定点的格式。这将返回一个顶点,该顶点在Abaqus中使用getSequenceFromMask方法(您可以通过键入v2进行检查,然后在CAE底部的python框中输入,与Abaqus 2020一起使用)。这是“序列”类型(您可以通过键入type(V2)进行检查),并且可以用于创建集合。如果您未正确设置findAt中的点格式(例如,不带括号和逗号的findAt(v [0] [1]),则通过访问使用getClosest返回的字典(例如, v [0] [0])。这是'Vertex'类型,即使它要求一个顶点也不能用于创建一个集合。如果您知道顶点的确切点,则不需要第一步。您可以简单地使用带有正确格式的findAt方法。但是,findAt的公差很小(1e-6),如果在公差范围内未找到任何内容,则将返回空序列。如果您只知道顶点的位置,则需要首先使用getClosest方法。实际上,这将使顶点最接近指定的点,这可能是您感兴趣的顶点,也可能不是。
原始帖子:
这些答案都无法解决相似的问题,而我试图在一个点附近的某个范围内创建一组面。如果我按如下方式使用getClosest
f=mdb.models['Model-1'].parts['Part-1'].faces.getClosest(coordinates=((0,0,0),), searchTolerance=1)
mdb.models['Model-1'].parts['Part-1'].Set(faces=f, name='faceSet')
我收到一个错误“ TypeError:面孔上的关键字错误”。 如果我通过face = f [0]访问字典,则会出现错误“功能创建失败”。如果我通过f [0] [0]访问字典中的元组,则会再次收到错误“ TypeError:面孔上的关键字错误”。
使用.getByBoundingSphere的选项也不起作用,因为模型中的面很大,并且这些面必须完全包含在球体中,以便Abaqus可以“获取”它们,基本上需要我创建一个球体涵盖了整个模型。
我的解决方案是按如下方式创建自己的脚本:
import numpy as np
model=mdb.models['Model-1']
part=model.parts['Part-1']
faceSave=[]
faceSave2=[]
x=np.arange(-1,1,0.1)
y=np.arange(-1,1,0.1)
z=np.arange(-1,1,0.1)
for x1 in x:
for y1 in y:
for z1 in z:
f=part.faces.findAt(((x1,y1,z1),))
if len(f)>0:
if f[0] in faceSave2:
None
else:
faceSave.append(f)
faceSave2.append(f[0])
part.Set(faces=faceSave,name='faceSet')
这可行,但是异常慢,部分原因是“ findAt”会在找不到脸部时向控制台发出警告,并且通常用这种方法也找不到脸部。上面的代码基本上在一个小立方体中查找任何面孔,并将其放入“ faceSave”列表中。设置faceSave2以确保没有将重复的面孔添加到列表中。访问元组(例如,上面的代码中的f [0])包含有关面部的唯一信息,而“ f”只是指向“ findAt”命令的指针。奇怪的是,您可以使用指针'f'创建一个Set,但是不能使用实际的面部对象'f [0]'创建一个Set。这种通用方法的问题在于,“ findAt”的公差非常小,因此,您要么必须确定事物在模型中的位置,要么步长应为np.arange(1e-6)。 ),以确保您不会错过立方体中的面孔。步长很小,希望代码永远可用。
无论如何,我可以使用通过“ findAt”获得的元组(或元组列表)在Abaqus中创建Set。但是,即使看不到两个对象之间的差异,也无法使用通过“ getClosest”获得的元组进行设置。不幸的是,因为getClosest可以立即有效地提供我所需的确切信息,而不会造成混乱的for循环。
答案 3 :(得分:0)
@anarchoNobody: 非常感谢您编辑的答案! 此解决方法非常有效,也适用于面部。我花了很多时间试图弄清楚为什么 .getClosest 没有提供用于创建集合的工作结果,而是通过解决方法和它工作的括号数量。 如果应用到多个面,代码需要稍微修改:
faces=((mdb.models['Model-1'].rootAssembly.instances['TT-1'].faces.getClosest(
coordinates=(((10.0, 10.0, 10.0)),), searchTolerance=2)),
(mdb.models['Model-1'].rootAssembly.instances['TT-1'].faces.getClosest(
coordinates=((-10.0, 10.0, 10.0),), searchTolerance=2)),)
faces1=(mdb.models['Model-1'].rootAssembly.instances['Tube-1'].faces.findAt((((
faces[0][0][1])),)),
mdb.models['Model-1'].rootAssembly.instances['Tube-1'].faces.findAt((((
faces[1][0][1])),)),)
mdb.models['Model-1'].rootAssembly.Surface(name='TT-inner-surf', side1Faces=faces1)
```