Abaqus python 脚本:select 共享相同坐标的两个连接器之一

Abaqus python scripting: select one of two connectors which share the same coordinates

我正在编写一个脚本,用于自动执行在 Abaqus 中创建模型的部分。在模型中,两个连接器元素应用于两个实例的 2 个节点。第一个连接器从实例 1 上的 a 点开始,到实例 2 上的 b 点结束。第二个连接器反之亦然。这意味着两个连接器显然共享相同的坐标和覆盖层。使用光标选择底层连接器不是问题,但是自动化此步骤并选择底层连接器以分配一个部分是我卡住的地方,因为您不能使用 findAt() 方法,因为它总是选择顶部连接器。两条电线都已实施,但将一个部分分配给第二个连接器不起作用。我能否以某种方式使用 getSequenceFromMask 访问第二个底层连接器?

我认为这与我如何找到边缘有关,并且可能在创建连接器的电线时为边缘创建名称或设置。我可以将 getSequenceFromMask 中的掩码指定为第二个连接器的所需边缘吗? 这是循环的一部分。坐标来自图书馆,部分名称来自列表

mdb.models['Model-1'].rootAssembly.WirePolyLine(mergeType=IMPRINT, meshable=False, points=((
    mdb.models['Model-1'].rootAssembly.instances[ListeGConZug[0]].vertices.findAt((
    dctX2['XKoordLLZ_%s' % ladida[i]][y], dctY2['YKoordLLZ_%s' % ladida[i]][y], dctZ2['ZKoordLLZ_%s' % 
   ladida[i]][y]), ), 
mdb.models['Model-1'].rootAssembly.instances[ladida[i]].vertices.findAt((
   dctX3['XKoordLLE_%s' % ladida[i]][y], dctY3['YKoordLLE_%s' % ladida[i]][y], dctZ3['ZKoordLLE_%s' % 
   ladida[i]][y]), )), ))
mdb.models['Model-1'].rootAssembly.features.changeKey(NameWire[-1], 
   toName=NameWire[-1])
mdb.models['Model-1'].rootAssembly.Set(edges=
   mdb.models['Model-1'].rootAssembly.edges.findAt(((dctX3['XKoordLLE_%s' % ladida[i]][y], 
   dctY3['YKoordLLE_%s' % ladida[i]][y], dctZ3['ZKoordLLE_%s' % ladida[i]][y]), )), 
   name=NameWireSetConGZug[-1])
mdb.models['Model-1'].rootAssembly.SectionAssignment(region=
   mdb.models['Model-1'].rootAssembly.sets[NameWireSetConGZug[-1]], sectionName=
   NameWireSetConGZug[-1])

来自 WirePolyLine(Abaqus 脚本参考指南)的文档:

points: A tuple of point pairs, each pair being itself represented by a tuple. For part level features each point can be a Vertex, Datum point, Reference point, orphan mesh Node, or InterestingPoint object specifying the points through which the polyline wire will pass. Each point can also be a tuple of Floats representing the coordinates of a point. For assembly level features each point can only be a Vertex, Reference point, or orphan mesh Node specifying the points through which the polyline wire will pass (coordinates cannot be specified). In any of the pairs, the first or second point can be NONE. In that case, the point pair will create a zero-length wire, which is required for certain types of connectors. You must specify at least one pair.

因此,您可以在每个实例上创建一个参考点并使用它们来定义您的 Wire 对象,或者直接使用顶点(如果您使用的是孤立网格,则为节点)。


只是对您的代码的评论:尝试使用变量和格式,以便您的代码清晰易读。例如:

m = mdb.models['Model-1']
a = m.rootAssembly

points = (
    a.instances[ListeGConZug[0]].vertices.findAt((
        dctX2['XKoordLLZ_%s' % ladida[i]][y],
        dctY2['YKoordLLZ_%s' % ladida[i]][y],
        dctZ2['ZKoordLLZ_%s' % ladida[i]][y]),
    ),
    #<...the rest of your points definition>
)

wire_feature = WirePolyLine(mergeType=IMPRINT, meshable=False, points=(points, )

当似乎不可能找到“线”边缘时,为所有正在寻找“线”边缘的人更新

如 OP 所述,有时似乎无法确定 Abaqus 会根据 findAt 方法选择正确的边。例如,如果您在同一位置有多个连接器,则可能会发生这种情况 and/or 连接器是位于同一坐标位置的连接节点。我找到了一个很好的解决方法。

当调用WirePolyLine方法时:

  1. 在 rootAssembly 级别创建边(重要!);
  2. 创建一个 Feature 对象;
  3. Returns Feature 对象。

Feature 对象只有两个成员:nameid。所以不可能直接使用它来创建一个 Set 之后分配连接器部分所需的(参见 SectionAssignment 方法文档)。但是,由于 Wire 的边缘是在 rootAssembly 级别创建的,我们可以循环遍历在所需位置找到的所有边缘,并选择具有良好 featureName!

的边缘
pos = (-5., 0., 0.)  # For example, this is the point where we are searching for our Wire

for edg in a.edges.findAt((pos,)):
    if edg.featureName == wire_feature.name:
        break