如果是對maya有興趣,為了控制maya而學習python的人,初入maya的python世界應該會一頭撞上這道牆。
初學python的人應該也跟我一樣,會知道python有一大堆酷炫的第三方函式庫可以用,使用一段時間後自然而然就會習慣這些函式庫的使用方式,許多函式庫設計得非常智慧非常易用。但我們maya作為3D業界的標竿軟體,就是比較獨特一點…
可以先試想一下,假設要用某個函式取得被選中的圖檔的名稱,該函式正常來說該返回給你甚麼?
可以來看下列例子:
import pymel.core as pm
# 取得選擇到的物件名稱(單選) , 並print出該物件的translate屬性
obj = pm.ls(sl=True)
obj_pos = pm.getAttr(obj+".translate")
print(obj_pos)
但這時maya只會吐回來一句錯誤
# Error: TypeError: file <maya console> line 5: can only concatenate list (not "str") to list #
很顯然getAttr方法只接受字串作為參數輸入,那問題肯定出在obj身上,這時如果你用type查詢的話…
<type 'list'>
maya會告訴你他是list,這也是在英文討論區常常會看到的抱怨,maya總是會把返回的資料包在tuple或是list裡,即使一次只處理一個東西也是如此,深入之後還會發現在list裡面包tuple等等的奇怪問題。
回到程式碼,只要我們簡單修正:
import pymel.core as pm
# 加上索引值
obj = pm.ls(sl=True)[0]
obj_pos = pm.getAttr(obj+".translate")
print(obj_pos)
即可成功導出並取得參數
如果是遇到要批次處理的問題,直接使用list也沒什麼太大的問題,但切記maya很喜歡把資料型態包成list,如果程式跑不起來不仿可以朝這問題思考看看。