2009年4月14日 星期二

簡單介紹pymel以及安裝

什麼是pymel咧?有在寫mel的應該都知道Maya在8.5版之後,有跟python做結合。但是....結合的不是很好,有很多python的優勢沒有發揮出來,像是對資料的動態處理。所以呢,就有幾位工程師,開始著手改良python與maya的結合~~~pymel就誕生了。話說某天用maya原本的python在寫一個工具,為了要動態的存取stringarray這個type的attribute,try了很久,但是卻一直跳error出來,而我現在的主管就在這時向我介紹了這好物,整個輕鬆解決了那時的問題。先介紹一下一下怎麼安裝,再敘述當時遇到的狀況囉~

可以先去這個連結:
http://www.highend3d.com/maya/downloads/tools/syntax_scripting/Pymel-4844.html
下載pymel的壓縮檔,解壓縮後,會得到一個名稱為pymel的資料夾。如果是Windows的使用者,直接將此資料夾複製到My Document\maya\prefs\script裡,即可使用。

來敘述一下當時遇到的問題吧,先看以下code:
###########################################################
import maya.cmds as mcmds
#宣告一個array, 值為a, b, c

TestStringArray=['a','b','c']
#新增一個transform的node,並將其命名為testnode
mcmds.createNode( 'transform', n='testnode' )
#給testnode新增一個資料型態為stringArray的屬性,其名稱為test_stringArray
mcmds.addAttr('testnode', longName='test_stringArray', dt='stringArray')
#將TestStringArray的值,assign給testnode.test_stringArray
mcmds.setAttr('testnode.test_stringArray', 3, TestStringArray, type='stringArray')
###########################################################
執行的話,會在最後一行發生error,因為它不能先宣告一個array (test_stringArray=['a','b','c']),然後再把這個array的值set給testnode.test_stringArray。所以得將最後一行改成

mcmds.setAttr('testnode.test_stringArray', 3, 'a', 'b', 'c', type='stringArray')

如果現在要在這個testnode.test_stringArray放100筆資料呢.....總不能這樣寫

mcmds.setAttr('testnode.test_stringArray', 100, 'a1', 'a2', 'a3',...bla bla...,'a100', type='stringArray')

很恐怖吶!!

但是換成用pymel的話,就可以直接用已經宣告好的array來用,如下:

#先import pymel的module
from pymel import *
#將TestStringArray assign給testnode.test_stringArray
setAttr('testnode.test_stringArray', TestStringArray)

酷吧~ 而pymel在寫UI時,也有其便利性在,以後有機會在寫上來囉~

4 則留言:

  1. 我一樣是 pymel 的忠實愛用者 :D:D

    回覆刪除
  2. 果然是好物,所以使用它就不需要打一堆mcmds.囉?

    回覆刪除
  3. maya2011好像将pymel完善了很多
    很喜欢看你写的东西
    能不能再写点关于pymel的东西啊
    嘿嘿

    回覆刪除
  4. 前輩 你好

    我是最近剛踏入maya script的新人
    看了前輩這篇文章,有點疑問

    之前在maya的script editer上
    有看到兩個標籤,分別是MEL和Python

    然後,想請問前輩, 文章之中提到的pymel
    就是指Python這個標籤嗎

    還是說pymel的環境需要額外建立
    晚備用的軟體是 maya 2011

    回覆刪除