重命名失败,物件重复

1 投票
1 回答
516 浏览
提问于 2025-04-18 05:38

我正在写一个重命名的脚本,但在搜索和替换功能上遇到了一些麻烦。

其实,这个功能在层级结构中没有重复对象的时候是可以正常工作的。比如,像附件中显示的那样,locator1和locator2是从头创建的,而locator3是从locator2复制过来的。

enter image description here

如果我把它们的短名称列出来,就是这样: locator1 locator2 locator2|locator3

正如我所提到的,当我尝试把“locator”替换成“Point”时,重命名对locator1和locator2有效,但当涉及到locator3时,我遇到了错误 RuntimeError: No object matches name

所以,我在想有没有更好的方法来重新编写代码,因为在建模的情况下,艺术家们会不断复制对象,或者使用实例……

我知道这个失败是因为短名称本身的问题,但有没有办法绕过这个问题呢?

def searchReplace(self):
    wordSearch = str(self.searchTxt.text())
    wordReplace = str(self.replaceTxt.text())

    objCnt = cmds.ls(sl=True, sn=True)

    if len(objCnt) == 0:
        self.searchTxt.clear()
        self.replaceTxt.clear()
        cmds.warning('Nothing is selected')
    else:
        for wordString in sorted(objCnt):
            if wordSearch in wordString:
                newWordString = wordString.replace(wordSearch, wordReplace)
                cmds.rename(wordString, newWordString)
                self.searchTxt.clear()
                self.replaceTxt.clear()
                print '%s' %wordString + " has changed to : " + "%s" %newWordString

1 个回答

1

这个问题有点棘手,但其实解决起来非常简单!

当你对 objCnt 进行排序时,其实是在按字典顺序排序:

    for wordString in sorted(objCnt):

这就意味着 locator2 会排在 locator2|locator3 之前。单独来看,这应该没问题,但……

locator2 被重命名时,locator3 的路径也跟着改变了,所以访问它的时候就会失败。

解决的办法是反向排序,让更长的对象排在前面。这样一来,子对象总是会在父对象之前被重命名。

    for wordString in sorted(objCnt, reverse=True):

为了让这个方法有效,你还需要确保你的 ls 命令能返回长名称,可以通过添加 long=True 参数来实现。

撰写回答