2014-03-26 85 views
1

請多多包涵,我的問題,尤其是... 我提前道歉我應該主題標題誤導你在某些方面,但是這是我能拿出我的對象重命名腳本中發生了什麼?

我做一個基本的申請更名爲最佳如下面的代碼所示。 基本上我從我遇到的一個例子中拿出了這個例子,將它拍成我的代碼和中提琴,它的工作原理。可悲的是,有一些我不明白的部分,當我嘗試在網上尋找答案時,我什麼也沒有提出,它確實令人沮喪。

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幾乎貫穿我的編碼,我想我還不如標準化,並改變pmcmds ...的但是不是運行,因爲我以爲它會,它給我的錯誤如下所示。

objects = cmds.ls(selection=True) 
# AttributeError: 'unicode' object has no attribute 'rename' # 
  1. 爲什麼會這樣呢?
  2. 此外,當我試圖打印輸出objects,它打印出的對象,而不是選擇..任何想法?
+0

也許看看Maya的API文檔。另外,從你的帖子中可以看出你正在使用該API。 – aepsil0n

回答

1

我假設pm是pymel.core模塊。請參閱此模塊的文檔here。 pymel.core模塊中的ls方法返回一個PyNode對象列表。

閱讀關於PyNodes here。特別閱讀PyNodes Are Not StringsMutability and You這兩節,其中提到 rename方法可用於PyNode對象。

以cmds爲單位查看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 

代碼。

.name()PyNode對象的屬性。

2

您的示例使用的是PyMel,因此列表中的對象是@vaibhaw指出的PyNode。它們在這種情況下很有用,因爲它們保留了與原始場景對象的連接。

maya對象的長名稱是形式|路徑| to |對象中的名稱,其中層次結構中所有對象的名稱都包含在其中。爲了從一個pynode獲得這個結果,請在節點上使用fullPath()函數

簡稱通常爲顯示在對象的大綱表示或通道框中的名稱。當你有多個具有相同短名稱的對象時,maya會給你足夠的長名稱來區分這些對象。對於像一個層次:

group1 
    box 
group2 
    box 

的簡短名字將|group1|box|group2|box。使用shortName()從一個pynode獲取此信息;這是你會使用普通的老瑪雅或梅爾。

要獲得您在通道框中從一個pynode中看到的名稱,請使用nodeName()。這給你只有對象的「個人」的名字。

如果您使用pynodes,您應該可以在每個對象上調用rename()。但是,您需要保留對象以檢查其新名稱 - 新名稱可能不是您想要的,因爲Maya不會允許兄弟對象具有相同的名稱;它會用一個尾隨號碼重新命名兄弟姐妹以保持它們的獨特性。

在你使用maya.cmds的第二位代碼中。它不會對具有自己的函數的對象進行操作,它會將所有對象視爲字符串。所以

pynode = pm.PyNode("pCube1") 
pynode.rename("fred") 
print pynode 
# Result: [nt.Transform(u'fred')] # 
在pymel

,但在maya.cmds的obects僅僅是字符串:

cube = "pCube1" 
renamed_cube = cmds.rename(cube, "barney") 
print renamed_cube: 
# Result: barney # 
+0

我明白了你的意思,但是,我仍然對我發佈的代碼感到困惑。我相信我的代碼,它正在閱讀和打印短名稱,但是仍然是'split'從第一個地方?它甚至沒有'|' – dissidia

+2

的確,對象名中沒有'|'。所以沒有必要使用拆分。雖然它仍然有效,因爲如果在字符串中不存在'separator'('|'here),'split()'返回一個只包含1個元素的列表,該元素是原始字符串(對象的名稱)。 'list [-1]'是'list'中的最後一個元素。由於列表中只有1個元素,因此'list [-1]'給出了對象名稱。因此在這種情況下'item.name()。split('|')[ - 1]'最終是'item.name()' – vaibhaw

+0

@vaibhaw謝謝你的解釋。我做了一個快速實驗,理論奏效。但是,當我用'[0]'而不是'[-1]'對其進行測試時,代碼工作並給出相同的輸出。這是否意味着'0'(指的是第一個元素,我假設)等於'-1'(最後一個元素)? – dissidia