posted by cimple 2012. 2. 2. 20:41
Comet Tools 는 리깅에 사용되는 유용한 MEL script 들을 모아 놓은 편리한 툴입니다.

스크립트 형태이므로 사용하는 데 문제는 없지만, 편하게 Maya 에 등록해서 사용하는 법을 설명하도록 하겠습니다.


1. Comet Tools 다운로드

아래 링크에서 다운로드 받을 수 있습니다.

Comet Tools 페이지

링크에 들어가 보면 MEL Script Suite 섹션 안에 있는 cometScript.zip 파일을 다운로드 받으시면 됩니다. 

cometScript.zip 을 다운로드 합니다.

 
cometScripts 폴더 안에 압축을 풀어 보면 각종 스크립트들이 들어 있는 것을 볼 수 있습니다.


2. Maya Script 폴더에 복사 

이제 이 스크립트들을 Maya 에서 실행할 수 있도록 해 주면 됩니다. 먼저 해당 폴더를 다음 경로에 복사합니다. (이탤릭체는 여러분의 설정에 따라 바뀌는 부분입니다)

C:\Users\YOURNAME\Documents\maya\scripts\


또는

C:\Documents and Settings\YOURNAME\My Documents\maya\scripts\ 



즉 마야의 기본 스크립트 폴더에 복사해 넣는 것입니다.




3. Maya 에서 메뉴로 뜰 수 있도록 설정해주기

Maya 를 실행할 때, Comet 이 바로 메뉴로 뜰 수 있도록 설정해 줄 수 있습니다. 다음 스크립트 폴더에 들어가 보세요. 각 MAYA version 에 따른 스크립트 폴더입니다.

C:\Users\YOURNAME\Documents\maya\MAYA_VERSION\scripts\



또는

C:\Documents and Settings\YOURNAME\My Documents\maya\MAYA_VERSION\scripts\ 



에 들어가보면, userSetup.mel 이라는 파일이 있을 수도 있고 없을 수도 있습니다. 없으면 만들어 주고, 파일 안에 다음 내용을 추가합니다.

source "cometScripts/cometMenu.mel" ; 



이렇게 하면 Maya 를 다시 켜면 메뉴로 등록되는 것을 볼 수 있습니다.



4. Maya Script Path 설정해주기

만약 3번까지 과정을 거치고 Comet 메뉴 안의 기능들을 눌러 보면 작동되지 않을 것입니다. Maya Script Path 안에 폴더를 하나 더 만들어서 그 안에 스크립트가 있기 때문인데, 따라서 해당 폴더를 추가로 Script Path 로 등록해 주어야 합니다.

C:\Documents and Settings\YOURNAME\My Documents\maya\MAYA_VERSION\scripts\ 



위 폴더에 들어가 보면 maya.env 라는 파일을 볼 수 있습니다. 해당 파일을 열어서, cometScript 폴더의 위치를 아래와 같이 추가해 줍니다.

MAYA_SCRIPT_PATH = C:\Users\YOURNAME\Documents\maya\scripts\cometScripts

 

 주의! Linux 에서는 위와 같은 방식으로 Script path 가 추가되지 않을 수 있습니다.

다음과 같이 추가하시기 바랍니다.


USER_SCRIPT_PATH=$HOME/maya/scripts/cometScripts

MAYA_SCRIPT_PATH=$USER_SCRIPT_PATH:$HOME/maya/scripts


위와 같이 USER_SCRIPT_PATH 로 원하는 패스를 추가하고,

MAYA_SCRIPT_PATH 에서 콜론(:) 으로 구분하여 패스를 추가해 줍니다.

Windows 에서도 같은 방식으로 할 수 있으며, 세미콜론(;) 으로 구분하여 패스를 추가합니다.




주의!


이 정도만 하시면 Maya 에서 Comet Tools 를 마음껏 사용하실 수 있으실 것입니다.

편리한 기능이 많은 cometTools

 
그럼 즐거운 리깅 되세요.


ThEnd. 




posted by cimple 2010. 11. 15. 23:31

Maya 에서 스크립트를 작성하다 보면 무한 루프에 빠지는 경우가 있다.

for 문이나 while 문 (특히 while 이놈!) 을 잘못 쓰면 무한 루프에 빠져 버리는 경우가 있는데,

ctrl+break 가 통하는 것도 아니고 esc 를 아무리 연타해도 안 되고, 마야가 먹통이 되어 버려서 결국에는 작업관리자를 켜야만 하는 처지에 놓이게 된다.

이 때, 반복문 내에 무한루프를 방지할 수 있는 간단한 장치를 마련할 수 있는데, 방법이 조금 독특하다.

'외부 파일을 이용' 하는 방법이다. 


