我的对象重命名脚本出了什么问题?

1 投票
2 回答
1828 浏览
提问于 2025-04-17 23:58

请耐心听我说,尤其是我的问题...
如果我的帖子标题让你感到困惑,我提前道歉,但这是我能想到的最好表达方式。

我正在做一个基本的重命名应用程序,下面的代码就是我的实现。
基本上,我是从一个例子中拿来的,把它放到我的代码里,结果它就能工作了。可惜的是,有几个地方我不太明白,我在网上找答案时一无所获,这让我很沮丧。

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()这个东西是从哪里来的?它是重命名的隐藏功能之一,还是我在文档中没看到的东西?

然后,由于我几乎在整个代码中都在使用cmds,我想干脆把pm也改成cmds... 但是结果并没有像我想的那样运行,而是出现了下面的错误。

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

2 个回答

1

我假设这里的 pm 是指 pymel.core 模块。你可以在这个模块的文档中查看详细信息,链接在这里。在 pymel.core 模块中,ls 方法会返回一个 PyNode 对象的列表。

关于 PyNode 的信息可以在这里找到。特别是要看看 PyNodes Are Not StringsMutability and You 这两个部分,它们提到 rename 方法可以用于 PyNode 对象。

你还可以查看 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 对象的一个属性。

2

你的示例使用了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 # 

撰写回答