posted by cimple 2010. 8. 12. 19:52


1. 변수의 선언

Maya Python Script 에서 변수는 따로 자료형을 선언해주지 않고, 바로 이름을 적고 값을 할당해 주면 된다.

myFirstVariable = 10
myFirstVariable = "Text"


MEL 과 같이 자동으로 자료형이 정해지며, 숫자로 시작하거나 이미 커맨드로 등록되어 있는 단어는 사용할 수 없다.

Python 의 변수는 MEL 보다 더 많은 자료형을 담을 수 있어서 더 강력하다고 하는데, 그건 더 활용해봐야 할 일인듯.


2. 변수의 활용 예제

특정 script 가 반환하는 자료형을 변수에 담아서 스크립트에 활용할 수 있다.
예를 들어, polyCube 같은 경우는 반환값이 string 형태이다. 그리고 이 string 은 해당 object 의 이름을 반환한다.

특정 명령어의 반환값과 그 type 을 알고 싶다면, 해당 명령어를 드래그>우클릭 하여 Quick Help 탭을 연 후, 그 Quick Help 창 위에서 다시 우클릭>Show Command Documentation 하면 바로 Documentation 에 연결되어 해당 명령어가 Return 하는 값에 대한 정보를 볼 수 있다.

cubeToBevel = mc.polyCube( w=1 , h=1, ... , ch=1)

이런 형태로 polyCube 가 반환하는 오브젝트 이름의 string 을 cubeToBevel 이라는 사용자 정의 변수에 담아 놓고,

mc.polyBevel(cubeToBevel, offset=0.5, ... , ch=1)

이런 식으로 쌍따옴표 " "  형태의 string 이 들어가던 부분에 변수를 넣어 놓는 형태로 스크립트를 작성할 수 있다.


3. 변수의 출력

각종 변수를 출력하는 방법은 전통적인 C 의 문법과 크게 다르지 않다.
다음과 같이 출력하면 된다.

intLife = 42
fPI = 3.14
hexColor = 0xFFCC00

print "My values are %d and %f" % (intLife, fPI)
print "The value of hexColor is ... %f" % hexColor



출력할 스트링 뒤에 % 를 붙여주고, 2개 이상일 경우에는 괄호로 묶어주면 된다.


ThEnd.

posted by cimple 2010. 8. 12. 19:12

1. Python Scripting 시작하기

Maya 에서 Python Scripting 을 가장 간단히 할 수 있는 방법은 MEL 과 똑같이 Script Editor 를 사용하는 방법과 Command Line 을 사용하는 방법이다.

하지만 Python Script 를 실행하기 위해서는 해당 실행창에서만 실행 가능하다.

Script Editor 에서는 Python 탭에서 실행해야 하고,



Command Line 에서는 좌측의 MEL 글자를 클릭하면 Python 스크립트 입력창으로 바뀌게 된다.




2. Hello World 찍어보기

Script Editor 의 Python 탭에서 간략하게 Hello World 를 찍어보자.
다음과 같이 입력하면 된다.


print "Hello, World!"






이렇게 입력한 뒤 실행하면 위쪽의 History 창에 실행 결과가 표시될 것이다.
다음도 가능하다.


print 25
print 25 / 2
print 25.0 / 2
print 25 / 2.0






3. Cube 하나 만들어보기

Python Script 를 실행하기 위해서는 maya 의 특정한 모듈들을 import 해야 한다.
그리고 그 모듈 안에 들어 있는 명령어를 실행하는 방식으로 이루어진다.

요약하면

Step 1) 필요한 Maya 모듈 import
Step 2) 필요한 명령어 실행


순으로 이루어지는데, 큐브를 하나 생성하려고 하면

ex)
import  maya.cmds
maya.cmds.polyCube()


이런 식으로 실행해야 한다.



import 는 한 번만 해도 되지만, 명령어를 실행할 때에는 매번 위와 같이
maya.cmds.명령어()
의 형태로 입력해야 하며, 커맨드를 하나의 function 처럼 인식하므로 뒤에 괄호 () 를 붙여 주어야 한다.

물론 저렇게 입력하는 것이 tedious 한 일이므로, 좀더 간결하게 입력하기 위해서

import maya.cmds as mc

이렇게 mc 라는 단축어로 import 하면 앞으로

mc.polyCube()

로 실행해도 정상적으로 실행할 수 있다.





4. MEL command 의 Echo 를 Phython Command 에서 실행하는 방법
(Phython Command 에 각종 Flag 를 추가하여 실행하는 방법)


마야의 메뉴를 클릭하거나 Shelf 에 있는 버튼 등을 눌러서 특정 명령을 실행하면, Script Editor 에서 그에 해당하는 커맨드가 표시되는 것을 확인할 수 있다.

이러한 식으로 커맨드의 Echo 를 받아 스크립트를 작성하는 방법을 자주 활용하게 되는데, Python Command 에서 이러한 MEL command 의 Echo 를 받아서 실행하는 방법은 다음과 같다.

MEL command 에서는 polyCube 를 생성할 때

polyCube -w 1 -h 1 -sx 1 -sy 1 -sz 1 -ax 0 1 0 -cuv 4 -ch 1

이런 식으로 명령어가 호출되는데, Phython command 에서는 다음과 같이 하면 된다.

(위에서 import 를 단축어로 받아왔다고 가정한 후)

mc.polyCube (w=1, h=1, d=1, sx=1, sy=1, sz=1, ax = (0, 1, 0), cuv = 4, ch = 1)

여기서 ax = (0, 1, 0)  과 같이 하나 이상의 배열 형태로 되어 있는 Flag 에 주목하자.



