我正在制作一个重命名脚本,但我遇到了一些麻烦 搜索和替换功能。
实际上,只要没有相同的功能,该功能就可以正常工作 层次结构中的对象。例如,如附件中所示,locator1 和locator2是从头开始创建的,而locator3是从中复制的 locator2
如果我以短名称显示它们,则如下: locator1 locator2 locator2 | locator3
如上所述,当我尝试将'locator'一词替换为'Point'时,
重命名适用于定位器1和2,但是当涉及到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
答案 0 :(得分:1)
这是一个棘手的问题,但解决方案实际上非常简单!
当您对objCnt
进行排序时,您按字典顺序执行此操作:
for wordString in sorted(objCnt):
这意味着locator2
出现在locator2|locator3
之前。本身应该没问题,但是......
重命名locator2
后,locator3
的路径也发生了变化,因此访问失败。
诀窍是反转排序,以便更长的对象首先出现。这样孩子们总是会在父母面前重命名
for wordString in sorted(objCnt, reverse=True):
为此,您还需要确保ls
为您提供长名称,添加long=True
参数