1

我试图让 Maya 检查列出的对象是否是 blendshape 节点。

这是我的代码:

def bake(self, *args):
    self.items["selection"] = cmds.ls(sl = True)
    self.items["shapes"] = cmds.listRelatives(self.items["selection"], ad = True)
    shapes = ()
    for i in self.items["shapes"]:
        bs = cmds.listConnections(i, type = "blendShape", exactType = True)
        if cmds.objectType(bs, isType = "blendShape"):
            print bs

它返回# Error: RuntimeError: file X:/Documents/maya/scripts\jtBakeCharacter.py line 16: No object name specified

第 16 行是:if cmds.objectType(bs, isType = "blendShape"):

除了我指定一个对象名称之外,该对象名称是 bs .. 我已经打印了 bs 的结果,它列出了许多对象。许多。

4

3 回答 3

3

代码是多余的。您不需要大部分线路。listConnections已经确保您只有blendshapes 。确切的问题是你正在调用类似的东西:

cmds.objectType([])

对于一些额外的形状。这是非法的。但大多数情况下,您的代码可以封装如下:

selected = cmds.ls(sl = True, dag=True ,shapes = True)
blends = cmds.listConnections(selected , type = "blendShape", exactType = True)
for item in blends:
    print item

但这可能无法完美地捕捉到您的意图,但会显示您可以采取哪些额外步骤。实际上你不需要这条线if cmds.objectType(bs, isType = "blendShape"): for any

于 2013-05-08T08:02:41.983 回答
1

Joojaa 的回答很优雅,但您可以通过使用默认选择行为来缩短它:

blendshapes = cmds.ls(cmds.listHistory(pdo=True), type='blendShape') or []
for item in blendshapes:
    print item

(为了使它更短,我没有检查选择,所以如果没有选择,这个会失败)。

PS:如果您需要从上游形状之一到达混合形状,而不是变形形状,您可以使用 listHistory (f=True)

于 2013-05-15T05:54:50.613 回答
0

你可以试试这个:

from pymel.core import *

for obj in selected():
    shapeNode = obj.getChildren()[0]
    for output in shapeNode.outputs():
        if nodeType(output) == "blendShape":
            print obj, "is a blendshape"
于 2013-05-07T22:28:38.960 回答