访问 Maya 范围符号中的元素

Accessing elements in maya's range notation

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

所以,首先我 select 一条边并转换为 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 个点被 selected,因为第一个元素在范围符号中。

当我像这样遍历此列表时:

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 )

那么这是行不通的,因为第一个对象 select 不是一个 UV 而是两个,因为字符串 pSphere1.map[0:1] 定义了一个范围。我需要的是将范围拆分为单个 UV 或能够访问该范围的子元素,但是再次使用 ls 只是 returns 带有范围符号的字符串。

我可以解析字符串,查找冒号,然后提取冒号前后的值,重新解释为整数并将其用于迭代,但我相信一定有更简单的方法。

您可以将 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 命令,它对 select 组件使用了一系列有点神秘的代码:

 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 对于混合 select 离子特别有用,因为提供的掩码值(请参阅代码的 link)将混合 select 离子限制为仅一次一种组件类型。