2014-05-07 166 views
1

我正在重命名腳本,但我遇到了一些麻煩,我的 搜索和替換功能。重命名失敗重複對象

實際上,只要層次結構中沒有同一對象的重複,該功能就可以工作。例如,如在附接所描繪的,locator1 和locator2從頭創建的,而locator3是從 locator2

enter image description here

一個複製如果我在它們的短名稱,以顯示它們,它是如下: locator1 locator2 locator2 | locator3

所以如前所述,當我試圖詞「定位」替換爲「點」,在 重命名適用於定位器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 

回答

1

這是一個棘手的問題,但解決方案其實很簡單!

排序時objCnt,你字典序做:

for wordString in sorted(objCnt): 

這意味着locator2locator2|locator3之前。本身應該沒問題,但...

locator2重命名時,到locator3的路徑也發生了變化,因此訪問失敗。

訣竅是扭轉排序所以更長對象先來。這樣的孩子及其家長面前總是獲得改名

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

對於這個工作,你還需要確保你的ls給你長的名字,被添加long=True參數

+0

我認爲詞法排序是足夠這種情況下,對長名稱進行排序(objCnt,reverse = True)應該具有相同的效果。 OP的長名 – theodox

+0

上的wordString.split(「|」)[ - 1]可以得到短名稱,你是絕對正確的。編輯 – mhlester