我的对象重命名脚本出了什么问题?
请耐心听我说,尤其是我的问题...
如果我的帖子标题让你感到困惑,我提前道歉,但这是我能想到的最好表达方式。
我正在做一个基本的重命名应用程序,下面的代码就是我的实现。
基本上,我是从一个例子中拿来的,把它放到我的代码里,结果它就能工作了。可惜的是,有几个地方我不太明白,我在网上找答案时一无所获,这让我很沮丧。
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
的输出时,它打印的是对象而不是我选择的内容... 有什么想法吗?
2 个回答
我假设这里的 pm 是指 pymel.core
模块。你可以在这个模块的文档中查看详细信息,链接在这里。在 pymel.core
模块中,ls
方法会返回一个 PyNode 对象的列表。
关于 PyNode 的信息可以在这里找到。特别是要看看 PyNodes Are Not Strings
和 Mutability and You
这两个部分,它们提到 rename
方法可以用于 PyNode 对象。
你还可以查看 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
对象的一个属性。
你的示例使用了PyMel,所以你列表里的对象是PyNodes,正如@vaibhaw所指出的那样。它们在这种情况下很有用,因为它们与原始场景对象保持了连接。
在Maya中,一个对象的长名称是以这种形式表示的:|路径|到|对象,其中包含了它上面所有对象的名称。要从一个pynode获取这个长名称,可以使用fullPath()这个函数。
短名称通常是对象在大纲视图或通道框中显示的名称。当有多个对象的短名称相同时,Maya会提供足够的长名称来区分这些对象。比如有这样的层级结构:
group1
box
group2
box
短名称将会是|group1|box
和|group2|box
。你可以通过shortName()从pynode获取这个短名称;这和使用普通的Maya或MEL是一样的。
如果你想从pynode获取在通道框中看到的名称,可以使用nodeName()。这个函数只会给你对象的“个人”名称。
如果你使用pynodes,你应该可以直接对每个对象调用rename()。不过你需要保留这些对象,以便检查它们的新名称——新名称可能不完全是你想要的,因为Maya不允许同级对象有相同的名称;它会给同级对象加上一个数字后缀,以保持名称的唯一性。
在第二段代码中,你使用的是maya.cmds。它不对对象使用自己的函数,而是把所有对象当作字符串来处理。所以
pynode = pm.PyNode("pCube1")
pynode.rename("fred")
print pynode
# Result: [nt.Transform(u'fred')] #
在pymel中,但在maya.cmds中,对象只是字符串:
cube = "pCube1"
renamed_cube = cmds.rename(cube, "barney")
print renamed_cube:
# Result: barney #