请特别提出我的问题...... 如果我的主题标题在某些方面误导你,我会提前道歉,但这是我能想到的最好的
我正在做一个基本的重命名应用程序,如下面的代码所示。 基本上我从一个我遇到过的例子中得到了这个,把它打成我的代码和中提琴,它起作用了。可悲的是,有一些我不理解的部分,当我尝试在线搜索答案时,我什么也没想到,这肯定令人沮丧。
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
在此实例中,[nt.Transform(u'my_pCube1')]
是否被视为长名称或短名称?
.name()
来自哪里?它是重命名隐藏函数的一部分还是我从文档中看不到的东西?
然后,由于我几乎在整个编码过程中使用cmds
,我认为我可以将其标准化并将pm
更改为cmds
...但不是像我想象的那样运行它会,它给我如下所示的错误。
objects = cmds.ls(selection=True)
# AttributeError: 'unicode' object has no attribute 'rename' #
objects
的输出时,它打印出对象而不是选择..任何想法?答案 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 Strings
和Mutability and You
rename
方法可用于PyNode对象。
查看cmds中ls和rename方法的文档。
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
对象的属性。