访问maya范围表示法中的元素

时间:2016-11-19 13:47:43

标签: python maya

好吧,这可能是一个愚蠢的问题,但我无法看到或找到解决方案。我在Maya中处理UV地图,需要通过Python脚本设置翻译值。但是,当返回的对象在范围表示法中时,我无法在列表中选择特定元素。例如:

所以,首先我选择一条边并转换为UV点:

cmds.select(name+'.e[0:4]', add=True)
cmds.select(cmds.polyListComponentConversion(fe=True, tuv=True), add=False)
selection = cmds.ls(sl=True)
print(selection)


现在当我打印出来时,我得到了:

[u'pSphere1.map[0:1]', u'pSphere1.map[4]', u'pSphere1.map[6]', u'pSphere1.map[8]', u'pSphere1.map[10]']

现在有我的问题。列表中有5个元素,但是,选择了6个点,因为第一个元素是范围表示法。

当我迭代这个列表时,如:

p = 0
cmds.select( clear=True )
for pUV in selection:
    cmds.select(pUV, add=False)
    cmds.polyEditUV(uValue=vList[p][0], vValue=vList[p][1], r=True)
    p = p+1

或查询如:

var = cmds.polyEditUV( query=True )

然后这不起作用,因为第一个对象不是选择一个UV而是两个,因为字符串pSphere1.map[0:1]定义了一个范围。我需要的是将范围分成单个UV或能够访问此范围的子元素,但是使用ls只返回带有范围表示法的字符串。

我可以解析字符串,查找冒号然后在冒号之前和之后提取值,重新解释为整数并使用它进行迭代,但我确信必须有一个更简单的方法。

1 个答案:

答案 0 :(得分:0)

您可以使用lsflatten选项将列表缩小到没有范围的隔离条目:

compressed  = cmds.ls('pCube1.vtx[*]')
print compressed
# [u'pCube1.vtx[0:7]']
expanded = cmds.ls('pCube1.vtx[*]', flatten=True)
print expanded
 # [u'pCube1.vtx[0]', u'pCube1.vtx[1]', u'pCube1.vtx[2]', u'pCube1.vtx[3]', u'pCube1.vtx[4]', u'pCube1.vtx[5]', u'pCube1.vtx[6]', u'pCube1.vtx[7]']

另一个选项是filterExpand命令,它使用一些有些神秘的代码来选择组件:

 print cmds.filterExpand(compressed, sm = 31)
 # [u'pCube1.vtx[0]', u'pCube1.vtx[1]', u'pCube1.vtx[2]', u'pCube1.vtx[3]', u'pCube1.vtx[4]', u'pCube1.vtx[5]', u'pCube1.vtx[6]', u'pCube1.vtx[7]']

filterExpand对于混合选择特别有用,因为提供的掩码值(请参阅代码链接)将混合选择限制为一次只有一种组件类型。