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.