맥스스크립트 심화

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

스크립팅하는애님 2021. 5. 3. 19:26
728x90
반응형

안녕하세요.

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

오늘은 지난 시간에 새롭게 찾은 문제를 해결하고 마무리 짓도록 하겠습니다.

1 '머지 파일 선택'을 하지 않고 '실행'버튼이 눌려지는 문제

2 현재 씬이 빈 상태에서 '실행(파일)'이 눌려져야 하는가?

3 소소하지만 '머지 파일 선택'후 파일 이름이 표기되는데 자꾸 잘리는 문제

 

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
47
48
49
50
51
52
53
54
55
fileName = ""
maxFiles = #()
 
fn merge_fn = 
(
    mergeMaxFile fileName #select quiet:true
    if(Merge_Rollout.choParent_edt.text != ""do $.parent = (execute ("$'" + Merge_Rollout.choParent_edt.text + "'"))
)
 
rollout Merge_Rollout "Merge"
(
    button selectMerge_btn "머지파일선택" pos:[55]
    label fileName_lab "FileName" style_sunkenedge:true height:15 width:155 pos:[530]
    edittext choParent_edt  "부모이름" fieldWidth:105 pos:[555]
    button run_btn "실행(파일)" pos:[590]
    button runFolder_btn "실행(폴더)" pos:[8090]
    
    on selectMerge_btn pressed do
    (
        fileName = getOpenFileName caption:"머지할파일선택:" filename:".max" types:"맥스파일(*.max)|*.max"
        if(fileName != undefined)do fileName_lab.caption = fileName
    )
    
    on run_btn pressed do
    (
        merge_fn()
    )
    
    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
                        if($'bip001' != undefined) do $'bip001'.transform.controller.figureMode = true
                        merge_fn()
                        if($'bip001' != undefined) do $'bip001'.transform.controller.figureMode = false
                        saveMaxFile maxFiles[i]    
                        resetMaxFile #noPrompt
                    )
                )
            )
        )
        else messagebox "열려 있는 파일을 닫아주세요."
    )    
)
createdialog Merge_Rollout 
cs

 

 

 

(지난 시간까지 작업한 내용)

 

새로 찾은 문제 1번 ''머지 파일 선택'을 하지 않고 '실행'을 눌렀을 때 발생하는 오류'를 해결하겠습니다.

여러 가지 방법이 있겠지만 '머지파일선택'을 해서 'FileName'에 파일명이 표기되기 전엔 '실행' 버튼을 막는 것으로 하겠습니다.

다음과 같이 수정하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.....
rollout Merge_Rollout "Merge"
(
    button selectMerge_btn "머지파일선택" pos:[5, 5]
    label fileName_lab "FileName" style_sunkenedge:true height:15 width:155 pos:[5, 30]
    edittext choParent_edt  "부모이름" fieldWidth:105 pos:[5, 55]
    button run_btn "실행(파일)" pos:[5, 90] enabled:false
    button runFolder_btn "실행(폴더)" pos:[80, 90] enabled:false
    
    on selectMerge_btn pressed do
    (
        fileName = getOpenFileName caption:"머지할파일선택:" filename:".max" types:"맥스파일(*.max)|*.max"
        if(fileName != undefined)do 
        (
            fileName_lab.caption = fileName
            run_btn.enabled = true
            runFolder_btn.enabled = true
        )
    )
.....
cs

 

7, 8번 라인의 'enabled:false'은 UI를 생성할 때 해당 UI를 비활성화하는 내용입니다.

이후 16, 17번 라인에서 변수 'fileName'에 값이 들어오면 '실행'버튼을 활성화시켜준다는 내용입니다.

 

이렇게 바뀝니다.

 

그다음으로 '2 현재 씬이 빈 상태에서 '실행(파일)'이 눌려져야 하는가?'입니다.

빈 파일에 다른 파일을 머지하는 것은 어떤 오류도 발생하지 않습니다.

하지만, 조금만 생각해도 빈 파일에 머지하지 말고 그냥 머지할 파일을 열면 동일한 결과를 볼 수 있기 때문에 이 문제는 해결을 해거나 말거나 큰 문제는 없습니다.

여기서는 '사람의 실수를 막는다.'는 생각으로 이러한 경우 메시지 박스를 띄워 막도록 하겠습니다.

 

1
2
3
4
5
6
7
8
on run_btn pressed do
(
    if(($* as array).count != 0) then
    (
        merge_fn()
    )
    else messagebox "현재 씬이 비어있습니다."
)
cs

 

씬 내에 있는 오브젝트의 수를 세어 0보다 클 경우에만 버튼을 누를 시 작동을 하고,

0과 같으면 메시지 박스를 띄우도록 하였습니다.

 

마지막으로 '3 소소하지만 '머지 파일 선택'후 파일 이름이 표기되는데 자꾸 잘리는 문제'는

표시를 두 줄 이상으로 하여 나타 낼 수 있는데 맥스 스크립트의 UI 기본 기능으로는 복수의 줄을 옵션으로 제공하는 것이 없었습니다.(제가 못 찾은 걸 수도 있고요. -_-;)

하려고 한다면 글자 수를 count 해서 몇 글자 이상은 다음 줄로 바꾸고 하는 기능을 만들면 되지만, 꽤나 귀찮습니다.

그래서 조금 더 쉬운 방법으로 접근하려고 합니다.

'tooltip'이라는 기능인데, 마우스가 해당 UI위에 올라가면 문자를 띄워주는 기능입니다.

'lable'에서는 파일의 이름만 표시하고 'tooltip'에서 패쓰를 표시하는 방식으로 하겠습니다.

다음과 같이 수정하여 봅시다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
.....
rollout Merge_Rollout "Merge"
(
    button selectMerge_btn "머지파일선택" pos:[5, 5]
    label fileName_lab "FileName" style_sunkenedge:true height:15 width:155 pos:[5, 30] tooltip:"FileName"
    .....
 
    on selectMerge_btn pressed do
    (        
        fileName = getOpenFileName caption:"머지할파일선택:" filename:".max" types:"맥스파일(*.max)|*.max"
        if(fileName != undefined)do 
        (
            fileName_lab.caption = (filenameFromPath  fileName)
            fileName_lab.tooltip = (getFilenamePath   fileName)
            run_btn.enabled = true
            runFolder_btn.enabled = true
        )
    )
 
.....
cs

 

저는 이상하게 툴팁이 아래쪽에 생기네요. 원래 않그랬던것 같은데...

 

5번 라인에 'tooltip'을 만들어 주고 내용은 'FileName'으로 'lable'의 'cpation'과 동일하게 해 줍니다.

13, 14번 라인에 'filenameFromPath  fileName'을 사용하여 파일 이름만, 'getFilenamePath   fileName'을 사용하여 패쓰만 사용하도록 합니다.

 

이제 어느 정도 정리가 된 것 같네요.

곰곰이 찾으려면 아직도 숨겨진 문제와 오류는 있을 것입니다.

혹은 자신의 작업 스타일 때문에 제가 이게 맞다고 생각한 것이 틀리다고 하실 수도 있습니다.

그런 부분을 조금씩 자신에게 맞도록 수정하신다면 더 좋은 스크립트를 만들 실수 있을 겁니다.

수고하셨습니다.

728x90
반응형