找回密码
 注册
Simdroid-非首页
查看: 1289|回复: 27

[二次开发] 关于python坐标选取后定义set的问题

[复制链接]
发表于 2011-4-17 09:04:55 | 显示全部楼层 |阅读模式 来自 湖北武汉
本帖最后由 si13 于 2011-4-18 21:13 编辑

参考了版内用坐标选取单元的python函数
编写一下语句:
ee=[]
e5 = a.instances['guanpian-1']
for element in e5.elements:
    pt=[]
    for index in element.connectivity:
        pt.append(e5.nodes[index].coordinates)
    pp=(pt[0][0]+pt[1][0]+pt[2][0]+pt[3][0])/4.0
    if pp > 17.0:
        ee.append(element)

最后得到的ee怎么能定义成set呢?使用
a = mdb.models['Model-1'].rootAssembly   
a.Set(elements=ee, name='guanpian01')
定义时,出错
Feature creation failed.
初学abaqus,百思不得其解,已查看
“使用坐标选取的两个python函数”原帖
发现有很多人跟帖也是无法定义set的问题,请达人相助
 楼主| 发表于 2011-4-18 21:03:16 | 显示全部楼层 来自 湖北武汉
Simdroid开发平台
在网上疯狂搜集了很多资料并且请教了大量高手
终于成功解决这个问题
这也可以算是对 “[原创]选取ABAQUS实体的两个简单Python函数”帖子中
给出的方法的一种补充

ee=[]
e5 = a.instances['guanpian-1']
for element in e5.elements:
        pt=[]
        for index in element.connectivity:
                pt.append(e5.nodes[index].coordinates)
        pp=(pt[0][0]+pt[1][0]+pt[2][0]+pt[3][0])/4.0
        if pp > 17.0:
                ee.append(element.label)

esqu=e5.elements.sequenceFromLabels(ee)
a.Set(elements=esqu,name='guanpian01')
回复 不支持

使用道具 举报

 楼主| 发表于 2011-4-18 21:09:27 | 显示全部楼层 来自 湖北武汉
另外,“[原创]选取ABAQUS实体的两个简单Python函数”帖子中
使用的坐标搜寻方法可以相对做些改进
结合list的sort() 功能
把所有对象的坐标先排序后再选取就快多了
只需较少的循环即可选出满意的结果

下面一段选单元的例子参考
myelement=[]
e5 = a.instances['guanpian-1']
for element in e5.elements:
        pt=[]
        for index in element.connectivity:
                pt.append(e5.nodes[index].coordinates)
        pp=(pt[0][0]+pt[1][0]+pt[2][0]+pt[3][0])/4.0
        myelement.append((pp,element.label))

myelement.sort()
for i in range(19):
        myelset=[]
        for j in range(32):
                myelset.append(myelement[32*i+j][1])
        esqu=e5.elements.sequenceFromLabels(myelset)
        ii=str(i)
        a.Set(elements=esqu,name='guanpian'+ii)
回复 不支持

使用道具 举报

发表于 2011-4-28 16:30:11 | 显示全部楼层 来自 大连理工大学
非常感谢,楼主的方法很好!但有疑问想请教:

定义单元集合时,elements=esqu,这里esqu必须为Geom sequence类型。
http://forum.simwe.com/viewthrea ... ;highlight=sequence帖子中,得通过append()得到的都是list类型,所以在定义set时出现Feature creation failed。
我查过python语言,list,str和tuple类型都属于sequence,而这里却就是不能用list,没办法,只有想办法将所需要的部分定义成sequence,再定义集合。

你找到了sequenceFromLabels函数来完成了sequence的定义,所以可以成功定义集合。
但是这仅仅是针对单元,若是想定义边的集合、面的集合、体的集合 又该怎么办呢?
查来查去,都只有一个getSequenceFromMask() 和 findAt(),苦恼中。。。
回复 不支持

使用道具 举报

发表于 2012-3-12 23:20:06 | 显示全部楼层 来自 德国
非常感谢楼主,解决了问题
回复 不支持

使用道具 举报

发表于 2012-8-22 23:11:43 | 显示全部楼层 来自 江苏
本帖最后由 lcddcl 于 2012-8-23 15:16 编辑

不是不能用list,而是数据有问题
ee=[]
e5 = a.instances['guanpian-1']
es=e5.elements
for element in es:
    pt=[]
    el=element.label
    for index in element.connectivity:
        pt.append(e5.nodes[index].coordinates)
    pp=(pt[0][0]+pt[1][0]+pt[2][0]+pt[3][0])/4.0
    if pp > 17.0:
        ee.append(es[el-1:el])

