Maxscript 메인 툴바에 메뉴 등록하기

 

 

Maxscript를 만들다보면 사용 편의를 위해 MacroScript를 만들게 됩니다.

그런데 이런 MacroScript를 사용하려면 Customize User Interface에 들어가 Script를 가져와야 되는데요.

이런 불편을 줄이기위해 메인 툴바에 직접 등록하는 방법에 대해 이야기해 보겠습니다.

 

 

예상 결과 이미지

 

위처럼 HG란 메뉴 하위에 GoodLuck이라는 MacroScript를 등록해 보겠습니다.

먼저 MacroScript를 등록해야 겠죠.

 

아래 코드는 MacroScript를 등록하는 코드 입니다.

실행하면 작은 롤아웃 다이얼로그가 보여기게 될겁니다.

 

테스트용 MacroScript를 하나 만들어야 겠죠.

저는 GoolLuck이란 이름으로 하나 만들었습니다.

 

 

<GoodLuck.mcr>

 

macroScript GoodLuck
category:"Hwanggoon"
buttonText:"GoodLuck"
tooltip:"GoodLuck"
(    
    on execute do
 (
  global g_GoodLuckRollout

  try (destroyDialog g_GoodLuckRollout) catch()

  rollout g_GoodLuckRollout "Split Render"
  (
   button btn_Yamette "?" width:100
   label lbl_Maker "Hwanggoon"
   
   on btn_Yamette pressed  do
   (
    messagebox "Yamette!!"
   )
  )

  createDialog g_GoodLuckRollout width:150 height:150
 )
)

 

 

이제 위 MacroScript를 MainMenu에 등록하는 스크립트가 필요한데요.

사용 편의를 위해서 MainMenu의 메소드를 바로 사용하지 않고 살짝 랩핑 했습니다.

랩핑하는 방식이 무조건 좋은 건 아니에요.

버그를 찾는다던가, 오래간만에 코드를 볼 경우 시간이 더 걸리기도 합니다.

반대로 더 빨리 찾기도 하구요.

이건 성향인 것 같으니 원하는 방식으로 하시면 될 것 같네요.

 

 

<MainMenuClass.ms>

 

--------------------------------------------------------------------------------------------------------
-- 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
 )
)

 

 

저 처럼 랩핑해서 사용해도 되고 아니면, 직접 만들어 사용하도 됩니다.

자 그럼 MacroScript 와 랩핑된 MainMenuClass를 만들었으니 화면에 보이게 해볼까요~

 

 

<등록 코드>

(
menuName    = "HG"
macroScriptName = "GoodLuck"
categoryName   = "Hwanggoon"

MainMenu = MainMenuClass()

 

-- menu 만들기 --
MainMenu.AddMenu menuName

 

-- Item 만들기 --
item = MainMenu.CreateActionItem  macroScriptName categoryName

 

-- menu에 Item 등록 하기 --
MainMenu.AddItem menuName item

 

-- 화면 갱신 하기 --
MainMenu.UpdateMenuBar()
)

 

 

<삭제 코드>

(

menuName = "HG"

 

-- menu에 Item 등록 하기 --
MainMenu.RemoveMenu menuName

 

-- 화면 갱신 하기 --
MainMenu.UpdateMenuBar()

)

 

 

이렇게 하면 MacroScript를 메인 메뉴에 등록할 수 있습니다.

메인 메뉴 안에 섭브 메뉴 등록도 가능해요.

(서브 메뉴는 직접해 보세요.)

코드가 복잡하지 않으니 이해하는데 어렵진 않을 겁니다.

 

 

 

Posted by Hwanggoon
,