Monday, September 13, 2010

PyMel revision

試用新版的 blogger 編輯器的第一個成果就是玩一玩後,文章消失了 Orz... 所以想一想,算了,反正也只是 PyMel 的引言,重新寫一次,順便將一些新的看法加進來。

PyMel 已經可以在 Maya 2011 中的目錄中找到,雖然沒有很正式的加入 Maya 但可以感覺到開發團隊的確有將 PyMel 整合到 Maya 中的打算,那 PyMel 到底是什麼呢?
我們都知道 Python 加入 Maya 已有一段時間,在 Maya 中可以使用 mel 或是 Python 來開發所需要的工具,但 Maya Python 只是將原本的 mel script 做多一層的包裝,對熟悉 Python 的人來說,不僅語法上看起來不是很直覺,使用上也不是很方便,所以就有了 PyMel 的誕生,PyMel 是由 Luma Pictures 所開發,也經過了數個專案的應用證明了實用性,PyMel 最重要的就是引進了物件導向的概念, 讓使用 Python 來開發 Maya 工具的人們可以更快速的上手,不用再多一層的思緒轉換,寫出來的 script 也更容易理解,閱讀和維護。 

那..那...那.... 到底加了物件導向有什麼不一樣呢? 舉個例子來看就很清楚了,
以下這一段 code 是取得 camera 的 aspectRatio 和 focalLength 然後設定一個新的 focalLength 值

cam = ls(type='camera')[0]
camera( cam, query=True, aspectRatio=True)
# Result: 1.5
camera( cam, query=True, focalLength=True)
# Result: 35.0
camera( cam, edit=True, focalLength=20)
如果用 PyMel 來寫同樣功能的 code,看起來如下

cam = ls(type='camera')[0]
cam.getAspectRatio()
# Result: 1.5
cam.getFocalLength()
# Result: 35.0
cam.setFocalLength(20)

看起來是不是簡潔很多呢?

在 MEL 中,唯一方法去得到 Maya node 或是 attribute 只有透過 DAG path ( DAG path 是Maya 用來表示物件的一連串字串,例如 |head|torso|LeftLeg|LeftLegShpae ),但 DAG path 有時並不是很方便,舉例來說,當要比較二個物件時,用 DAG path 容易出錯 (如其中一個物件是另一個物件的 instance),但如果使用 PyMEL 就不一樣了,PyMEL 將常用的 commands 和 API 封裝成一個很完整的物件體系( class hierarchy ),最底層的物件是 PyNode,每一個 PyNode 指向的 DAG object 並不會像單純的字串一樣具有不唯一性 ( 有可能不同的物件,代表的字串卻是相同),所以比較二個 PyNode 可以直接判斷是否二個物件相等,整個工作變成非常簡單,而且正確,

Attribute 的使用也變得非常容易使用,所有相關 的功能都可透過 Attribute來使用,MEL 中的getAttri 和 setAttri 可以直接用 Attribute.get 和 Attribute.set 來取代,例如要設定或是取得 camera 的 visibility 只要簡單使用 get 和 set 就可以了,

cam.visibility.set( True )
cam.visibility.get() 

連接 attribute 也很容易,PyMEL定義了二個方便的 operator 來處理 connect 和 disconnect 的動作,以下的例子來自於文件中

c = polyCube(name='testCube')[0] 
cam.tx >> c.tx
# connect cam.tx.outputs() 
output => [nt.Transform(u'testCube')] 

cam.tx // c.tx    # disconnect
cam.tx.outputs()
output => [] 

真是賞心悅目~~~

No comments: