Python 2.7 Abaqus Python';获取最近的';命令

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.

我正在使用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.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)
```