맥스스크립트 심화

오브젝트의 머지(4)

스크립팅하는애님 2019. 9. 8. 13:43
728x90
반응형

안녕하세요.

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

맥스 스크립트의 오브젝트 머지에 대해서 알아보겠습니다.

맥스를 혼자서 작업한다면 작업 방식이 정해져 있기 때문에 이전과 같이 여러 가지 상황을 생각하지 않고도 편하게 작업할 수 있습니다.

하지만 작업하는 사람이 여러 명이 되면 자신만의 작업 노하우가 있기 때문에 결과물이 같더라도 내용을 뜯어보면 여러 가지 차이가 있습니다.

그 차이점이 스크립트로 자동화할 때 문제를 발생시킵니다.

물론 작업공정에 규약을 두어 표준화할 수 있지만, 그래도 문제가 발상하는 것은 마찬 가지입니다.

작업물을 완벽하게 통제할 수 없다면 생각할 수 있는 문제를 스크립트에서 처리를 하는 수 밖에는 없습니다.

이전에 작업한 작업물에서 발생할 수 있는 문제점을 생각해서 해결해 봅시다.

지난번에 작업한 스크립트를 열어 둡시다.

 

1. 폴더를 선택하지 않았을 때

이것은 사실문제라고 할 수는 없고 폴터 선택 시 취소를 했을 때 어떤 동작을 할지를 정하는 것입니다.

이전 작업에서는 빈 공간으로 두었는데 입력하여 유저의 결정에 반응하도록 하겠습니다.

스크립트 하단의 'else (~' 부분에 내용을 입력하겠습니다.

다음과 같이 입력을 하고 실행을 하겠습니다.

 

30
messagebox"취소를 선택하셨습니다."
cs

 

 

위 다이얼로그 창이 떴을 때 '취소'또는 'X'버튼을 누르면

 

 

그러면 위와 같은 메시지 창이 나옵니다.

else를 사용하지 않고 그냥 종료를 할 수도 있지만 스크립트로 작업을 자동화하면 정상적으로 작동 중인지를 확인해야 하는 경우가 있기 때문에 알아두시면 좋은 기능입니다.

 

2. 폴더를 선택했지만 폴더 안에 원본 맥스 파일이 없을 경우

가끔 폴더를 잘못 선택을 하거나 할 경우가 있어 선택한 폴더에 머지당할 원본 맥스 파일이 없는 경우가 있습니다.

만약 선택한 폴더에 맥스파일이 없다면 어떻게 작업을 진행할지 알아보겠습니다.

 

기존에 작업한 스크립트의 5번 라인인

maxFiles = getFiles (pName + "\\*.max")

다음에 추가로 입력을 하고 실행을 해보겠습니다.

 

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
if(maxFiles.count > 0) then -- 추가부분
(
    format "%\n" maxFiles
    for i = 1 to maxFiles.count do
    (
        if(matchPattern maxFiles[i] pattern:"*머지할.max"  == false) do
        ( -- 추가부분
            loadmaxfile maxFiles[i] quiet:on
            $'bip001'.transform.controller.figureMode = true
            mergeMAXFile "D:\\test\\머지할.max" quiet:true
            $'Point Head'.parent = $'Bip001 Head'
            $'Point Spine3'.parent = $'Bip001 Spine3'
            $'Point L Hand'.parent = $'Bip001 L Hand'
            $'Point R Hand'.parent = $'Bip001 R Hand'
            $'Point L Pelvis'.parent = $'Bip001 Pelvis'
            $'Point R Pelvis'.parent = $'Bip001 Pelvis'
            $'bip001'.transform.controller.figureMode = false
            saveMaxFile (maxFilePath + maxFileName)
            resetMaxFile #noPrompt
        )
    )
)
else -- 추가 부분
(
    messagebox "맥스파일이 없습니다."
)
 
cs

 

6번 라인에 'if(maxFiles.count > 0) then'를 넣어서 getFiles로 찾아낸 맥스 파일의 숫자가 0보다 클 경우(1개라도 있다면) 기존에 작업했던 내용이 실행되게 했습니다.

28번 라인 이후에 맥스 파일의 숫자가 0일 경우 messagebox로 맥스 파일이 없다는 것을 알려줍니다.

 

3. 머지할.max파일이 폴더에 없을 경우

지금 폴더에서 머지할.max파일을 삭제하면 스크립트에서 파일을 찾을 수 없어 에러가 발생합니다.

doesFileExist <filename_string>라는 함수를 사용할 것인데 해당 파일이 있으면 true를 없으면 false를 반환합니다.

6번 라인의 if문에 이 doesFileExist를 사용하여 '머지할.max'파일이 존재하는지 확인하고 없으면 스크립트를 더 진행하지 않고 빠져나가게 하겠습니다.

 

6
if((maxFiles.count > 0)and(doesFileExist (pName + "\\머지할.max") == true)) then
cs

 

이렇게 수정한 뒤에 머지할.max파일이 없는 상태에서 실행하면

 

 

이렇게 결과창을 보여줍니다.

 

오늘까지의 스크립트는 다음과 같습니다.

다음시간에도 사용될 예정이니 저장해 두세요.

 

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
pName = getSavePath caption:"바뀔 파일" initialDir:"D:\\"
if(pName != undefined) then
(
    -- pName에 값이 입력된다면
    maxFiles = getFiles (pName + "\\*.max")
    if((maxFiles.count > 0)and(doesFileExist (pName + "\\머지할.max") == true)) then
    (
        format "%\n" maxFiles
        for i = 1 to maxFiles.count do
        (
            if(matchPattern maxFiles[i] pattern:"*머지할.max"  == false) do -- 추가부분
            ( -- 추가부분
                loadmaxfile maxFiles[i] quiet:on
                $'bip001'.transform.controller.figureMode = true
                mergeMAXFile "D:\\test\\머지할.max" quiet:true
                $'Point Head'.parent = $'Bip001 Head'
                $'Point Spine3'.parent = $'Bip001 Spine3'
                $'Point L Hand'.parent = $'Bip001 L Hand'
                $'Point R Hand'.parent = $'Bip001 R Hand'
                $'Point L Pelvis'.parent = $'Bip001 Pelvis'
                $'Point R Pelvis'.parent = $'Bip001 Pelvis'
                $'bip001'.transform.controller.figureMode = false -- 추가부분
                saveMaxFile (maxFilePath + maxFileName)
                resetMaxFile #noPrompt
            ) -- 추가부분
        )
    )
    else
    (
        messagebox "맥스파일이 없습니다."
    )
)
 
else
(
    -- pName에 값이 없다면
    messagebox "취소를 선택하셨습니다."
)
 
cs

 

 

아직 문제가 되는 부분이 있지만 내용이 길어지기 때문에 여기서 멈추려고 합니다.

다음 시간에도 이어서 문제에 대한 해결 방법을 적고, 그다음에 맥스 스크립트 UI를 사용하여 사용하기 편하게 수정해 보겠습니다.

728x90
반응형

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

오브젝트의 선택(2)  (0) 2019.09.13
오브젝트의 선택(1)  (0) 2019.09.12
오브젝트의 머지(7)  (0) 2019.09.11
오브젝트의 머지(6)  (0) 2019.09.10
오브젝트의 머지(5)  (0) 2019.09.09
오브젝트의 머지(3)  (0) 2019.09.07
오브젝트의 머지(2)  (0) 2019.09.06
오브젝트의 머지(1)  (0) 2019.09.05