사용 방법은 다음과 같다.




1. 위에 첨부된 파일(BREAKMEL.bat) 를 받아서, 소중한 곳에 잘 간직해둔다.
2. 마야에서 MEL scripting 을 하면서, 무한루프가 의심되는 반복문 안에 다음 구문을 넣어준다.

import os
if os.path.exists("c:/breakMel") : break
3. 만약 스크립팅을 하다가 무한 루프에 빠지면, 첨부된 파일을 실행하기만 하면 반복문이 종료될 것이다.



간단한 예제는 다음과 같다.



위와 같은 구문을 스크립트 에디터에서 실행하면, 아마 지구가 멸망할 때까지 1을 찍어댈 것이다.
이 때, 첨부된 BREAKMEL.bat 를 실행시키기만 하면 무한루프를 중지시킨다.
이 때 임시로 생성되는 파일은 자동으로 삭제되니 신경쓰지 않아도 된다.




이 방식의 원리는 다음과 같다.

1. 반복문이 계속 돌면서, 컴퓨터 내부에 특정 파일이 존재하는지 계속 검사를 한다.
2. 만약 무한루프에 빠지면, 그 특정 파일을 생성시킴으로써 반복문을 종료시킬 수 있다.


여기에서 '컴퓨터 내부를 계속 검사한다' 라는 부분이 상당히 찜찜하게 느껴질 것이다.
하지만, 이 방식을 처음 제시한 저자에 따르면 거의 퍼포먼스의 저하가 없다고 한다.

첨부파일인 BREAKMEL.bat 는 뭐 복잡한 구조를 가지고 있는 것이 아니라, 다음이 전부이다.


즉, c:\ 에 breakMel 이라는 가상의 파일을 하나 만들고, 아무 키나 누르면 그걸 지운다는 거다.


재밌는 방식이고, 꽤나 괜찮은 아이디어이다.
하지만 퍼포먼스의 저하가 '전무' 하다는 것은 사실 믿을 수 없다;; 약간 궁여지책처럼 느껴지기도 하고, 의심이 많이 가는 반복문에서만 사용하는 것이 좋을 것 같다.



아이디어는 다음 블로그 포스팅에서 참고하였다.

http://www.naughtynathan.co.uk/?p=59



ThEnd.

posted by cimple 2009. 10. 19. 22:19

소스 코드에서 내가 짠 부분의 Tip 을 간략하게 정리하고자 한다.

1. 특정한 오브젝트를 생성한 다음, 그 오브젝트의 이름을 바꾸어주기

string $bbcmd = "polyCube -ch on -o on -w " + $fx + " -h " + $fy + " -d " + $fz + " -cuv " + 4;
string $bbname[] = eval($bbcmd);
rename $bbname[0] "BBB";


2. Bounding Box 를 그리는 Template 함수를 만들었다.

global proc makeBBTemplate(string $name, int $tx, int $ty, int $tz, int $rx, int $ry, int $rz)
{
 float $nx = `intSliderGrp -q -value cellY`;
 float $ny = `intSliderGrp -q -value cellZ`;
 float $nz = `intSliderGrp -q -value cellX`;
 string $bbCmd;
 
 if($name == "LEFT" || $name == "RIGHT")
 {
  $bbCmd = "polyPlane -w " + $nx + " -h " + $ny + " -sx 1 -sy 1";  
 }
 else if($name == "FRONT" || $name == "BACK")
 {
  $bbCmd = "polyPlane -w " + $nz + " -h " + $nx + " -sx 1 -sy 1";  
 }

 else if($name == "TOP" || $name == "BOTTOM")
 {
  $bbCmd = "polyPlane -w " + $nz + " -h " + $ny + " -sx 1 -sy 1";  
 }

 string $bbname[] = eval($bbCmd);
 rename $bbname[0] $name;

 if(eval("objExists " + " " + $name))
 {
  select $name;
  string $move = "move -x " + $nz/2.0*($tx) + " -y " + $nx/2.0*($ty) + " -z " + $ny/2.0*($tz);
  string $rotate = "rotate -x " + $rx + " -y " + $ry + " -z  " + $rz;
  eval($move);
  eval($rotate);
 }

 string $tx_lock = $name + ".tx";
 string $ty_lock = $name + ".ty";
 string $tz_lock = $name + ".tz";
 string $rx_lock = $name + ".rx";
 string $ry_lock = $name + ".ry";
 string $rz_lock = $name + ".rz";
 string $sx_lock = $name + ".sx";
 string $sy_lock = $name + ".sy";
 string $sz_lock = $name + ".sz";

 setAttr -lock true $tx_lock;
// string 을 만든 후, 내가 원하는 attribute 를 받아서 그것을 Lock 시키는 코드.
 setAttr -lock true $ty_lock;
 setAttr -lock true $tz_lock;
 setAttr -lock true $rx_lock;
 setAttr -lock true $ry_lock;
 setAttr -lock true $rz_lock;
 setAttr -lock true $sx_lock;
 setAttr -lock true $sy_lock;
 setAttr -lock true $sz_lock;
 
 string $bbTextCurve = "textCurves -t " + $name;
 string $bbTextCurveName[] = eval($bbTextCurve); 
 string $CurveName = $name + "Curve";
 rename $bbTextCurveName[0] $CurveName;

 if(eval("objExists " + " " + $CurveName))  // 함수 내부에는 이런 식으로 써줄 수 있다.
 {
  select $CurveName;
  string $move = "move -x " + $nz/2.0*($tx)*(1.1) + " -y " + $nx/2.0*($ty)*(1.1) + " -z " + $ny/2.0*($tz)*(1.1);
  string $rotate, $move2;
  if($name == "LEFT")
  {
   $rotate = "rotate -y -90";
   $move2 = "move -z -5.6 ";
  }
  else if($name == "RIGHT")
  {
   $rotate = "rotate -y 90";
   $move2 = "move -z 6.5";
  }
  else if($name == "TOP")
  {
   $rotate = "rotate -x -90";
   $move2 = "move -x -4.7"; 
  }
  else if($name == "BOTTOM")
  {
   $rotate = "rotate -x 90";
   $move2 = "move -x -9.6";
  }
  else if($name == "BACK")
  {
   $rotate = "rotate -y 180";
   $move2 = "move -x 6.6";
  }
  else if($name == "FRONT")
   $move2 = "move -x -7.7";

  eval($move);
  eval($move2);
  eval($rotate);
 }
}


