안녕하세요.
애니메이터가 들려주는 맥스 스크립트의 스크립팅하는 애님입니다.
지난번까지 작업된 스크립트는 작동은 잘하지만, 비슷한 내용이 중복되어 있습니다.
이 중복되는 부분을 사용자 정의 함수를 사용하여 줄여 보겠습니다.
사용자 정의 함수가 궁금하시면 '맥스스크립트 기초 > 함수(3)'을 읽어 보세요.
지난번에 작성했던 스크립트를 열어 줍니다.
주욱 읽어 보시면
1
2
3
4
5
6
|
choObjs = #()
for i = 1 to selObjs.count do
(
if(classof selObjs[i] == Box) do append choObjs selObjs[i]
)
selectMore choObjs
|
cs |
위 스크립트와 비슷한 내용이 계속 반복됩니다.
단지 선택하는 클레스와 그 노드를 '선택/해제'가 바뀔 뿐입니다.
우선 함수의 틀을 만들어 봅시다.
MAXScript Editer를 열고 새로운 탭을 열고 다음과 같이 입력해 봅시다.
1
|
fn selNode_fn nodeClass state =
|
cs |
fn을 써서 사용자 정의 함수임을 선언하고 함수명을 적습니다.
인수는 nodeClass와 state로 두개이고 nodeClass는 클래스명을 정하고 state는 선택과 해제를 정합니다.
함수의 내용은 위에 반복 되는 내용을 수정합니다.
1
2
3
4
5
6
7
8
9
10
|
fn selNode_fn nodeClass state =
(
choObjs = #()
for i = 1 to selObjs.count do
(
if(classof selObjs[i] == nodeClass) do append choObjs selObjs[i]
)
if(state == true) then selectMore choObjs
else deselect choObjs
)
|
cs |
위 내용을 잠깐 훑어 보면 if(classof selObjs[i] == nodeClass)는 인수값 nodeClass과 selObjs[i]의 클래스를 비교합니다.
그리고 if(state == true)를 사용하여 선택과 해제를 결정합니다.
이제 이 사용자 정의 함수를 이전의 스크립트 try(destroydialog SelObj_roll) catch() 아래에 넣어줍니다.
그 후에 중복된 내용을 함수로 대체 합시다.
아래와 같은 부분을
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
on box_chb changed state do
(
if (state == true) then
(
choObjs = #()
for i = 1 to selObjs.count do
(
if(classof selObjs[i] == Box) do append choObjs selObjs[i]
)
selectMore choObjs
)
else
(
choObjs = #()
for i = 1 to selObjs.count do
(
if(classof selObjs[i] == Box) do append choObjs selObjs[i]
)
deselect choObjs
)
)
|
cs |
아래와 같이 간단하게 바꿉니다.
1
2
3
4
5
|
on box_chb changed state do
(
if (state == true) then selNode_fn Box true
else selNode_fn Box false
)
|
cs |
깔끔하네요. ㅎㅎ
실행해서 잘 선택이 되는지 확인해 봅시다.
잘 되나요?
지금까지 작업한 내용은 다음과 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
selObjs = $* as array
choObjs = #()
try(destroydialog SelObj_roll) catch()
fn selNode_fn nodeClass state =
(
choObjs = #()
for i = 1 to selObjs.count do
(
if(classof selObjs[i] == nodeClass) do append choObjs selObjs[i]
)
if(state == true) then selectMore choObjs
else deselect choObjs
)
rollout SelObj_roll "머지툴"
(
checkbutton box_chb "Box" width:40 height:25 pos:[25,5]
checkbutton bone_chb "Bone" width:40 height:25 pos:[25,35]
on box_chb changed state do
(
if (state == true) then selNode_fn Box true
else selNode_fn Box false
)
on bone_chb changed state do
(
if (state == true) then selNode_fn BoneGeometry true
else selNode_fn BoneGeometry false
)
)
createdialog SelObj_roll width:100 height:80
|
cs |
필요에 따라 더미, 포인터, 스플라인 항목을 추가해서 사용할 수 있습니다.
오브젝트의 선택은 여기까지 하겠습니다.
다음에는 자식 노드 찾기에 대해서 이야기하겠습니다.
'맥스스크립트 심화' 카테고리의 다른 글
자식노드 선택(4) (2) | 2019.09.18 |
---|---|
자식노드 선택(3) (0) | 2019.09.17 |
자식노드 선택(2) (0) | 2019.09.16 |
자식노드 선택(1) (0) | 2019.09.15 |
오브젝트의 선택(2) (0) | 2019.09.13 |
오브젝트의 선택(1) (0) | 2019.09.12 |
오브젝트의 머지(7) (0) | 2019.09.11 |
오브젝트의 머지(6) (0) | 2019.09.10 |