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 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 로 실행시킬 수 있다.