重命名失败,物件重复
我正在写一个重命名的脚本,但在搜索和替换功能上遇到了一些麻烦。
其实,这个功能在层级结构中没有重复对象的时候是可以正常工作的。比如,像附件中显示的那样,locator1和locator2是从头创建的,而locator3是从locator2复制过来的。
如果我把它们的短名称列出来,就是这样: 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
参数来实现。