首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Abaqus脚本:选择两个共享相同坐标的连接器之一

Abaqus脚本:选择两个共享相同坐标的连接器之一
EN

Stack Overflow用户
提问于 2020-12-04 16:00:24
回答 1查看 567关注 0票数 1

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

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

代码语言:javascript
复制
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])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-08 10:22:19

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

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

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

只是对代码的一个注释:尝试使用变量和格式,这样您的代码就清晰易懂了。例如:

代码语言:javascript
复制
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方法时:

(important!);

  • Creates object;

  • Returns
  1. 在rootAssembly级别创建一个边缘,即Feature对象.

Feature对象只有两个成员:nameid。因此,不可能直接使用它来创建指定连接器部分所需的Set (参见SectionAssignment方法文档)。但是,由于电线的边缘是在rootAssembly级别创建的,我们可以遍历在所需位置找到的所有边缘,并获得一个好的featureName

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65146777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档