ThEnd.

posted by cimple 2009. 10. 7. 11:29


1. 개발할 때 window memory name 중복문제

MEL script 로 UI 를 개발할 때, window 의 memory name 중복 문제가 발생한다.
즉, 이미 내가 실행하고 있는 윈도우를 다시 실행할 때나,
아니면 이미 내가 종료한 윈도우라고 하더라도 메모리에 이름이 삭제되지 않아서 같은 memory name 을 가진 윈도우를 생성할 수 없는 문제 등이 발생하는 것이다.

이를 위해서 다음과 같은 코드를 추가해 주자.

global string $f_painter_memoryName = "uiFeaturePainter";
global string $f_painter_titleName = "Feature Painter 0.1";

global proc ui_f_painter()
{
  global string $f_painter_memoryName;
  global string $f_painter_titleName; 


  int $developing = false;
  if($developing && `window -exists $f_painter_memoryName`)
 deleteUI $f_painter_memoryName;
  if(!`window -exists $f_painter_memoryName`)
 window -title $f_painter_titleName -width 400 -height 500 -sizeable true $f_painter_memoryName;

  ...

}


이렇게 하면 윈도우의 memory name 중복 문제를 해결할 수 있다.




2. 특정 field 를 edit 하는 방법.


예를 들어, select 버튼을 누르면 위의 selected Object text field 옆에 현재 선택한 object 의 이름이 뜨도록 하고 싶다고 가정하자.

그렇다면 UI 함수 안에서 text field 는 이렇게 만들어져 있을 것이다.


textFieldGrp -label "selected Object : " -text " " -editable false;


여기에서 맨 끝에 객체의 이름을 추가해 줄 수 있다.


textFieldGrp -label "selected Object : " -text " " -editable false selectField;


그리고, 다른 함수에서 이 객체의 이름을 가지고 text field 를 수정해 줄 수 있다. 중요한 것은 -edit 라는 파라미터이다.

global proc string selectObject()

  string $selCapture[0] = `ls -sl`; 
  string $selectObj = $selCapture[0];
 
textFieldGrp -edit -label "selected Object : " -text $selectObj -editable false selectField; 
  return $selectObj;
}


이렇게 하면 button 을 누를 때 -cmd "selectObject" 이렇게 selectObject 함수를 호출하기만 하면 text field 의 값을 바꾸어 줄 수 있다.


3. 화면의 Layout 을 나누는 방법

MEL 에서 화면의 Layout 을 나누는 방법은 여러 가지이다.



(1) frameLayout

그림과 같이 화면을 나누어주고 싶을 때 사용한다. 프레임 전체를 접었다 펼 수 있는 -collapsable, 외곽 스타일을 정해줄 수 있는 -borderStyle 등을 정해줄 수 있다.




(2) columnLayout

보통 UI 의 component 들은 각 요소가 세로로 배열되는 경우가 많다.
그럼 단지 columnLayout; 으로 간단하게 component 들을 세로로 순차적으로 배열할 수 있다.