a = mdb.models['Model-1'].rootAssembly   
a.Set(elements=ee, name='guanpian01')


对单元, 边 、面 、体、接点都有效




Vns=[12,34,56,78]
vs=myPart.vertices
XX=[]
For  n in vns:
      V=vs[n:n+1]
       XX.append(V)
myPart.set(vertices=XX,name='hhhhhhhSet')
回复 不支持

使用道具 举报

发表于 2013-11-27 08:33:08 | 显示全部楼层 来自 江苏苏州
你找到了sequenceFromLabels函数来完成了sequence的定义,所以可以成功定义集合。
回复 不支持

使用道具 举报

发表于 2013-12-6 16:09:51 | 显示全部楼层 来自 上海
huxw 发表于 2011-4-28 16:30
非常感谢,楼主的方法很好!但有疑问想请教:

定义单元集合时,elements=esqu,这里esqu必须为Geom sequen ...

hu兄你好,不知道你的Set问题有没有解决?最近在搞python,想定义边的集合,最终得到的却是Feature creation failed.
谢谢!
回复 不支持

使用道具 举报

发表于 2013-12-8 15:55:01 | 显示全部楼层 来自 辽宁大连
tailor 发表于 2013-12-6 16:09
hu兄你好,不知道你的Set问题有没有解决?最近在搞python,想定义边的集合,最终得到的却是Feature creat ...

不知 是什么问题呢,请具体 说出来看看,不一定能解决。
回复 不支持

使用道具 举报

发表于 2013-12-9 19:01:01 | 显示全部楼层 来自 上海
huxw 发表于 2013-12-8 15:55
不知 是什么问题呢,请具体 说出来看看,不一定能解决。

我是想选取一个边的集合,要用到Sequence对象,看到另外一个帖子问题解决了,谢谢hu兄回复!
回复 不支持

使用道具 举报

发表于 2013-12-10 10:00:48 | 显示全部楼层 来自 辽宁大连
tailor 发表于 2013-12-9 19:01
我是想选取一个边的集合,要用到Sequence对象,看到另外一个帖子问题解决了,谢谢hu兄回复! ...

是的,我记得 在初始化的时候,需要用  [起点:终点] 引用, 才能成为 sequence。如,edge=edges[0:1]
解决了就好。不客气。
回复 不支持

使用道具 举报

发表于 2013-12-18 18:15:23 | 显示全部楼层 来自 上海
si13 发表于 2011-4-18 21:03
在网上疯狂搜集了很多资料并且请教了大量高手
终于成功解决这个问题
这也可以算是对 “[原创]选取ABAQUS实 ...

版主的帖子很精彩,但自己实践中发现这里pt变量的含义是什么呢?
这里没搞清楚应该是connectivity的概念我还没明白
回复 不支持

使用道具 举报

发表于 2014-10-31 14:57:20 | 显示全部楼层 来自 大连理工大学
huxw 发表于 2011-4-28 16:30
非常感谢,楼主的方法很好!但有疑问想请教:

定义单元集合时,elements=esqu,这里esqu必须为Geom sequen ...

不知道你提出的append()定义set时出现的Feature creation failed 这个问题是怎么解决的,求教啊。
回复 不支持

使用道具 举报

发表于 2014-11-1 16:05:14 | 显示全部楼层 来自 辽宁大连
fengshiwuhen 发表于 2014-10-31 14:57
不知道你提出的append()定义set时出现的Feature creation failed 这个问题是怎么解决的,求教啊。 ...

在ABAQUS里,对list采用 list[n:n+1]的方式引用,得到的就是sequence。
这个问题其实6楼 lcddcl 已经有答案了,见其后半部分代码:

  1. Vns=[12,34,56,78]
  2. vs=myPart.vertices
  3. XX=[]
  4. For  n in vns:
  5.       V=vs[n:n+1]
  6.        XX.append(V)
  7. myPart.set(vertices=XX,name='hhhhhhhSet')
复制代码

回复 不支持

使用道具 举报

发表于 2014-11-1 17:12:53 | 显示全部楼层 来自 大连理工大学
本帖最后由 fengshiwuhen 于 2014-11-1 17:14 编辑
huxw 发表于 2014-11-1 16:05
在ABAQUS里,对list采用 list[n:n+1]的方式引用,得到的就是sequence。
这个问题其实6楼 lcddcl 已经有答 ...

