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  來控制此區域光的顏色了。

這個深層的原因其實也很簡單, 就是”、.、+、$ 等運算子的優先權問題。

You Might Also Like

4 Comments

  1. 您好,我是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" 呢~

    1. 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 這陣列內

      大概是這樣,希望有些幫助! 祝你順利!

    2. 發問的人

      這解決了我的困惑^^ 很感謝您抽空為我解答!!

    3. hank

      不會 : )

Leave a Reply

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料