맥스스크립트 심화

오브젝트의 선택(3)

스크립팅하는애님 2019. 9. 14. 16:03
728x90
반응형

안녕하세요.

애니메이터가 들려주는 맥스 스크립트의 스크립팅하는 애님입니다.

지난번까지 작업된 스크립트는 작동은 잘하지만, 비슷한 내용이 중복되어 있습니다.

이 중복되는 부분을 사용자 정의 함수를 사용하여 줄여 보겠습니다.

사용자 정의 함수가 궁금하시면 '맥스스크립트 기초 > 함수(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

 

필요에 따라 더미, 포인터, 스플라인 항목을 추가해서 사용할 수 있습니다.

 

오브젝트의 선택은 여기까지 하겠습니다.

다음에는 자식 노드 찾기에 대해서 이야기하겠습니다.

728x90
반응형

'맥스스크립트 심화' 카테고리의 다른 글

자식노드 선택(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