맥스스크립트 심화

오브젝트의 선택(1)

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

안녕하세요.

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

지난 시간에 오브젝트의 머지에 대해서 이야기를 했는데요.

처음 생각했을때는 간단하겠다고 생각했는데 실제로 이야기를 풀어 보니 상당히 길고 조금은 복잡한 했습니다.

그래서 오늘은 조금더 간단한 내용에 대해서 이야기하겠습니다.

맥스 뷰포트에 여러 가지 오브젝트들이 있을 때 각 오브젝트의 종류에 따라 선택을 따로 하고 싶은 경우가 있습니다.

물론 맥스에도 'selection Filter'가 있기는 하지만 그것보다 더 강력한 툴이 있으면 편하겠지요.

 

 

뷰포트에 박스와 본을 생성하고 다음과 같이 스크립트를 넣고 실행해 봅시다.

 

 

아!! 실행하기 전에 모든 오브젝트를 선택하고 실행해 주세요.

 

1
2
3
4
5
6
7
8
selObjs = $* as array
choObjs = #()
 
for i = 1 to selObjs.count do
(
    if(classof selObjs[i] == BoneGeometry) do append choObjs  selObjs[i]
)
select choObjs
 
cs

 

 

본만 선택이 됐습니다.

 

if문안의 BoneGeometry를 Box로 변경하여 실행해 봅시다.

 

박스만 선택 됐습니다.

 

스크립트의 내용을 살펴볼까요?

selObjs =  $* as array는 모든 오브젝트를 변수에 배열로 저장을 합니다.

for문을 이용해서 selObjs를 하나씩 불러옵니다.

if문에서 classof 함수로 선택한 오브젝트의 클래스를 확인하여 원하는 클래스면, choObjs에 넣어 줍니다.

 

자 대충 오브젝트를 선택하는 기본 틀을 확인했습니다.

UI를 이용해서 더욱 유용하게 바꿔 볼까요?

우선 UI의 틀을 만들어 봅시다.

 

1
2
3
4
5
6
7
8
9
10
11
selObjs = $* as array
choObjs = #()
 
try(destroydialog SelObj_roll) catch()
 
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]
)
createdialog SelObj_roll width:100 height:80
cs

 

 

UI를 만드는 방법을 모르시면 '맥스 스크립트 기본'의 UI 부분을 읽어 보세요.

(체크 버튼 말고 체크박스를 사용해도 무방하고, edittext를 이용하여 text로 입력받아 수정하여 사용해도 좋습니다. )

지금은 작동하지 않는 다이얼로그인데 작동하게 해 줘야겠네요.

다음과 같이 9번 라인 밑에 입력하고 실행해 봅시다.

 

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
35
36
37
selObjs = $* as array
choObjs = #()
 
try(destroydialog SelObj_roll) catch()
 
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) do
        (
            choObjs = #()
            for i = 1 to selObjs.count do
            (
                if(classof selObjs[i] == Box) do append choObjs  selObjs[i]
            )
            selectMore choObjs
        )
    )
    
    on bone_chb changed state do
    (
        if (state == true) do
        (
            choObjs = #()
            for i = 1 to selObjs.count do
            (
                if(classof selObjs[i] == BoneGeometry) do append choObjs  selObjs[i]
            )
            selectMore choObjs
        )
    )
)
createdialog SelObj_roll width:100 height:80
cs

 

이상태에서 실행해 보시면 간단하게 박스와 본 오브젝트를 선택하는 게 가능해집니다.

그런데 뭔가 어색하게 선택이 됩니다.

수정 부분은 다음에 이야기하고 우선 어떤 원리로 작동하는지 확인해 보겠습니다.

if (state == true) then는 체크 버튼이 눌렸을 때입니다.

choObjs = #()는 변수를 초기화하는 것으로 이후에 append로 추가된 변수를 다시 실행할 때 이전에 입력된 값을 지우는 것입니다.

중간의 내용은 위에 설명했기 때문에 넘어가겠습니다.

selectMore는 현재 선택된 것을 초기화하지 않고 추가해서 선택하게 합니다.

이것은 박스와 본을 둘 다 눌렀을 때 모두 선택하게 하기 위함입니다.

 

오늘은 여기까지 이야기하겠습니다.

다음번에는 어색하게 선택되는 것을 수정하도록 하겠습니다.

728x90
반응형

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

자식노드 선택(2)  (0) 2019.09.16
자식노드 선택(1)  (0) 2019.09.15
오브젝트의 선택(3)  (0) 2019.09.14
오브젝트의 선택(2)  (0) 2019.09.13
오브젝트의 머지(7)  (0) 2019.09.11
오브젝트의 머지(6)  (0) 2019.09.10
오브젝트의 머지(5)  (0) 2019.09.09
오브젝트의 머지(4)  (0) 2019.09.08