맥스스크립트 심화

오브젝트의 머지(3)

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

안녕하세요.

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

지난번에 이어 오늘도 머지를 하는 방법에 대해서 이야기하려고 합니다.

오늘은 지난번에 한 내용을 수정해서 배치로 실행하는 것을 하려고 합니다.

한마디로 조건만 맞는다면 실행 한번으로 자동으로 마무으리 하는 것입니다. ㅎㅎ

 

새로운 빈 스크립트 파일을 하나 열겠습니다.

그리고 맥스파일은 열지 말아 주세요.

맥스 파일을 불러 오는것도 모두 자동화하려고 하니까요.

그리고 지금부터 하는 작업의 전제 조건은 모든 파일이 하나의 폴더 안에 존재한다는 것입니다.

작업을 하다가 보면 수정해야 할 파일들이 여러 폴더에 나뉘어지는 경우도 있지만, 그런 것들을 하나의 폴더에 넣는 것은 그다지 어려운 일은 아니니까 수작업으로 하는 게 편합니다.(스크립트 짤 시간보다 더 빨리 옮길 수 있으니까요.)

 

스크립트 작업으로 우선 해야 할것은 어느 폴더에 있는 맥스 파일들을 수정할 것인지 결정하는 것입니다.

이전에 배웠던 getSavePath함수가 적당합니다.

다음과 같이 적고 실행해 봅시다.

 

1
pName = getSavePath caption:"바뀔 파일" initialDir:"D:\\"
cs

 

 

getSavePath함수는 폴더를 찾아 그 폴더의 Path를 문자열로 저장하는 기능을 합니다.

initialDir:"D:\\"로 했기 때문에 시작 시 먼저 D드라이브를 선택합니다.

하지만 지금 상태에서는 '확인', '취소'를 해도 별다른 반응이 없습니다.

그럼 확인이 눌렸을 때 반응을 하도록 스크립트를 계속 짜 봅시다.

다음과 같이 계속 입력해 봅시다.

 

2
3
4
5
6
7
8
9
10
if(pName != undefined) then
(
    -- pName에 값이 입력된다면
)
 
else
(
    -- pName에 값이 없다면
)
cs

 

pName은 폴더의 Path를 저장하는 변수입니다.

제대로 폴더를 지정하면 주소가 문자열로 저장되고 '취소'를 하면 undefined값을 가지고 있습니다.

이 if~else문은 폴더를 선택했을 때와 취소했을 때를 구분 짓는 문장입니다.

4번 라인 다음에 입력을 합시다.

 

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

 

위 내용은 getFiles 함수를 사용하여 pName폴더에서 확장자가 max인 파일을 모두 찾아내어 maxFiles변수에 입력하는 것입니다.

maxFiles변수는 배열 형태의 문자열입니다.

뭔 소린지 궁금하면 확인해보면 됩니다.

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

 

2
format "%\n" maxFiles
cs

 

 

저는 미리 준비해둔 파일이 있는 D드라이브의 test폴더를 선택합니다.

 

 

D드라이브 test폴덜의 맥스 파일의 Path와 Name이 합쳐져 배열 형식으로 저장되어 있습니다.

위 format문은 확인을 위해 만든 것이기 때문에 나중에는 삭제하셔도 상관없습니다.

파일 이름이 잘 저장된 것 같으니 각각의 파일을 열고 닫는 작업을 스크립트로 넣겠습니다.

이어서 다음과 같이 작성해봅시다.

 

7
8
9
10
11
for i = 1 to maxFiles.count do
(
    loadmaxfile maxFiles[i] quiet:on
    resetMaxFile #noPrompt
)
 
cs

 

이것은 for문을 이용하여 저장한 맥스 파일을 하씩 열은 후에 다시 닫는 내용입니다.

실행을 해보시면 맥스의 뷰포트가 깜빡거리는 것을 볼 수 있습니다.

이것은 맥스파일을 열자마자 닫아 버리기 때문에 그런 것입니다.

하지만 우리가 원하는 것은 열자마자 닫는 게 아니라, 그사이에 머지하고 링크를 걸고 저장도 하고 하는 것을 원하는 것입니다.

9번과 10번 라인 사이에 이전에 작업했는 내용을 복사해 붙입시다.

 

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
pName = getSavePath caption:"바뀔 파일" initialDir:"D:\\"
if(pName != undefined) then
(
    -- pName에 값이 입력된다면
    maxFiles = getFiles (pName + "\\*.max")
    format "%\n" maxFiles
    for i = 1 to maxFiles.count 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'
        saveMaxFile (maxFilePath + maxFileName)
        resetMaxFile #noPrompt
    )
)
 
else
(
    -- pName에 값이 없다면
)
 
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
pName = getSavePath caption:"바뀔 파일" initialDir:"D:\\"
if(pName != undefined) then
(
    -- pName에 값이 입력된다면
    maxFiles = getFiles (pName + "\\*.max")
    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
(
    -- pName에 값이 없다면
)
 
cs

 

 

9번 라인의 내용은 파일의 이름을 확인하여 이름에 '머지할.max'라는 문자열이 없으면 파일을 열고 머지 작업을 진행하라는 의미입니다.
20번 라인은 저번 시간에 깜빡하고 못 넣은 것인데 피겨 모드의 바이 패드를 다시 포즈 모드로 변경하는 것입니다.
위와 같이 작성하면 실행해도 별 문제는 없을 것입니다.
정상적인 형태의 맥스 파일이라면요. ㅎㅎ (비정상적인 맥스 파일은 무궁무진하답니다.)

다음에는 대표적인 비정상적인 맥스 파일과 else 부분 그리고 생각할 수 있는 애러가 발생할 수 있는 것들을 막는 것에 대해 이야기해 보겠습니다.
스크립트 파일은 다임 시간에도 쓰이니 저장해두세요.

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
오브젝트의 머지(4)  (0) 2019.09.08
오브젝트의 머지(2)  (0) 2019.09.06
오브젝트의 머지(1)  (0) 2019.09.05