在我的对象重命名脚本中发生了什么?

时间:2014-03-26 11:30:51

标签: python rename maya

请特别提出我的问题...... 如果我的主题标题在某些方面误导你,我会提前道歉,但这是我能想到的最好的

我正在做一个基本的重命名应用程序,如下面的代码所示。 基本上我从一个我遇到过的例子中得到了这个,把它打成我的代码和中提琴,它起作用了。可悲的是,有一些我不理解的部分,当我尝试在线搜索答案时,我什么也没想到,这肯定令人沮丧。

import pymel.core as pm
objects = pm.ls(selection=True)
# Result: [nt.Transform(u'my_pCube1')] # 
pfx = 'test'

for item in objects:
    item.rename(pfx + "_" + item.name().split('|')[-1])
    print 'Prefix added: %s_' %pfx
  1. 在此实例中,[nt.Transform(u'my_pCube1')]是否被视为长名称或短名称?

  2. .name()来自哪里?它是重命名隐藏函数的一部分还是我从文档中看不到的东西?

  3. 然后,由于我几乎在整个编码过程中使用cmds,我认为我可以将其标准化并将pm更改为cmds ...但不是像我想象的那样运行它会,它给我如下所示的错误。

    objects = cmds.ls(selection=True)
    # AttributeError: 'unicode' object has no attribute 'rename' # 
    
    1. 为什么会这样?
    2. 此外,当我尝试打印出objects的输出时,它打印出对象而不是选择..任何想法?

2 个答案:

答案 0 :(得分:2)

您的示例正在使用PyMel,因此列表中的对象是PyNodes,正如@vaibhaw指出的那样。它们在这种情况下很有用,因为它们保留了与原始场景对象的连接。

maya对象的长名称是| path | to |对象中的名称,其中包含层次结构中其上方所有对象的名称。要从pynode获取此信息,请使用节点上的fullPath()函数

短名称通常在对象的大纲或通道框中显示的名称。如果您有多个具有相同短名称的对象,maya将为您提供足够的长名称以区分对象。对于像以下这样的层次结构:

group1
  box
group2 
  box

shortNames将为|group1|box|group2|box。从具有shortName()的pynode获取此信息;它是用普通的玛雅或梅尔得到的东西。

要从pynode获取您在频道框中看到的名称,请使用nodeName()。这只会给你一个对象的个人信息。名。

如果您使用pynodes,您应该只能在每个对象上调用rename()。但是,您需要保留对象以检查其新名称 - 新名称可能不是您想要的,因为Maya不允许同级对象具有相同的名称;它会用一个尾随的数字重命名兄弟姐妹,以保持它们的独特性。

在第二位代码中,您使用的是maya.cmds。它不对具有自己的函数的对象进行操作,它将所有对象视为字符串。所以

pynode = pm.PyNode("pCube1")
pynode.rename("fred")
print pynode
# Result: [nt.Transform(u'fred')] # 

在pymel中,但在maya.cmds中,obects只是字符串:

cube = "pCube1"
renamed_cube = cmds.rename(cube, "barney")
print renamed_cube:
#  Result: barney # 

答案 1 :(得分:1)

我假设pm是pymel.core模块。请参阅此模块的文档here。 pymel.core模块中的ls方法返回PyNode对象的列表。

了解PyNodes here。特别阅读提到的部分PyNodes Are Not StringsMutability and You     rename方法可用于PyNode对象。

查看cmds中lsrename方法的文档。 ls返回一个字符串变量数组(对象名称),而不是对象本身。并且字符串没有名为rename的方法,因此您获得了AttributeError

要使用cmds重命名,这可能有效:

objects = cmds.ls(selection=True)
pfx = 'test'

for item in objects:
    cmds.rename(item, pfx + "_" + item)
    # cmds.rename(old_filename, new_filename)
    print 'Prefix added: %s_' %pfx

代码未经测试,因为我没有安装Maya。

.name()PyNode对象的属性。