【问题标题】:Abaqus python scripting: select one of two connectors which share the same coordinatesAbaqus python脚本:选择共享相同坐标的两个连接器之一
【发布时间】:2021-03-16 16:42:51
【问题描述】:

我正在编写一个脚本来自动执行在 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])

【问题讨论】:

  • 我建议您查看重播文件 (*.rpy),了解用于选择正确选项的特定选项,当您使用光标选择连接器并从那里开始时。
  • 感谢您的建议,但回放文件仍然只显示 findAt() 而没有显示如何访问其他边缘
  • 在创建每个连接器时为其创建单独的集合可能是可行的方法。你能提供一个最小的工作示例吗?
  • 感谢您的提示,但要这样做,您必须选择线组,您只能通过 findAt() 选择边来这样做

标签: python scripting abaqus


【解决方案1】:

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

points: 一个点对的元组,每个点对本身都由一个元组表示。 对于零件级特征,每个点都可以是顶点、基准点、参考点、孤立网格节点或 InterestingPoint 对象,指定折线将通过的点。每个点也可以是表示点坐标的浮点元组。 对于装配级特征,每个点只能是顶点、参考点或孤立网格节点,指定折线将通过的点(无法指定坐标)。在任何一对中,第一个或第二个点可以是 NONE。在这种情况下,点对将创建零长度导线,这对于某些类型的连接器是必需的。您必须至少指定一对。

因此,您可以在每个实例上创建一个参考点并使用它们来定义您的 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 方法而选择正确的边缘。例如,如果您在同一位置有多个连接器和/或连接器正在连接位于同一坐标位置的节点,则可能会发生这种情况。我找到了一个很好的解决方法。

WirePolyLine方法被调用时:

  1. 在 rootAssembly 级别创建一条边(重要!);
  2. 创建一个Feature 对象;
  3. 返回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

【讨论】:

    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多