반응형

제작한 스크립트를 메뉴에 등록하지 않으면 실 작업자들이 실제로 사용하는데 많은 제약이 따릅니다.

그런 문제가 없기 위해 제작한 스크립트는 반드시 메뉴에 등록을 해줘야하는데, 그 방법에 대한 가이드입니다.



맥스 스크립트 메뉴 등록 가이드

1. 맥스 스크립트 상단메뉴에 들어가려면 반드시 메크로 스크립트로 등록된 스크립트만 사용이 가능 합니다.

  • 현재 사내 매크로 스크립트는 맥스 설치폴더\\MacroSciprs\\Nlabs 폴더에 모여 있습니다.

  • 스크립트는 MacroScript 폴더에 모여있는 매크로 스크립트와 Script 폴더에 모여있는 보통 스크립트로 나뉘어 집니다..

  • 두 개의 차이점 : 

            (1) 매크로는 간단하게 실행가능한 원클릭 스크립트에 대부분 사용된다.  매크로는 맥스가 실행될께 함께 실행 되기 때문에 덩치가 커서는 안됩니다.

            (2) 일반 스크립트는 시퀀스 매니저나 애니메이션 라이브러리 같이 덩치가 큰 스크립트에 사용된다.

                내가 실행을 해야만 작동하기때문에 덩치가 커도 무리가 없습니다.

 

 

2.  매크로 스크립트를 만들기

- 현재 사내에 사용중인 매크로 스크립트들은 메뉴 등록에만 사용되고, 실제 만들어진 덩치큰 스크립트를 실행해주는 교두보 역할을 해주고 있습니다.

- 예) SequenceManeger가 메뉴에 등록될때는 매크로가 사용되고, 메뉴 버튼을 누르는 순간 실제 스크립트가 실행됩니다.

 

**사내에서 사용중인 본 메이커의 실행 매크로 스크립트

macroScript BoneMaker       --> 매크로 등록
category:"Nlabs"                    --> 카테고리 등록
buttonText:"Bone Maker"        --> 메뉴 버튼 이름 등록
tooltip:"Bone Maker"            --> 툴팁 등록
(
 on execute do
 (
   include "Nlabs/BoneMaker.ms"  --> 매크로 스크립트에 실제 스크립트가 실행되도록 연결해 줍니다.
  )
)



 

 

3. 위 매크로 스크립트를 메뉴에 등록시키기 위한 코드

- 아래 코드를 만든 후 Scripts\\Startup 폴더에 저장하시면 맥스가 실행될때 항상 메뉴가 나오게 됩니다.

스타트업에 들어간 스크립트는 맥스가 실행될때 항상 같이 실행되오니 꼭 필요한 것들만 넣어야 합니다.

 

--------------------------------------------------------------------------------------------------------

-- MainMenuClass

--------------------------------------------------------------------------------------------------------

struct MainMenuClass

(

 --------------------------------------------------------------------

 -- FindMenu

 --------------------------------------------------------------------

 fn FindMenu menuName = 

 (

             local menu = menuMan.findMenu menuName -- 없으면 undefined

             return menu

 ),

 

 --------------------------------------------------------------------

 -- AddMenu

 --------------------------------------------------------------------

 fn AddMenu menuName =

 (

             local newMenu

            

             -- 중복 추가 방지 --

             if FindMenu menuName != undefined then

              return undefined

            

             -- Menu 추가 --

             newMenu   = menuMan.createMenu menuName

             mainMenu  = menuMan.getMainMenuBar()

             subMenuItem = menuMan.createSubMenuItem menuName newMenu

             subMenuIndex = mainMenu.numItems() + 1

             mainMenu.addItem subMenuItem subMenuIndex

            

             return newMenu

 ),

 

 --------------------------------------------------------------------

 -- AddItem

 --------------------------------------------------------------------

 fn AddItem menuName item =

 (

             local newIndex

            

             menu = FindMenu menuName

            

             -- Menu가 없으면 패스 --

             if menu == undefined then

              return undefined

            

             newIndex = menu.numItems() + 1

             menu.addItem item newIndex

            

             return newItem

 ),

 

 --------------------------------------------------------------------

 -- RemoveMenu

 --------------------------------------------------------------------

 fn RemoveMenu menuName =

 (

             menu = menuMan.findMenu menuName

            

             if menu != undefined do

              menuMan.unRegisterMenu menu

            

             return ok

 ), 

 

 --------------------------------------------------------------------

 -- UpdateMenuBar

 --------------------------------------------------------------------

 fn UpdateMenuBar =

 (

             menuMan.updateMenuBar()

            

             return ok

 ), 

 

 --------------------------------------------------------------------

 -- CreateActionItem

 --------------------------------------------------------------------

 fn CreateActionItem macroScriptName categoryName =

 (

  local actionItem

 

  actionItem = menuMan.createActionItem macroScriptName categoryName

 

  return actionItem

 )

)

          