이 외에, scale 을 조정할 때 Maya command 에는 다음과 같이 표현된다.

scale -r 4 4 4;

하지만 여기서 -r 은 numeric value 를 attribute 로 받는 Flag 가 아니라, relative 하게 크기를 조절할 것인지를 결정하는 Boolean type Flag 이다. 따라서 이를 Python script 에서 실행하고 싶으면

mc.scale(4, 4, 4, r=True)

이런 식으로 실행해야 한다.



또 한 가지. polyBevel 같은 명령어의 경우, 커맨드의 맨 마지막에 해당하는 오브젝트의 이름이 오게 된다.

polyBevel -offset 0.5 -offsetAsFraction 1  ......... -angleTolerance 180 -ch 1 pCube1;

python script 에서는 이 때 해당하는 오브젝트의 이름을 맨 앞으로 가지고 오고, 쌍따옴표를 붙인다.

mc.polyBevel ("pCube1", offset=0.5, ...., ch=1)



MEL 과 마찬가지로 Script Editor 에서 완성된 Python script 를 드래그 한 후 가운데 버튼을 클릭하고 shelf 에 드래그&드랍하면 아이콘이 생성된다. 이것을 클릭해서 스크립트를 실행할 수 있다.





Script Editor 에서 각종 명령어들 (예를 들면 scale 등) 의 flag 를 확인하고 싶다면 해당 명령어를 드래그하고, 우클릭을 하고 있으면 나타나는 메뉴에서 Quick Help 라는 메뉴를 확인할 수 있다. 클릭하면 우측 하단에 해당 명령어에 해당하는 flag 들이 표시된다. 하지만 어떤 type 을 사용하는지까지는 표시되지 않아서 효용성을 잘은 모르겠다;






ThEnd.
posted by cimple 2010. 3. 24. 01:43


오늘 우연히 재미있는 기능을 하나 알게 되어서 소개해봅니다.

MS Word 2007 에서 간단하게 체크박스(checkbox) 를 만드는 기능입니다.

다시 말해서, Word 문서 상에서 클릭으로 간단히 켜고 끌 수 있는 checkbox 를 삽입하겠다는 말입니다.



이런 식이 되겠죠?



쉽게 될 줄 알았는데, 만드는 방법이 생각보다 귀찮아서 정리해서 올려봅니다.




1. 일단 메뉴에 '개발 도구' 탭을 추가해야 합니다.

기본적으로 메뉴에는 개발 도구 탭이 없네요.

업ㅂ어



따라서 개발 도구 탭을 추가해 주기 위해 좌측 상단의 워드 아이콘

 
을 클릭해 준 다음, 하단의 'Word 옵션' 에 들어갑니다.



체크 박스가 해제되어 있는 단 하나의 그것



'Word 옵션' 의 기본 설정 탭에서, '리본 메뉴에 개발 도구 탭 표시' 를 체크해줍니다.


있네요!


그럼 이제 메뉴에 '개발 도구' 탭이 표시되는 것을 볼 수 있습니다.


2. 개발 도구 탭에서 '이전 도구' 아이콘을 클릭합니다.

가운데 쯤에 이렇게 생긴 아이콘이 있습니다.

그럼 특정한 양식들을 삽입할 수 있는데, 아래(ActiveX 컨트롤) , 위(이전 양식)에 각각 체크박스가 있는 것을 볼 수 있습니다. 여기에서 아래에 있는 체크박스를 선택해 줍니다.

(위에 있는 '양식 컨트롤' 체크박스로도 체크박스를 만들어 주는 방법이 있지만, 더 복잡하고 까다로워서 이 방법은 생략합니다;; 구글링을 하면 이 '양식 컨트롤' 로 체크박스를 만드는 방법이 나오더군요;)

그럼 다음과 같이 생성되는 것을 볼 수 있습니다.

오오 무언가 만들어졌다.

3. 이제 만들어진 체크박스 양식을 수정해야 합니다. 즉 Text 를 고쳐야 합니다.

가장 쉬운 방법은 오른쪽 마우스 클릭 -> 확인란 개체 -> 편집 으로 고치는 것입니다.

고쳐졌죠?


4. 그런데 아직 체크박스를 클릭할 수는 없을 것입니다. 이것은 아직 '디자인 모드' 에 있기 때문입니다. 위쪽 메뉴를 보면 '디자인 모드' 가 활성화되어 있는 것을 볼 수 있습니다.

활성화되어 있는 '디자인 모드'


이것을 클릭해서 디자인 모드를 끄면, 비로소 체크박스를 클릭할 수 있게 됩니다.

완성!!!





(+ 추가사항)

3번 과정에서, 체크박스 양식을 더블클릭하면 다음과 같은 MS Visual Basic 창을 볼 수 있습니다.


왼쪽 하단의 속성 창에서 원하는 체크박스의 양식을 구체적으로 설정해 줄 수 있습니다.
한편 체크박스를 생성하는 것이 MS Visual Basic 으로 코드 형태로 삽입된다는 사실을 알 수 있습니다.


자! 이것으로 체크박스 만들기가 완료되었습니다.

참고로, 아래아 한글에서도 비슷한 기능을 제공하지만, 체크박스를 만들고 실행하는 방식이 달라 바이러스 감염 방지 등 보안상의 이유로 해당 기능을 사용하려면 문서를 여는 쪽에서 특정한 설정을 해 주어야만 하는 불편함이 있습니다.

그럼, 이것으로 이번 포스팅을 마치도록 하겠습니다.

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