在Maya中创建变量时出错

时间:2015-10-05 18:28:07

标签: python maya

我正在尝试创建一个变量来保存Maya中我的定位器和网格列表。所以我有这个

locators = cmds.listRelatives(cmds.ls(type= 'locator'), p=1)# Give me the list of locators
meshes = cmds.listRelatives(cmds.ls(type= 'mesh'), p=1) #Give me the list of all meshes

但是如果当前场景中有可用的定位器或多边形,这些只会起作用。 Maya吐出错误:

line 1: Object [] is invalid

如果找不到定位器或多边形。

即使它们在场景中可用,如何存储它们?目的是创建搜索和替换工具。因此,如果他/她想要,艺术家只能搜索和替换网格。但即使我只是S& R网格,它现在也出错了。当我搜索网格物体时,定位器会给出错误,而当我寻找定位器时,网格物体会失败。

以下是我的全部搜索和替换代码:

def searchAndReplace(self):
    searchText = str(self.windowObj.myLookFor.text()) #My search text feild
    replaceText = str(self.windowObj.myRepFor.text()) #My replace text feild
    selection = cmds.ls(sl=True) #only selected items
    locators = cmds.listRelatives(cmds.ls(type= 'locator'), p=1)# Give me the list of locators
    meshes = cmds.listRelatives(cmds.ls(type= 'mesh'), p=1) #Give me the list of all meshes
    joints = cmds.ls(type = 'joint')# Give me the list of my joints.
    allObjects = locators, meshes, joints

    if len(selection) > 0:
        if self.windowObj.myRepAll.isChecked():
            print "All is selected"
            for object in meshes:
                if object.find(searchText) != -1:
                    newName = object.replace(searchText, replaceText)
                    cmds.rename(object, newName)
                    self.listofMeshes.append(meshes)
                else:
                    print "No mesh found. Skipping meshes"
            for object in locators:
                if object.find(searchText) != -1:
                    newName2 = object.replace(searchText, replaceText)
                    cmds.rename(object, newName2)
                    self.listofLocators.append(locators)
                else:
                    "No locators found. Skipping locators"
            for object in joints:
                if object.find(searchText) != -1:
                    newName3 = object.replace(searchText, replaceText)
                    cmds.rename(object, newName3)
                    self.listofJoints.append(joints)
                else:
                    print "No joints found. Skipping joints"

需要帮助正确存储变量,以便正确存储定位器,网格和关节,并且如果其中一个在场景中不可用,则能够使用它。

2 个答案:

答案 0 :(得分:0)

当我运行你在一个新的空场景中指出的两个语句时,我在两个变量上都得到了一个。

在这种情况下,在开始循环之前,您可以通过将每个for循环缩进来阻止错误,例如, if meshhes:,或者甚至更好, if isinstance (网格,列表):,如果网格是一个列表,它只会执行代码:

if isinstance(meshes, list):
    for object in meshes:
        if object.find(searchText) != -1:
            newName = object.replace(searchText, replaceText)
            cmds.rename(object, newName)
            listofMeshes.append(meshes)

如果在尝试执行语句时仍然遇到相同的错误,请将其缩进到try / catch块中以查看有关正在发生的事情的更详细说明,并从Maya CMDS' documentation获得更多帮助:

try:
    locators = cmds.listRelatives(cmds.ls(type= 'locator'), p=1)

except Exception as e:
    print e

答案 1 :(得分:0)

默认情况下,如果cmds.listRelatives找不到任何内容而不是像预期的那样返回空[],则会返回None

解决此问题的两种方法是将None转换为[]

print cmds.listRelatives(cmds.ls(type= 'locator'), p=1) or []
> returns []

或执行条件检查以查看变量是否为空:

sceneLocators = cmds.listRelatives(cmds.ls(type= 'locator'), p=1)
if sceneLocators:
    print 'Continue'
else:
    print 'No locators!'

你不应该像Carlos所暗示的那样包裹try except。这只是编程中的不良做法,通常有一些例外,通常是一种懒惰的方式。