(

           menuName    = "Test"

           macroScriptName = "TestItem"

           categoryName   = "Nlabs"

 

           MainMenu = MainMenuClass()

 

           -- menu 만들기 --

           MainMenu.AddMenu menuName

 

           -- Item 만들기 --

           item = MainMenu.CreateActionItem  macroScriptName categoryName

 

           -- menu Item 등록 하기 --

           MainMenu.AddItem menuName item 

 

           -- 화면 갱신 하기 --

           MainMenu.UpdateMenuBar()

)



위 코드를 실행하면 아래 처럼 맥스 메인 메뉴에 원하는 스크립트가 등록이 됩니다.

 


위 상태에서 BoneMaker를 실행하시면 본 메이커 스크립트가 실행됩니다.

 

출처 - ​ http://hwanggoon.tistory.com/212

반응형
반응형

회사에서 맥스 스크립트를 많이 쓰게 되면서 스크립트 관리포인트가 상당히 많이 생겼습니다.

그러다보니 여기저기 버그도 발생하고, 누가 쓰고 있는지 알기도 힘들고, 업데이트 마다 mzp 파일 배포하는 것도 피곤하고..

그래서 SVN이 도입되어 사용되어 왔습니다. 제 선임이 멋지게 구축해 놓은걸 저는 인계받아 쓰고 있는데요

맥스 스크립트에서 SVN에 접근하는 방식에 대한 내용 정리입니다.

출처 -  http://hwanggoon.tistory.com/109

 

 

1. SVN Command Line 설치하기 

다운로드 경로 : http://tortoisesvn.net/downloads.html 

SVN 설치시에는 반드시 Comand 라인을 설치해 줘야만 맥스 설치폴더에서 접근할 수 있게 됩니다.

Command Line 이란? Dos 명령어를 사용해 Svn을 작동 시켜주는 방법입니다.

맥스도 Dos 명령어를 사용할 수 있기 때문에 Command Line을 설치함으로SVN을 맥스에서도 쓸 수 있게 됩니다.

 

 

2. 맥스에서 SVN 사용하기 

1) HiddenDOSCommand 

Dos 명령어를 사용하는 방법은 HiddenDOSCommand 함수를 사용하는 것이 일반적 입니다.

Dos 창이 보이지 않지만 Dos 명령어는 실행 되니깐 즐겨 사용 하는 방법 입니다.

그런데 HiddenDOSCommand는 기능 상 한계가 있는데요.

Log같은 정보를 받을 수 없습니다.

(return 되는 exitCode는 성공, 실패 같은 간단한 정보만을 보여줍니다.)

 

 

2) dotNet Process 

위와 같은 경우는 dotNet을 사용하면 해결 할 수 있습니다.

 

<예제 코드>

commandString = "info \"" + thePath + "\"" -- SVN 파일 경로

-- StartInfo -------------------------------------

 dno_ProcessStartInfo = dotNetObject "System.Diagnostics.ProcessStartInfo"
 dno_ProcessStartInfo.CreateNoWindow = true
 dno_ProcessStartInfo.UseShellExecute = false
 dno_ProcessStartInfo.RedirectStandardOutput = true
 dno_ProcessStartInfo.FileName = "svn"
 dno_ProcessStartInfo.Arguments = commandString
 ------------------------------------------------
 -- Process 적용 --------------------------------
 dnc_Process = dotNetClass "System.Diagnostics.Process"
 process = dnc_Process.Start dno_ProcessStartInfo
 process.WaitForExit()

------------------------------------------------

infoLine = process.StandardOutput.ReadLine()

-- infoLine : svn info 정보를 String으로 받아 볼 수 있음

 

dotNet Process를 사용해서 Dos 명령어를 실행 하는 방법입니다.

WaitForExit는 써주는 것이 좋은데요.

이걸 하지 않으면, Process가 끝나기 전에 MaxScript코드가 실행됩니다.

오류가 날 확률이 있으니 미리미리 방지해 봅니다.

 

 

 

3. User Name 찾기 

 

캐싱파일 분석하기 

SVN을 MaxScript로 만들다 보면 사용자 이름이 필요한 경우가 발생하는데요.

(사용자 정보를 수집할 때 필요하죠.)

