맥스스크립트 심화

파일머지 편하게하기(6)

스크립팅하는애님 2021. 4. 29. 23:05
728x90
반응형

안녕하세요.

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

오늘은 머지 스크립트의 기능 구현보다는 오류를 막기 위한 방법에 대해서 이야기하겠습니다.

 

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
38
39
40
41
42
43
44
45
46
fileName = ""
maxFiles = #()
 
rollout Merge_Rollout "Merge"
(
    button selectMerge_btn "머지파일선택" pos:[5, 5]
    label fileName_lab "FileName" style_sunkenedge:true height:15 width:155 pos:[5, 30]
    button run_btn "실행(파일)" pos:[5, 60]
    button runFolder_btn "실행(폴더)" pos:[80, 60]
    
    on selectMerge_btn pressed do
    (
        fileName = getOpenFileName caption:"머지할파일선택:" filename:".max" types:"맥스파일(*.max)|*.max"
        fileName_lab.caption = fileName
    )
    
    on run_btn pressed do
    (
        mergeMaxFile fileName #select quiet:true
        $.parent = $'Bip001 R Hand'
    )
    
    on runFolder_btn pressed do
    (
        if((($* as array).count == 0)and(maxFileName == "")) then
        (
            getFolder = getSavePath caption:"머지될 폴더 선택"
            maxFiles = getFiles (getFolder + "\\*.max")
            for i = 1 to maxFiles.count do
            (            
                if(fileName != maxFiles[i]) do
                (
                    loadmaxfile maxFiles[i] quiet:on
                    $'bip001'.transform.controller.figureMode = true
                    mergeMaxFile fileName #select quiet:true
                    $.parent = $'Bip001 R Hand'
                    $'bip001'.transform.controller.figureMode = false
                    saveMaxFile maxFiles[i]    
                    resetMaxFile #noPrompt
                )
            )
        )
        else messagebox "열려 있는 파일을 닫아주세요."
    )
)
createdialog Merge_Rollout 
cs

 

 

위 내용은 지금까지 작업한 것입니다.

 

우리가 해결해야 하는 내용은 아래와 같습니다.

1 꼭 오른손에만 마운트를 하는가?

2 파일이나 폴더를 선택하지 않고 취소를 하면 에러가 발생한다

3 '머지할' 파일 중 바이패드가 없는 녀석이 끼어 있다면?

 

우선 1번 문제를 해결해 보겠습니다.

지금은 스크립트로 오른손에 링크되도록 했는데, 이것을 UI를 이용하여 외부에서 조정하도록 하겠습니다.

다음 내용을 원본 스크립트의 7번 라인 밑에 적어줍니다.

 

1
edittext choParent_edt  "부모이름" fieldWidth:105 pos:[5, 55]
cs

 

 

 

이렇게 머지 시 부모가 되는 노드의 이름을 입력하는 UI가 생겼습니다.

'pickButton'을 사용하여 더 직관적으로 할 수 있지만 폴더 머지의 경우 씬이 비어 있기 때문에 사용을 할 수 없어 'edittext'를 사용합니다.

이렇게 하고 머지시 링크를 거는 명령어 부분을 수정하도록 하겠습니다.

찾아보니 같은 명령이 두 개가 있네요.

두 개니까 일일이 수정해 주는 것도 문제가 없지만 이것을 사용자 정의 함수로 빼주겠습니다.

동일한 명령들이 여러 곳에서 동시에 사용된다면, 수정할 때마다 일일이 찾아 수정하기 번거롭기 때문에

사용자 정의 함수로 빼주는 것이 편리합니다.

원본 스크립트의 변수 선언 부분 아래 다음과 같이 입려

 

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
38
39
40
41
fileName = ""
maxFiles = #()
 
fn merge_fn =
(
    mergeMaxFile fileName #select quiet:true
    $.parent = $'Bip001 R Hand'
)
 
rollout Merge_Rollout "Merge"
(
    .....
 
     on run_btn pressed do
    (
        merge_fn()
    )
    
    on runFolder_btn pressed do
    (
        if((($* as array).count == 0)and(maxFileName == "")) then
        (
            getFolder = getSavePath caption:"머지될 폴더 선택"
            maxFiles = getFiles (getFolder + "\\*.max")
            for i = 1 to maxFiles.count do
            (            
                if(fileName != maxFiles[i]) do
                (
                    loadmaxfile maxFiles[i] quiet:on
                    $'bip001'.transform.controller.figureMode = true
                    merge_fn()
                    $'bip001'.transform.controller.figureMode = false
                    saveMaxFile maxFiles[i]    
                    resetMaxFile #noPrompt
                )
            )
        )
        else messagebox "열려 있는 파일을 닫아주세요."
    )    
)
createdialog Merge_Rollout 
cs

 

4번 라인에 사용자 정의 함수를 선언하고

이전에 머지용 내용을 적었습니다.

이것을 16번 과 31번 라인에서 사용하고 있습니다.

 

여기에 아까 이야기하다만 'edittext'의 문자열을 링크에 사용하도록 수정하겠습니다.

사용자 정의 함수를 다음과 같이 수정하면 됩니다.

 

1
2
3
4
5
fn merge_fn = choParent_edt
(
    mergeMaxFile fileName #select quiet:true
    $.parent = (execute ("$'" + choParent_edt.text + "'"))
)
cs

 

4번 라인의 내용은

'choParent_edt'의 'text'를 오브젝트를 표기하는 방식으로 문자열을 조합한 후

이것을 문자열에서 실제 오브젝트로 사용될 수 있도록 하는  명령어를 추가했습니다.

 

이제 2번 문제를 해결하겠습니다.

우선 'on selectMerge_btn pressed do'이벤트 핸들러의 내용을 수정하겠습니다.

'getOpenFileName'은 대화창이 열렸을 때 취소로 해도 그 자체는 문제가 되지 않지만,

' fileName_lab.caption = fileName'에서 'fileName'값이 없기(undefined) 때문에 에러가 발생합니다.

'if'문을 사용하여 조건을 걸어 주겠습니다.

 

1
2
3
4
5
on selectMerge_btn pressed do
(
    fileName = getOpenFileName caption:"머지할파일선택:" filename:".max" types:"맥스파일(*.max)|*.max"
    if(fileName != undefined)do fileName_lab.caption = fileName
)
cs

 

'if'문을 이용하여 'fileName'값이 없는 것이 아닐 경우에만 'fileName_lab'에 표기하도록 하였습니다.

 

다음으로는 'on runFolder_btn pressed do'이벤트의 'getSavePath'명령어 입니다.

이것도 위와 동일한 이유로 에러가 발생하므로 'if'문으로 해결하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
on runFolder_btn pressed do
(
    if((($* as array).count == 0)and(maxFileName == "")) then
    (
        getFolder = getSavePath caption:"머지될 폴더 선택"
        if(getFolder != undefined) do
        (
            maxFiles = getFiles (getFolder + "\\*.max")
            for i = 1 to maxFiles.count do
            (            
                if(fileName != maxFiles[i]) do
                (
                    loadmaxfile maxFiles[i] quiet:on
                    $'bip001'.transform.controller.figureMode = true
                    merge_fn()
                    $'bip001'.transform.controller.figureMode = false
                    saveMaxFile maxFiles[i]    
                    resetMaxFile #noPrompt
                )
            )
        )
    )
    else messagebox "열려 있는 파일을 닫아주세요."
)
cs

 

위와 같은 내용이므로 생략하겠습니다.

 

이제 내용이 슬슬 길어지므로 3번째 문제는 다음 시간에 해결하도록 하겠습니다.

수고하셨습니다.

728x90
반응형