맥스스크립트 심화

자식노드 선택(2)

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

안녕하세요.

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

지난번에 이어서  자식 노드를 선택하는 방법을 이어서 진행하겠습니다.

 

지난번 마지막에 중복되는 부분을 while문으로 정리한다고 했습니다.

다음과 같이 하겠습니다.

1. 선택한 노드를 기준으로 한다.

2. while문으로 반복하여 자식을 찾아낸다.

3 찾아낸 자식의 수가 0이 되면 while문을 종료한다.

4 선택한 노드와 while문으로 찾아낸 자식들을 선택한다.

 

먼저 '1. 선택한 노드를 기준으로 한다'를 위해 이전에 작업한 스크립트를 다음과 같이 줄였습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
selObj = $
childNode  = #()
nextChild = #()
 
append childNode selObj
 
if(childNode.count != 0) then
(
    for i = 1 to childNode.count do
    (
        for j = 1 to childNode[i].children.count do
        (
            append nextChild childNode[i].children[j]
            format "childNode[%].children[%] = %\n" i j childNode[i].children[j]
        )
    )
)
else childNodeFlag = false
 
cs

 

이전과는 다르게 선택한 노드의 자식을 바로 구하지 않고 childNode변수에 넣어서 childNode변수를 반복적으로 수정하는 형태로 수정했습니다.

14번 라인의 format문은 정상 작동하는지 확인 차원으로 들어간 것 이기 때문에 없어도 문제는 없습니다.

for문을 중복해서 사용한 이유는 childNode가 배열형이기 때문에 값이 하나 이상 들어갈 수 있으므로 각각의 노드와 그 노드의 자식을 반복하여 확인하기 위한 것입니다.

즉 childNode[1]의 자식 1,2,3  childNode[2]의 자식 1,2,3 ..... 이런 식으로 반복하기 위해서입니다.

지금 보면 우리가 선택한 노드와 찾아낸 자식 노드 모두 저장할 수 없음을 알 수 있습니다.

저장이 가능하도록 변수를 추가하여 수정하겠습니다.

 

3번 라인 밑에 selNode = #()를 추가하고

5번 라인 밑에 append selNode selObj를 추가하고

13번 라인 밑에 append selNode childNode[i].children[j]를 추가하고

16번 라인 밑에 childNode = nextChild를 추가합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
selObj = $
childNode  = #()
nextChild = #()
selNode = #()
 
append childNode selObj
append selNode selObj
 
if(childNode.count != 0) then
(
    for i = 1 to childNode.count do
    (
        for j = 1 to childNode[i].children.count do
        (
            append nextChild childNode[i].children[j]
            append selNode childNode[i].children[j]
            format "childNode[%].children[%] = %\n" i j childNode[i].children[j]
        )
    )
    childNode = nextChild
nextChild = #()
)
else childNodeFlag = false
 
cs

 

4번 라인의 변수 지정은 자식 노드를 찾아가는 도중에 거치는 노드를 차례로 저장하여 스크립트의 마지막에 모아놓은 노드를 선택하도록 하기 위해 만든 선택 용변수입니다.

7번 라인은 처음에 선택한 노드를 선택 용변수에 저장합니다.

16번 라인은 찾은 자식 노드를 나중에 선택할 수 있게 선택용 변수에 저장합니다.

20번 라인이 중요한데 단순에 변수에 값을 넣는 것이지만 그 의미는 찾은 자식을 기준 노드로 변경하여 새로운 자식 노드를 찾을 수 있도록 하는 내용입니다.

21번 라인은 nextChild변수에 append로 값을 넣기 때문에 이전의 값들이 계속 누적이 되어 잘못된 결과를 나타내기 때문에 for문이 끝날 때 새롭게 값을 받으려고 값을 디폴트로 변경해주는 것입니다.

 

이제 대충 구색은 갖춰졌습니다.

'2. while문으로 반복하여 자식을 찾아낸다.'와 '3 찾아낸 자식의 수가 0이 되면 while문을 종료한다.'를 넣겠습니다.

 

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
selObj = $
childNode  = #()
nextChild = #()
selNode = #()
childNodeFlag = true -- 추가내용
 
append childNode selObj
append selNode selObj
 
while(childNodeFlag == truedo -- 추가내용
-- 추가내용
    if keyboard.escPressed do exit -- 추가내용
        
    if(childNode.count != 0) then
    (
        for i = 1 to childNode.count do
        (
            for j = 1 to childNode[i].children.count do
            (
                append nextChild childNode[i].children[j]
                append selNode childNode[i].children[j]
                format "childNode[%].children[%] = %\n" i j childNode[i].children[j]
            )
        )
        childNode = nextChild
        nextChild = #()
    )
    else childNodeFlag = false
-- 추가내용
 
cs

 

5번 라인의 변수는 while문이 끝나는 것을 알려주는 불린 변수입니다.

10번, 11번, 29번 라인은 while문이 추가된 것이고 while문은 childNodeFlag 값이 true인 동안은 계속 반복합니다.

childNodeFlag 값이 false가 될 때는 더 이상 자식을 찾지 못해서 hildNode.count가 0인 경우입니다.

12번 라인은 혹시나 모를 while문의 무한 루프를 막기 위해 esc를 누르면 빠져나온다는 명령입니다.

이상태로 실행을 하고 selNode에 들어가 있는 내용을 확인해 보면 선택한 노드와 그 자식 노드 들로 잘 되어 있을 겁니다.

 

마지막으로 '4 선택한 노드와 while문으로 찾아낸 자식들을 선택한다.'를 추가합니다.

스크립트의 제일 아랫줄 밑에 'select selNode'를 추가합니다.

 

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
selObj = $
childNode  = #()
nextChild = #()
selNode = #()
childNodeFlag = true
 
append childNode selObj
append selNode selObj
 
while(childNodeFlag == truedo
(
    if keyboard.escPressed do exit
        
    if(childNode.count != 0) then
    (
        for i = 1 to childNode.count do
        (
            for j = 1 to childNode[i].children.count do
            (
                append nextChild childNode[i].children[j]
                append selNode childNode[i].children[j]
                format "childNode[%].children[%] = %\n" i j childNode[i].children[j]
            )
        )
        childNode = nextChild
        nextChild = #()
    )
    else childNodeFlag = false
)
 
select selNode
 
cs

 

 

잘 선택이 됐습니다.

 

오늘은 여기까지 내용을 확인하고, 다음 시간에는 두 개 이상의 노드를 시작으로 하는 것에 대해 알아보겠습니다.

 

728x90
반응형

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

슬롯머신(1)  (0) 2019.09.23
Selection Filter확장  (0) 2019.09.19
자식노드 선택(4)  (2) 2019.09.18
자식노드 선택(3)  (0) 2019.09.17
자식노드 선택(1)  (0) 2019.09.15
오브젝트의 선택(3)  (0) 2019.09.14
오브젝트의 선택(2)  (0) 2019.09.13
오브젝트의 선택(1)  (0) 2019.09.12