frameLayout ...;
columnLayout;

...

serParent ..;
setParent ..;



이렇게, frameLayout 과 함께 자신의 부모를 window 로 지정해준다. 이렇게 하나의 단위를 이루면서 생성되는 경우가 많다.



(3) gridLayout

버튼을 보기좋게 배치할 때 gridLayout 을 사용하였다. 사실 아래와 같이 분할되어 있다.


이것은 다음과 같이 이루어져 있다.


gridLayout -cellWidthHeight 133 40 -numberOfRowsColumns 1 3;
text -label " ";       
button -label "select" -align "center" -width 133 -height 30 -actOnPress true -command "selectObject";   
text -label " ";
setParent ..;


이런 식으로 cell 을 분할한 다음, 빈 공간에는 공백 텍스트를 주고, 버튼을 배열하는 방식으로 버튼 위치를 조절할 수 있다.


(4) rowColumnLayout

행과 열을 나누어서, 그 width-height 를 분할해서 component 들을 배치할 수 있다.
아래와 같이 index 가 매겨지고 그 크기값을 주어서 보기 좋게 분할할 수 있다.




rowColumnLayout -numberOfColumns 4 -columnWidth 1 60 -columnWidth 2 160 -columnWidth 3 100 -columnWidth 4 40;
   text -label " ";  
   attrEnumOptionMenu -l "Map : " -ei 0 "angle Map" -ei 1 "density Map" -ei 2 "scale Map"; 
   button -label "edit" -width 10 -height 30 -align "center";
 setParent ..;


이렇게 하면 좀더 자유롭게 component 들을 배치할 수 있다.


5. 기타등등

radio 버튼 등을 배치할 때 기본값으로 하면 버튼간의 간격이 너무 넓다. component 들의 parameter 를 이용해서 이 간격들을 조절해 줄 수 있다.

radio 버튼같은 경우에는 각 버튼의 index 를 가지고 위치를 조절해줄 수 있다.




radioButtonGrp -numberOfRadioButtons 3 -columnWidth 1 105 -columnWidth 2 90 -columnWidth 3 70 -label "Operation : " -labelArray3 "replace" "add" "smooth";


MEL 의 모든 parameter 를 외우면서 활용하기란 불가능하다. 자주 사용하는 command 의 parameter 라면 숙지해야겠지만, MAYA Document 를 적극 활용하면서 친숙해지는 방법이 가장 효율적이라고 생각된다.

ThEnd.
posted by cimple 2009. 9. 16. 12:38


간단한 Mel 스크립트를 파일로 만들고, 이를 실행하기


매우 간단한 MEL 스크립트 파일을 만들고 실행하는 방법을 알아 보자.

script editor 의 command input panel 에 다음과 같이 입력하도록 하자.




이것을 그대로 Ctrl + Enter 로 실행시켜 보면 다음과 같은 결과를 확인할 수 있다.




그렇다면, 이 mel script 를 파일로 저장해보자. 

mel script 를 파일로 저장하는 방법은,
1. script 를 마우스로 드래그한 다음
2. script editor 메뉴의 file > Save script... 로 저장한다.

이름은 자신이 원하는 이름으로 아무렇게나 저장해 준다.

ex) myscript.mel




다음, 위에서 저장했던 스크립트 파일을 다시 마야에서 실행시키는 방법이다.
물론 스크립트 파일의 소스 코드를 복사해서 script editor 에 붙여넣기 한 다음 실행시키는 방법도 있겠지만,
스크립트 파일을 적당한 경로에 위치시켰다면 이 파일 전체를 하나의 명령어로 실행시킬 수도 있다.


script editor 의 command input panel 이나
마야 하단의 command line 에

source myscript;

또는

source myscript.mel;

을 입력하면, 미리 입력해둔 스크립트가 실행되게 된다.





이를 위해서 스크립트 파일이 위치해야 할 경로는

... \ (내 문서 폴더) \ maya \ (마야 버전) \ scripts

또는

... \ (내 문서 폴더) \ maya \ scripts

에 위치시켜야 한다.

예를 들면,

C:\Documents and Settings\admin\My Documents\maya\2009\scripts

또는

C:\Documents and Settings\admin\My Documents\maya\scripts

에 위치시켜야 한다는 것이다.




ThEnd.



p.s. 추가적인 사항

만약에 마야에서 멜 스크립트를 만들고, 이를 mel 에 저장한 다음
즉시로

source myscript;

이런 식으로 실행하려고 하면 아마 실행이 되지 않을 것이다.

이유는 모르겠으나 마야를 한번 종료했다가 다시 켜면 정상적으로 경로를 찾고 source 로 실행시킬 수 있다.