SVN 명령어로 사용자 이름을 알 수는 없을 겁니다.

이럴 경우 캐싱 된 SVN파일을 열어 분석해줘야 하는데요.

 

SVN 사용자 정보

경로 : C:\Users\HwangGoon(개인마다 다름)\AppData\Roaming\Subversion\auth\svn.simple

안에 GUI로 되어 있는 파일이 있습니다.

이 파일을 텍스트 편집기에서 열어보면

다음과 같이 나오게 됩니다.

 

K 8
passtype
V 8
wincrypt
K 8
password
V 372
AQAAANCMnd8BFdERjHoAwE/ClK 15+.....
svn:realmstring
V 40
<http://100.100.100.100:80> VisualSVN Server
K 8
username
V 9
hwanggoon
END


 

svn:realmstring 값이 내가 사용하는 Url과 같은지 비교하는 것이 우선이 되겠죠.

(SVN을 2개 이상 사용하는 경우도 많기 때문에)

username 하위에 보시면 hwanggoon이 SVN username입니다.

 - K 8과 같은 코드는 무시하는 것이 좋습니다. 사용자마다 같다는 보장을 할 수 없어요.

 

  

3. SVN 설치 유무 알아내기 

1) TortoiseSVN 설치 알아내기 

특정 프로그램이 설치되어 있는지 확인하는 방법은 윈도우 레지스트리에서 찾을 수 있는데요. 

예제 코드를 보겠습니다.

dnc_Registry = dotNetClass "Microsoft.Win32.Registry"
registryKey = dnc_Registry.LocalMachine.OpenSubKey "SOFTWARE\\TortoiseSVN"

 

위와 같이 찾으면 TortoiseSVN이 설치 되어 있지 않다면 registryKey값은 undefined로 나오게 됩니다.

 

2) Command Line SVN 설치 알아내기 

TortoiseSVN이 설치되어 있어야 Command Line이 있을 수 있겠죠.

그렇다면 위에서 찾은 registryKey를 가지고 한번 더 하위를 찾아 봅니다.

 

dir = registryKey.GetValue "Directory"
svnFile = dir + "bin\svn.exe"

 

이제 svnFile이 있는지 여부만 판단하면 Command Line 설치를 확인이 가능해 지겠죠.

반응형
반응형

스크립트를 만들때 이름으로 서치하는 것은 매우 안좋은 습관이다.

하지만, 바이패드는 이름으로 서치하지 않으면 해당 오브젝트를 찾기 힘들다.

그래서 Script 헬프를 뒤져보니 바이패드의 고유 Node 넘버가 있는것을 확인했다.


biped.getNode $ #lArm link:4  라고 실행하면 아래 표에 따라 L Hand가 호출된다.


Index Limb Name Link Nodes in Link Index Order      
1 #larm L Clavicle L UpperArm L Forearm L Hand
2 #rarm R Clavicle R UpperArm R Forearm R Hand
3 #lfingers L Finger0 L Finger01 L Finger02 L Finger1
    L Finger11 L Finger12 L Finger2 L Finger21
    L Finger22 L Finger3 L Finger31 L Finger32
    L Finger4 L Finger41 L Finger42  
4 #rfingers R Finger0 R Finger01 R Finger02 R Finger1
    R Finger11 R Finger12 R Finger2 R Finger21
    R Finger22 R Finger3 R Finger31 R Finger32
    R Finger4 R Finger41 R Finger42  
5 #lleg L Thigh L Calf L HorseLink L Foot
6 #rleg R Thigh R Calf R HorseLink R Foot
7 #ltoes L Toe0 L Toe01 L Toe02 L Toe1
    L Toe11 L Toe12 L Toe2 L Toe21
    L Toe22 L Toe3 L Toe31 L Toe32
    L Toe4 L Toe41 L Toe42  
8 #rtoes R Toe0 R Toe01 R Toe02 R Toe1
    R Toe11 R Toe12 R Toe2 R Toe21
    R Toe22 R Toe3 R Toe31 R Toe32
    R Toe4 R Toe41 R Toe42  
9 #spine Spine Spine1 Spine2 Spine3
    Spine4      
10 #tail Tail Tail1 Tail2 Tail3
    Tail4      
11 #head Head      
12 #pelvis Pelvis      
13 #vertical Biped COM      
14 #horizontal Biped COM      
15 #turn Biped COM      
16 #footprints Footsteps      
17 #neck Neck Neck1 Neck2 Neck3
    Neck4      
