1. 개발할 때 window memory name 중복문제
MEL script 로 UI 를 개발할 때, window 의 memory name 중복 문제가 발생한다.
즉, 이미 내가 실행하고 있는 윈도우를 다시 실행할 때나,
아니면 이미 내가 종료한 윈도우라고 하더라도 메모리에 이름이 삭제되지 않아서 같은 memory name 을 가진 윈도우를 생성할 수 없는 문제 등이 발생하는 것이다.
이를 위해서 다음과 같은 코드를 추가해 주자.
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;
이런 식으로 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.