非常感谢你的回答。 myPart.Set(edges=AggE,name='set-2'),我现在有一个AggE的列表。列表内全部都是类似mdb.models['lattice'].parts['lattice'].edges[155]的数据,直接定义集合就会出现创建失败。

对于六楼的方法有些困惑:for  n in vns遍历列表中的元素。V=vs[n:n+1]却是需要的n却应该是整数
而且vs[n:n+1]显示的不是某个单元的实际索引号吗,而我的列表中的实际索引号并不是相连的

mdb.models['lattice'].parts['lattice'].edges[692], mdb.models['lattice'].parts['lattice'].edges[1185], mdb.models['lattice'].parts['lattice'].edges[1567], mdb.models['lattice'].parts['lattice'].edges[439],

而且用六楼的方法出现TypeError: unsupported operand type(s) for +: 'Edge' and 'int',显然是V=vs[n:n+1]语句出现的错误。
求大神帮助。
回复 不支持

使用道具 举报

发表于 2014-11-1 18:29:13 | 显示全部楼层 来自 大连理工大学
huxw 发表于 2014-11-1 16:05
在ABAQUS里,对list采用 list[n:n+1]的方式引用,得到的就是sequence。
这个问题其实6楼 lcddcl 已经有答 ...

For  n in vns:
      V=vs[n:n+1]

这两句能不能解释一下呢?非常感谢、
回复 不支持

使用道具 举报

发表于 2014-11-1 19:21:48 | 显示全部楼层 来自 辽宁大连
本帖最后由 huxw 于 2014-11-1 20:32 编辑
fengshiwuhen 发表于 2014-11-1 17:12
非常感谢你的回答。 myPart.Set(edges=AggE,name='set-2'),我现在有一个AggE的列表。列表内全部都是类似m ...

由于你的AggE是由 edges对象构成的一个列表(list),所以要将其转化成sequence对象(或将其元素转化成sequence对象),才能用于定义Set。有两种方法:

第一种方法,

  1. edges=mdb.models['lattice'].parts['lattice'].edges
  2. n = AggE[0].index
  3. AggE_new = edges[n:n+1]
  4. for ii in AggE[1:]:
  5.     n=ii.index
  6.     AggE_new += edges[n:n+1]
复制代码

得到的AggE_new就是一个Sequence,可以直接用来定义Set。


第二种方法,

  1. edges=mdb.models['lattice'].parts['lattice'].edges
  2. AggE_new = [edges[edge.index:(edge.index+1)] for edge in AggE]
复制代码

此时,AggE_new是一个列表,但其元素是sequence,也可以用来定义Set。
回复 不支持

使用道具 举报

发表于 2014-11-1 19:38:14 | 显示全部楼层 来自 辽宁大连
fengshiwuhen 发表于 2014-11-1 18:29
For  n in vns:
      V=vs[n:n+1]

这里,vns是一个由顶点编号构成的list,其元素为int对象,vs是所有顶点构成的list,其元素为vertex对象。
那么,V=vs[n:n+1] 就是把编号为n到n+1的顶点赋给V,python取头不取尾,就相当于把编号为n的顶点赋给V。
可是,它和 Vi=vs[n] 有什么区别呢?
Vi是对vs的单个元素的引用,Vi的类型为 vertex。
而V在ABAQUS里却是一个Geom Sequence,其元素为vertex对象。
回复 不支持

使用道具 举报

发表于 2014-11-1 20:09:07 | 显示全部楼层 来自 大连理工大学
huxw 发表于 2014-11-1 19:21
由于你的AggE是由 edges对象构成的一个列表(list),所以要将其转化成sequence对象(或将其元素转化成seque ...

非常感激你的帮助。问题成功解决了。。真是大神。
回复 不支持

使用道具 举报

发表于 2014-11-1 20:31:57 | 显示全部楼层 来自 大连理工大学
huxw 发表于 2014-11-1 19:21
由于你的AggE是由 edges对象构成的一个列表(list),所以要将其转化成sequence对象(或将其元素转化成seque ...

还有一个问题。这两个方法都能解决定义set的问题。但是为什么使用type(AggE_new)时第一种方法得到的是Sequence而第二种方法得到的类型
>>> AggE_new = [myedges[edge.index: (edge.index+1)] for edge in AggE]
>>> type(AggE_new)
<type 'list'>
列表类型,然而却仍然能正确定义set。而本身的AggE列表类型却不能定义set。这又是为什么呢。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-25 13:34 , Processed in 0.051052 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表