MAYA 學習筆記 004 – MEL
MAYA 的 MEL Script 學習筆記
本筆記的參考課程為 Maya Mel基礎入門教學
第一部分 一些基本知識
1. 選取
select 模型名稱 select 群組名稱|模型名稱 select 材質名稱
注意! 符號 | 不能少
2. 每句結尾是分號
print ("XXX"); // 這是註解 /**/ // 算蠻接近 Shell Scripts 的語法 /* Bash 跟 tcsh 綜合,帶點 C 風格 */
3. Command
Command / Delete Tab 可刪除標籤(也可新增 &rename 便於進行多組工作)
- 可考慮把 Command / show quick help 打開 方便查詢所需指令
- 要類似自動提示的功能 勾選 Command / Command Completion 與 Show Tooltip Help
4 History
History 下有些東西預設不顯示,可視情況勾選之,以利初學階段作弊
ps. 雖然顯示全部會眼花繚亂,但是因為有很多動作 script editor 預設是不會全部顯示的,很多情況下會以一個 XXXXX 1 帶過,只用1告訴你執行OK 這樣就沒辦法抄拉~XD
此外,也可趁機觀察所有的步驟究竟以 MEL 來寫是如何撰寫的
5. 編輯器內的字體放大功能(Ctrl + 滾輪滾動)
6. 編輯 Shelf 按鈕
除了 Ctrl + Shift + 左鍵單點 的方式可以把現成的命令新增到 Shelf以外,還可動用 Shelf Editor 來編輯該 Shelf 按鈕的詳細動作
而 MEL 跟 Python 則是選取程式碼後,中鍵拖曳到 Shelf 架上
建立了圖示後,還可以打開 Marking Menu 編輯器,新增到你喜歡的快速鍵位置(setting preference 下)
7. 系統指令
system("[系統指令]");
就等同在 命令提示字元內下指令,系統也會回饋相對應的訊息
例如 你可以很無聊的在MAYA內 ping 自己: system(“ping localhost”);
windows下 執行 exe 直式的指令則可以加 exec 或 start 作為開頭
8 file 指令
1) file -force -new; 強制生成新檔案 且不存檔
2) 存檔為 ma 格式
file -rename "XD.ma"; file -s -type "mayaAscii";
9. 變數
(1) 整數
int $variable1; $variable1=100; print($variable1);
(2) 浮點數
float $variable2; $variable2=98.765; print($variable2);
(3)字串
string $variable3; $variable3="Hello World!!"; print($variable3);
(4)
print("The number is :"+$variable2);
(5) 增加 $count 數值就可自動生成編號檔案
file -rename ("XD_"+$count+".ma"); file -s -type "mayaAscii";
10. setAttr
setAttr "物體名稱.屬性名稱" 數值; setAttr "pCube1.translateX" $x;
11.
(1) Lock Attributes
setAttr -l true "defaultRenderGlobals.currentRenderer"; setAttr -l false "defaultRenderGlobals.currentRenderer";
(2) 算圖引擎的名稱
string $nowRender = `getAttr defaultRenderGlobals.currentRenderer`;
則 $nowRender 的值就會是現在的算圖引擎的名稱
注意 ` 這個單引號,MEL 內,要使用一對這樣的單引號來表示其內為一段程式碼,則程式碼的回傳值,才會寫入字串變數,繼續被運用。這個概念在 UNIX Shell 下也有。
(3)
setAttr defaultRenderGlobals.currentRenderer -type "string" "mentalRay";
12. IF
if(條件) { 執行內容; } else if (條件) { } else { }
條件的內容可能是 變數、邏輯值。
第二部分 對話框
13. 建立新節點
createNode file;
- 會建立一個file節點,執行後可以到 Hypershade 找到
- 剛建立的時候,此節點的設定分頁也會出現在右邊的屬性編輯器的地方
14. script 節點
- 建立後可選擇 type (或寫在引數內) 例如 open/close 就是指開啟關閉時的觸發事件
- 之後就可以到表達式編輯器內編輯這個腳本內容 (Select 要選 by Script Name)
15. confirmDialog 確認型對話框的語法
- -title “對話框標題字串”
- -message “顯示訊息”
- -buttun “OK”
- -defaultButtun “OK”; ← 這個是Enter鍵預設啟動的按鈕
16. 所以,有上述13~15 的知識,就可以製作一個開啟、關閉檔案時候的詢問對話框。
17. 顯示文字訊息
headsUpMessage "Hello Message!!";
在場景內顯示文字訊息,場景一更新就會消失
-time 20 顯示20秒
-object pSphere1 顯示在某顆球模型上
18. 視窗基本語法
window -title "標題" -wh 500 500 視窗名稱; showwindow;
可使用參數 -exist ,傳 true / false 表示某視窗在不在,例如
window -exist "視窗名稱"
或 -exist $window,前提是生產視窗時前墜加上 string $window=`window XXXXXXXX`,請看下面:
if (`window -exists $window`){ print(" Ops!!\n"); deleteUI -window $window; print(" OK delete it\n"); } string $window=`window -title "title" -wh 500 200 winname`; showWindow; printt($window);
注意! $window 為內定的一個字串變數,可用來寫入視窗名稱。平常未宣告,若你有開始使用視窗命令時,會自動宣告。
19. 產生有格局的視窗
button -label "OK1";text -label " text One"; button -label "OK4";text -label " text Four"; button -label "OK3";text -label " text Three"; button -label "OK2";text -label " text Two";
這樣可依序生產出四組 文字、按鈕 交替,類似這樣:
OK1 text One OK4 text Four OK3 text Three OK2 text Two
嗯 很亂! 所以要學會安排視窗布局,又, MAYA 2012 如果沒有先以 layout 布局,亦無法放置按鈕與文字。
20.控制視窗的布局
rowColumnLayout -numberOfRows 列數 -numberOfColumns 行數 -columnWidth 行寬度 -rowHeight 列高度
就可以達成基本的視窗布局,這樣安排就像安排表格一樣,然後把 buttun 與 text 指令接在後面的話,文字跟按鈕就會依照你設定的表格形式分布
21. 懶人秘技
MEL 命令漸漸多起來,參數也越來越長,雖然完整的參數可以幫助以後的維護與修改,但是…好懶啊!
- 使用 quick help ,先在欄位內打上命令後按下 Enter
- 下方欄位將出現各種引數,在該引數上 Double Click ,則 MAYA 會自動在 MEL 編輯器內產生該引數,不必親自輸入完整單字,懶人萬歲!
22. 分隔線
separator;
- 這裡要注意,一個separator只會占用布局表格的一格,而不像 HTML 一個水平分隔線就會自動橫著畫出一條無限長的橫線
- 因此若你的行數有三行,那separator至少要連打三個,才能達成理想中的分隔上下選單的效果
- 看不懂? 哎! 自己輸入多個separator試試看吧!
23. 讓按鈕上帶有圖案
- 使用命令 symbolButton -image “圖案檔名”;
- 要把圖案儲存到特定的資料夾,大致是在 文件/maya/2013/prefs/icons (實際情況依照系統與MAYA版本不同而略有差異)
- 注意啊!既然資料夾都叫 icons 了,當然是告訴你這裡要存的圖片尺寸都要是 icon 的大小與就是32*32,太大的圖案你可別期待 MAYA 正常的吃下去
- 參數 -c 即為按下按鈕後會執行的命令
symbolButton -c "MEL命令或自訂函式";
第三部分 表達式
24. 表達式在每一個影格都會計算一次
25. 表達式編輯器可以吃 MEL 語法
26. 所以,一些簡單的變化可以不必自己辛苦的寫回圈或判斷,而可以運用表達式。
27. 但是必須注意,如果屬性欄位沒辦法直接 Edit Expression 來打開表達式編輯器 表示可能沒有對應的表達式物件來供你撰寫表達式,那只好自己新增一個表達式名稱(注意 不是物件名稱)
28. 在 MEL 編輯器執行 expression -name “changeText”; 之後打開表達式編輯器就可以看到此名稱 (Select 改成 by Expression Name)
29. 先建立一個文字的 Bevel 模型,且”不可以“刪除歷史紀錄
找到屬性編輯器的textForBevel1分頁,看到 Text 欄位可供你修改文字,MAYA 也會即時反應成 Bevel 模型 (所以叫你別刪歷史)
30. 所以我們可以做一個計時器,然後MAYA就會用漂亮的 Bevel 模型秀給我們看
表達式編輯器內寫
int $n; if(frame==1){$n=1;} else{$n++;} setAttr textForBevel1.text -type "string" $n;
就可以簡單的跑數字跳動啦~
第四部分 繼續研究
31. 陣列
int $array[6]; $array[0]=3; $array[3]=3; $array={1,2,4,6,8,9};
32. ls
- ls 列出場景內所有東西
- ls -sl 列出目前選取的東西
33. 把得到的物體名稱寫入陣列
string $nowselect[] = `ls -sl`;
34. for 的格式,兩種方法
- for( <id> in <expr>)
- for(計數個體 in 計數總體)
範例、
string $a[]={"c","d","e","f","g"}; for( $i in $a ) { print($i+"\n"); };
列印結果:
c
d
e
f
g
- string $a[] 是宣告陣列,同時 $a 即作為 for 迴圈的計數總體
- 可以發現 $i 沒宣告就可直接用, 這裡等於直接宣告 string $i,然後每一個計數個體的值,會自動寫入這個變數 。
35. 將函式儲存在記憶體內備用
proc 函式(){函式內容}
36. 綜合 34. 35
(1) 先用 proc 定義自動 keyframe 函式
proc fast_keytx() { print("Key frame for translate X.\n"); $myObject="物體名稱"; setKeyframe -attribute "translateX"; }
- $myObject 也是一個內定變數,平常未宣告,但是直接寫入就會自動宣告,$myObject 寫入的物體名稱,相當於執行了選取該物體,所以 setKeyframe 的指令內就不用再度指定物體名稱
- 所以以上兩行程式也可縮為一行 → setKeyframe “物體名稱.translateX”;
(2)
symbolButton -i "圖案.bmp" -c "fast_keytx()";
這樣,這個按鈕就可以自動幫指定名稱的物體作 X 方向移動的關鍵影格
37. 自訂函式的引數
symbolButton -i "圖案.bmp" -c "function(3)"; ... proc function( int $choice) { bala bala~~~ 反正 $choice 這個變數會=3 }
38. 迴圈
for($i=1;$i<=10;$i++) { polyCube; move -r 0 0 $i; print($i+"\n"); }
- move 加 -r 是相對移動
- for(變數 in 陣列) 則會稱為 for in 迴圈
- while 迴圈: while(測試條件) {執行內容} ,測試條件為真就執行
39. 宣告
在程式內第一次書寫「 $a=1;」 其實就相當於「 int $a=1;」,在有指定初始值的情況下,整數浮點數的宣告字樣可以省略。
40.
size(陣列名稱)
可以得到陣列大小。
41. parent
格式: parent 子物體名稱 父物體名稱;
例如、
parent pCube9 pCube10;
則 9 會變成 10 的小孩。
42. substituteAllString
格式: substituteAllString (被處理的字串, 要剔除的字串, 要添加的字串)
如此 則會從 被處理的字串,去掉要剔除的字串,然後加上要添加的字串。
43. doDelete
刪除
44.match “[0-9]+” $string;
在 $string 字串裡,找到符合 0~9 的字串後傳出來。
45. 把字串轉為數字
當字串 $string 為 123456,只要寫 int $n= $string; 即可把字串轉數字
46.
$string="123456"; int $n=$string; $string=$string+1; $n=$n+1; print("string is :"+$string+"\n"); print("n is :"+$n+"\n");
這樣最後印出來的結果, string會是 1234561 而 n 則是 123457,這就是字串跟數字的 +1 的不同。
47. 除了整數 浮點數 字串以外 還有向量
注意! 向量要用雙括號 << >> 括起來
vector $a= <<100,80,70>> int $b = $a.x;
上面的第二句是單獨運用其中一個元素,此時 $b 會等於 100
48. addAttr
addAttr -ln "ControlColor" -usedAsColor -attributeType float3; // ControlColor 屬性名稱 // -usedAsColor 為必要的 // -attributeType float3 指定型態, float3表示要給予三個浮點欄位 // 選取一個 locator 後執行,就可以在 Extra Attributes 下面新增一欄新的屬性控制器,名為 ControlColor,但還要在加上顏色相關的欄位 addAttr -ln "red" -attributeType "float" -parent "ControlColor"; addAttr -ln "green" -attributeType "float" -parent "ControlColor"; addAttr -ln "blue" -attributeType "float" -parent "ControlColor"; // 執行後可以在 ControlColor 欄位處新增一個控制顏色的顏色框
49. connectAttr 連接上述欄位與實際物件的顏色屬性
上述欄位隸屬於 locator 所以名稱大致是 locator1.ControlColor
而實際物件嘛…嗯 例如一個燈光,那名稱可能是 arealight1.color
此外,每當參數(或可稱引數)為複合式的,例如 $myObject+”.ty” 這樣的,那整個餐數必須用小括號括起來。
例如
$myObject="arealight1"; connectAttr -f locator1.ControlColor ($myObject+".ty");
這樣才不會出錯。執行後,就可從 locator 的屬性編輯器內的 ControlColor 來控制此區域光的顏色了。
這個深層的原因其實也很簡單, 就是”、.、+、$ 等運算子的優先權問題。
您好,我是mel初學者,我遇到了一個問題請求幫助~= = "
https://farm1.staticflickr.com/317/18731875135_25ccf46c8e_o.png
我想寫一個視窗,裡面包含一個文字輸入框、一個按鈕,
功能是:在文字輸入空中輸入文字後,執行按鈕,被選擇的物體能更改為輸入空中相同的名。
我在網上有找到相似的mel,但是執行後maya就變得怪怪的,常會跳出// Error: Wrong number of arguments on call to rename. // 訊息。
網路上的mal
/*////////////////////////////////
大綱視圖裡對一組對象的批量命名
先從在大綱視圖裡選中一組對象,再執行腳本
命名格式如:moxing_1;
/////////////////////////////////
*/
global proc rename ()
{
string $sel[] = `ls -sl`;
global string $myTextFieldButtonGrp;
string $name;
$name = `textFieldButtonGrp -q -text $myTextFieldButtonGrp`;
int $i;
for ($i = 0;$i <size($sel);$i++) {
int $j = $i +1;
rename $sel[$i] ($name + "_" + $j);
}
clear $sel;
}
if (`window -ex window1`)
{
deleteUI window1;
}
window -title "Outline View batch name"
-wh 450 88
window1;
columnLayout;
text -label "\n Please select a group of named objects in the outline view before use\n";
$myTextFieldButtonGrp = `textFieldButtonGrp -label "Enter the name"
-text "moxing"
-buttonLabel "name"
-buttonCommand "rename()"`;
showWindow window1;
我自己在練習寫的mel
string $window = `window`;
columnLayout;
textFieldButtonGrp -label "Label"
-text "Text"
-buttonLabel "Button"
-bc "cj()";
showWindow $window;
proc cj(){
string $name1 = "gf";
rename $name1;
}
這按鈕執行後,選擇的物件名會變成qf,但有怎麼讓輸入框的文字,回傳取代 "qf" 呢~
hank
Hi
首先不好意思啦 ~ 我現在沒辦法協助你百分百確認錯誤訊息的原因,因為電腦沒辦法裝 MAYA,不過還是可以幫忙推敲推敲,你的錯誤訊息是 // Error: Wrong number of arguments on call to rename. //
所以,應該有引數(arguments )錯了,引數就是你的指令/函數後面,所跟隨的那一大串附加的指定資訊,
譬如 exampleCommand -a -bc “defgh” 這個指令,第 1 個引數 就是 -a 、第2個引數就 -bc 、第3個引數就是 “defgh” …
譬如 exampleFunctin(i,jk) 這個函數,第 1 個引數 就是 i、 第2個引數就 jk
至於是哪個指令/函數,錯誤訊息也提示了,是 rename
所以 綜觀範例,它的用來改名稱的自訂函數叫做 rename ,然後在 rename() 的最後又呼叫了 rename (可這次是想呼叫 MEL 內的那個 rename )
所以我們可以大膽推測,原因就是此時 rename 已經被先前的 global proc rename () 給覆寫掉了,所以, rename 變成了一個不可以帶有引數的函數,因此當程式還想呼叫 rename 來改名稱, MEL 就警告了
所以你不妨幫自訂 rename 改個名字,另外自訂函數的名稱時也盡量不要去使用到已有的指令/函數名稱,當然也不要去用程式語言自己的保留字。
再來,你詢問的”怎麼讓輸入框的文字,回傳取代 “qf” 呢~”
可以參考你找到的範例,恩 精華在他所寫 rename() 裡面,他用 textFieldButtonGrp 把 輸入框的文字取出來,然後用 for 迴圈 加上底線跟數字,把選取中的 Objects 用 rename 去命名(後面這步你已經會了),至於他如何知道那些物體是選取的呢? 秘訣是 它的 string $sel[] = `ls -sl`;,這會列出選取中的物體,然後把名稱儲存到 $sel 這陣列內
大概是這樣,希望有些幫助! 祝你順利!
發問的人
這解決了我的困惑^^ 很感謝您抽空為我解答!!
hank
不會 : )