Python 2.7 Abaqus Python';获取最近的';命令
我正在使用getclosest命令查找顶点Python 2.7 Abaqus Python';获取最近的';命令,python-2.7,abaqus,Python 2.7,Abaqus,我正在使用getclosest命令查找顶点 ForceVertex1 = hatInstance.vertices.getClosest(coordinates=((x,y,z,)) 这是一个字典对象,具有键0和两个值(hatInstance.Vertexs[1]和顶点坐标)特定输出: {0: (mdb.models['EXP-100'].rootAssembly.instances['hatInstance-100'].vertices[1], (62.5242172081597, 101.
ForceVertex1 = hatInstance.vertices.getClosest(coordinates=((x,y,z,))
这是一个字典对象,具有键0和两个值(hatInstance.Vertexs[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])
公差=1.0e-3
顶点=[]
对于hatInstance.Vertexs中的顶点:
x=顶点点[0][0]
打印x
y=顶点点[0][1]
打印y
z=顶点点[0][2]
打印z
打破
如果(abs(x-x目标))<公差和abs(y-y目标)<公差和abs(z-z目标)<公差):
append(hatInstance.vertex[vertex.index:vertex.index+1])
xTarget等是我的坐标,尽管如此,我仍然没有得到顶点对象对于那些用它拼凑的人,我解决了它 不要使用getClosest命令,因为它返回dictionary对象,尽管手册建议这样做。我无法将此字典对象(特别是其中的键和值)转换为独立对象(顶点) 而是使用Instance.vertices.getByBoundingSphere(中心=,半径=)
中心基本上是坐标的元组,半径是公差。这将返回一个顶点数组,如果需要几何对象,只需访问字典即可。 一种方法是:
ForceVertex1 = hatInstance.vertices.getClosest(coordinates=((x,y,z,))[0][0]
这将仅返回顶点对象,您可以将其指定给集合或其他任何对象。编辑:找到一个解决方案,以实际解决原始问题:
part=mdb.models[modelName].parts[partName]
v=part.vertices.getClosest(坐标=((x,y,z)),)
注意坐标((()),)的格式要求,三组带逗号的括号。这将找到离指定点最近的顶点。为了使用它创建一个集合,我发现您需要使用Abaqus Python接口,以使用其“getSequenceFromMask”方法的格式返回顶点。为了创建一个集合,边、面和/或顶点需要是Abaqus内部的“序列”类型。为此,我使用以下代码:
v2=部分垂直性findAt(((v[0][1]),)
part.Set(name='setName',顶点=v2)
注意,v[0][1]将给出顶点所在的点。再次注意指定点的格式,使用findAt方法(((点)),)和三组括号和一个逗号。这将返回在Abaqus中使用getSequenceFromMask方法的顶点(您可以通过键入v2进行检查,然后在CAE底部的python框中输入,与Abaqus 2020一起使用)。这是类型“Sequence”(您可以通过键入类型(V2)进行检查),可以用于创建一个集合。如果没有正确设置findAt中的点的格式(例如,findAt(v[0][1]),没有括号和逗号),它将返回一个与使用getClosest(例如,v[0][0])返回的字典相同的顶点。这是“顶点”类型,不能用于创建集合,即使它需要顶点。如果知道顶点的确切位置,则不需要第一步。只需使用格式正确的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:keyworderror-on-faces”。
如果我通过face=f[0]访问字典,我会得到错误“Feature Creation Failed”。如果我通过f[0][0]访问字典中的元组,我会再次收到错误“TypeError:keyword error on faces”
使用.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”来创建集合,但不能使用实际的面对象“f[0]”来创建集合。一般使用这种方法的问题是,“findAt”的公差非常小,因此,您必须确定对象在模型中的位置,或者在np.arange()中步长为1e-6,以确保不会错过立方体中的面。由于步长很小,预计代码将花费很长时间
无论如何,我可以使用通过“findAt”获得的元组(或元组列表)在Abaqus中创建一个集合。但是,我不能使用通过“getClosest”获得的元组来创建一个集合,即使我看不到这两个对象之间的差异。这是不幸的,因为getClosest可以立即有效地为我提供所需的准确信息,而无需我混乱的for循环。@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)
```