18 #pony1 Ponytail1 Ponytail11 Ponytail12 Ponytail13
    Ponytail14      
19 #pony2 Ponytail2 Ponytail21 Ponytail22 Ponytail23
    Ponytail24      
20 #prop1 Prop1      
21 #prop2 Prop2      
22 #prop3 Prop3      
101 #lfArmTwist L ForeTwist L ForeTwist1 L ForeTwist2 L ForeTwist3
    L ForeTwist4 L ForeTwist5 L ForeTwist6 L ForeTwist7
    L ForeTwist8 L ForeTwist9    
102 #rfArmTwist R ForeTwist R ForeTwist1 R ForeTwist2 R ForeTwist3
    R ForeTwist4 R ForeTwist5 R ForeTwist6 R ForeTwist7
    R ForeTwist8 R ForeTwist9    
103 #lUparmTwist L UpTwist L UpTwist1 L UpTwist2 L UpTwist3
    L UpTwist4 L UpTwist5 L UpTwist6 L UpTwist7
    L UpTwist8 L UpTwist9    
104 #rUparmTwist R UpTwist R UpTwist1 R UpTwist2 R UpTwist3
    R UpTwist4 R UpTwist5 R UpTwist6 R UpTwist7
    R UpTwist8 R UpTwist9    
105 #lThighTwist L ThighTwist L ThighTwist1 L ThighTwist2 L ThighTwist3
    L ThighTwist4 L ThighTwist5 L ThighTwist6 L ThighTwist7
    L ThighTwist8 L ThighTwist9    
106 #rThighTwist R ThighTwist R ThighTwist1 R ThighTwist2 R ThighTwist3
    R ThighTwist4 R ThighTwist5 R ThighTwist6 R ThighTwist7
    R ThighTwist8 R ThighTwist9    
107 #lCalfTwist L CalfTwist L CalfTwist1 L CalfTwist2 L CalfTwist3
    L CalfTwist4 L CalfTwist5 L CalfTwist6 L CalfTwist7
    L CalfTwist8 L CalfTwist9    
108 #rCalfTwist R CalfTwist R CalfTwist1 R CalfTwist2 R CalfTwist3
    R CalfTwist4 R CalfTwist5 R CalfTwist6 R CalfTwist7
    R CalfTwist8 R CalfTwist9    
109 #lHorseTwist L HorseTwist L HorseTwist1 L HorseTwist2 L HorseTwist3
    L HorseTwist4 L HorseTwist5 L HorseTwist6 L HorseTwist7
    L HorseTwist8 L HorseTwist9    
110 #rHorseTwist R HorseTwist R HorseTwist1 R HorseTwist2 R HorseTwist3
    R HorseTwist4 R HorseTwist5 R HorseTwist6 R HorseTwist7
    RHorseTwist8 R HorseTwist9    

 

반응형
반응형

최근 다관절 셋팅을 하면서 컨트롤러 셋팅을 많이 하게 되는데, 맥스의 컨트롤러 뷰어는 불편한 점이 많아서 서포트 툴을 하나 제작하게 됐습니다.

특히 LookAtConstraint나 Orientation Controller같이 다른 헬퍼 본과 연계되서 사용할 경우 연계된 본이 어떤건지 구분하기도 힘들고 선택하기도 힘들어 자주쓰는 노드들과 연계하기 편하도록 제작해 봤습니다.


 


이번 툴을 제작하면서 공부한 내용

1. Struct로 따로 분리하여 기능 별로 함수 관리하기.

- 닷넷에 사용하는 트리뷰와 리스트뷰기능만을 구조체로 따로 뺀뒤 기능 함수를 호출해서 사용하는 방식에 대해서 공부하고 숙지했습니다.

기능 구현에만 집중해서 코딩하다 보면 나중에 손댈 수 없는 지저분한 코딩이 될 수 있어 미리미리 코드 정리하는 습관이 중요함을 알게됐습니다.

 

2. 재귀함수의 사용법 다시 한 번 숙지

- 아트직업군에 오래 머물러 있다보니 논리적 사고가 부족해 재귀함수의 흐름을 익히는데 어려움이 많이 있습니다.

지난번 페이스 셀렉트 툴에서도 여러번 익히며 사용법을 완전 숙지했다고 생각했으나 이번 툴을 만들면서 아직 개념이 들 잡혀있음을 알게 되었고, 좀더 연습할 수 있는 시간이었습니다. 좀 더 많은 코딩을 통해 계속해서 숙지해야 할 필요성을 느끼게 됐습니다.

 

ControllerNodeViewer2.mse

 

반응형

+ Recent posts