MAXScript には、メニュー マネージャとメニュー作成システムへのフル アクセスがあります。
この API を使用する場合には、任意のスクリプトを実行する前に、「..\UI\MaxStartUI.mnu」ファイルのコピーを作成する必要があります。問題が発生した場合は、バックアップ バージョンを MaxMenu.mnu にコピーしてしてください。
公開されている MAXScript へのインタフェースには、メニュー マネージャ、メニュー オブジェクト、クアッド メニュー オブジェクト、およびメニュー項目の 4 つがあります。
メニュー マネージャは、メニューおよびクアッド メニューのデータベースです。
メイン メニュー バーおよびすべてのサブメニューは、メニュー オブジェクトです。
クアッド メニュー オブジェクトには 4 つのメニュー オブジェクト(各クアッドに対して 1 つずつ)が保持されます。
メニュー オブジェクトは、メニュー項目のコンテナです。
メニュー項目は、区切り、macroScript を起動するアクション、またはカスケード メニューを表示するサブメニューです。
メニュー マネージャ
menuMan.loadMenuFile "file.mnu"
指定された名前の新しいメニュー ファイルをロードします。現在の「UI」ディレクトリでファイルを検索します。成功した場合は true、失敗した場合は false を返します。
menuMan.saveMenuFile "file.mnu"
指定された名前で新しいメニュー ファイルを保存します。現在の「UI」ディレクトリにファイルを保存します。
menuMan.getMenuFile()
現在のメニュー ファイルへの絶対パスを返します。
menuMan.updateMenuBar()
変更内容を反映してメイン メニュー バーを更新します。必ず、メイン メニュー バーに対して変更を行った後で呼び出してください。
menuMan.registerMenuContext contextId
この呼び出しは、メニュー エクステンションを登録する場合に使用されます。「contextId」は、ランダムな 32 ビットの整数です。この値は「genclassid()」を使用して生成できます。エクステンションは、この関数によってメニュー マネージャに登録され、永続的に記憶されます。初めてエクステンションが登録された場合は true、その後は登録のたびに false を返します。このエクステンションは MaxMenu.mnu ファイルに保存されるため、セッション間でスティッキーです。エクステンションは、スクリプトで項目やサブメニューを MAX のメイン メニュー バーおよびクアッド メニューに追加できるようにするために使用されます。正しい使い方については、以下のサンプル スクリプトを参照してください。
menuMan.findMenu "menuName"
この関数は、指定された名前のメニューを返します。指定された名前のメニューがメニュー マネージャに存在しない場合は「undefined」を返します。この関数には、名前の中の「&」文字を含むメニューの完全な名前が必要です。
例:
helpMenu = menuMan.findMenu "&Help" -- Retrieve3ds Max’shelp menu.
menuMan.findQuadMenu "quadMenuName"
「findMenu」と同様に機能しますが、メニューではなくクアッド メニューを取得します。
menuMan.unRegisterMenumenu
メニュー マネージャからメニューを削除します。
このメソッドを使用する場合は十分に注意してください。
サブメニューとして使用されているメニュー、クアッド メニュー内のメニュー、またはメイン メニュー バーのメニューを登録解除すると、3ds Max が破壊されます。
menuMan.unRegisterQuadMenuquadMenu
このメソッドは「unregisterMenu」と同じように動作しますが、クアッド メニュー用です。
menuMan.createMenu "name"
指定された名前で新しい空のメニューを作成します。
menuMan.createQuadMenu "name" "quad1Name" "quad2Name" "quad3Name" "quad4Name"
新しい空のクアッド メニューを作成します。これには 4 つの空のメニュー(各クアッド メニューに 1 つずつ)が含まれます。
menuMan.createSubMenuItem "name" subMenu
メニューに追加可能な新しいサブメニュー項目を作成します。指定された「name」を使用して、指定されたサブメニューを表示します。
menuMan.createSeparatorItem()
メニューに追加可能な新しいメニュー区切りを作成します。
menuMan.createActionItem "macroScriptName" "macroScriptCategory"
メニューに追加可能な新しいメニュー項目を作成します。メニュー項目は、指定された名前とカテゴリ付きのマクロ スクリプトを実行するアクションです。指定された名前とカテゴリ付きのマクロ スクリプトがない場合は、「undefined」を返します。
menuMan.setViewportRightClickMenu which quadMenu
ビューポートの右クリック メニューを指定されたクアッド メニューに設定します。「which」の値は次のうちいずれかです。
#nonePressed #shiftPressed #altPressed #controlPressed #shiftAndAltPressed #shiftAndControlPressed #controlAndAltPressed #shiftAndAltAndControlPressed
以下の例では、既定値の(キーが押されていない)クアッド メニュー「Modeling 2」を設定しています。メニュー名は、[クアッド カスタマイズ]ダイアログ ボックスに表示されるクアッド メニューでなければなりません。メニュー名は、[クアッド カスタマイズ]ダイアログ ボックスに表示されるクアッド メニューでなければなりません。また、メニュー名は大文字を含めて正確に一致する必要があります。menuMan.SetViewportRightClickMenu
は、ビューポートの右クリック メニューを許可されていないメニューに設定しようとすると、FALSE を返します。
例:
menuMan.setViewportRightClickMenu #nonePressed "Modeling 2"
menuMan.getViewportRightClickMenu which
ビューポートの右クリックに使用するクアッド メニューを取得します。「which」パラメータは次のうちいずれかです。
#nonePressed #shiftPressed #altPressed #controlPressed #shiftAndAltPressed #shiftAndControlPressed #controlAndAltPressed #shiftAndAltAndControlPressed menuMan.getMainMenuBar()
MAX のメイン メニュー バーとして使用されているメニューを返します。
menuMan.setMainMenuBar menu
MAX のメイン メニュー バーとして使用されているメニューを設定します。結果を表示するには、「menuMan.updateMenuBar()」を呼び出す必要があります。
menuMan.getShowAllQuads quadMenu
指定されたクアッド メニューの「すべての四角を表示」の設定を取得します。
menuMan.setShowAllQuads quadMenu value
指定されたクアッド メニューに「すべての四角を表示」フラグを設定します。値は true
または false
にすることがきます。
menuMan.getQuadMenuName quadMenu
指定されたクアッド メニューの名前を返します。
menuMan.setQuadMenuName quadMenu "name"
指定されたクアッド メニューの名前を設定します。
menuMan.numMenus()
メニュー マネージャに登録されているメニューの総数を返します。
menuMan.getMenu index
メニュー マネージャのインデックス番目のメニューを取得します。インデックスの基数は 1 です。
menuMan.numQuadMenus()
メニュー マネージャに登録されているクアッド メニューの総数を返します。
menuMan.getQuadMenu index
メニュー マネージャのインデックス番目のクアッド メニューを取得します。インデックスの基数は 1 です。
クアッド メニュー オブジェクトでは、次の関数を使用できます。
quadMenu.getMenu quadIndex
メニューの 4 つのクアッドに関連付けられているメニュー オブジェクトを取得します。「quadIndex」は 0、1、2、または 3 の値をとることができます。0 が右下のクアッドで、そこから反時計回りに番号が付けられています。
quadMenu.trackMenu showAllQuads
クアッド メニューを表示します。「showAllQuads」が true の場合、すべてのクアッドが同時に表示されます。クアッド メニューは、現在のカーソルの位置に表示されます。
メニューはメニュー項目のコンテナです。 メニューには次の関数があります。
menu.setTitle "title"
メニューのタイトルを指定された文字列に設定します。
menu.getTitle()
メニューの現在のタイトルを返します。
menu.numItems()
メニューに保持されている項目の数を返します。
menu.getItem index
指定されたインデックスのメニュー項目を取得します。
インデックスの基数は 0 です。
menu.addItem menuItem position
指定された位置にメニュー項目を挿入します。基数は 0 です。位置が -1 の場合、項目はメニューの最後に追加されます。
menu.removeItemByPosition position
指定された位置にある項目を削除します。
menu.removeItem menuItem
指定された項目がメニューにある場合、その項目をメニューから削除します。
メニュー項目は、区切り、サブメニュー、または macroScript に接続するアクションです。menuItem には、次の関数を使用できます。
menuItem.setTitle "title"
項目に関連する名前を設定します。
menuItem.getTitle()
項目に関連する名前を返します。
menuItem.setUseCustomTitle value
値が true の場合は、macroScript に関連付けられている項目がメニューに表示されるときに項目タイトルを使用します。それ以外の場合は、マクロの名前または macroScript の「buttontext」を使用します。
menuItem.getUseCustomTitle()
カスタム タイトル フラグの現在の値を返します。
menuItem.setDisplayFlat value
この関数は、サブメニュー項目に使用します。値が true の場合、サブメニューをカスケード サブメニューとしてではなく、インラインで表示します。
menuItem.getDisplayFlat()
「display flat」フラグの現在の値を返します。
menuItem.getIsSeparator()
項目が区切りの場合は true、それ以外の場合は false を返します。
menuItem.getSubMenu()
項目がサブメニュー項目の場合は、サブメニューに関連するメニューを返します。
次の例は、menuMan インタフェースを使ってメニュー エクステンションを登録する方法を示すスクリプトです。このスクリプトは、stdplugs\stdscripts フォルダに配置する必要があります。
例:
-- Sample menu extension script -- If this script is placed in the "stdplugs\stdscripts" -- folder, then this will add the new items to MAX's menu bar -- when MAX starts. -- A sample macroScript that we will attach to a menu item macroScript MyTest category: "Menu Test" tooltip: "Test Menu Item" ( on execute do print "Hello World!" )
例:
-- This example adds a new entry to MAX's main "Help" menu. -- Register a menu context. This returns true the first time it -- is registered, and we can add things to the menu. If -- it returns false, then the context is already registered, -- and the items are already in the menu. -- The number 0x246c6dbe is random, and can be generated -- using the genClassID() function. if menuMan.registerMenuContext 0x246c6dbe then ( -- Get the main menu bar local mainMenuBar = menuMan.getMainMenuBar() -- The help menu is always the last menu. local helpMenuIndex = mainMenuBar.numItems() -- Get the menu item that holds the help menu local helpMenuItem = mainMenuBar.getItem(helpMenuIndex) -- Get the menu from the item local helpMenu = helpMenuItem.getSubMenu() -- create a menu separator item local sepItem = menuMan.createSeparatorItem() -- create a menu items that calls the sample macroScript local testItem = menuMan.createActionItem "MyTest" "Menu Test" -- Add the separator to the end of the help menu. -- the position of -1 means add it to the end. helpMenu.addItem sepItem -1 -- Add the action item to the end of the help menu. helpMenu.addItem testItem -1 -- redraw the menu bar with the new item menuMan.updateMenuBar() )
例:
-- This example adds a new sub-menu to MAX's main menu bar. -- It adds the menu just before the "Help" menu. if menuMan.registerMenuContext 0x1ee76d8e then ( -- Get the main menu bar local mainMenuBar = menuMan.getMainMenuBar() -- Create a new menu local subMenu = menuMan.createMenu "Test Menu" -- create a menu item that calls the sample macroScript local testItem = menuMan.createActionItem "MyTest" "Menu Test" -- Add the item to the menu subMenu.addItem testItem -1 -- Create a new menu item with the menu as it's sub-menu local subMenuItem = menuMan.createSubMenuItem "Test Menu" subMenu -- compute the index of the next-to-last menu item in the main menu bar local subMenuIndex = mainMenuBar.numItems() - 1 -- Add the sub-menu just at the second to last slot mainMenuBar.addItem subMenuItem subMenuIndex -- redraw the menu bar with the new item menuMan.updateMenuBar() )
例:
-- This example adds a new command to MAX's default right-click quad menu if menuMan.registerMenuContext 0x36690115 then ( -- Get the default viewport right-click quad menu local quadMenu = menuMan.getViewportRightClickMenu #nonePressed -- Get the lower-left menu from the quad local menu = quadMenu.getMenu 3 -- create a menu item that calls the sample macroScript local testItem = menuMan.createActionItem "MyTest" "Menu Test" -- Add the item to the menu menu.addItem testItem -1 )
2 つの右クリック メニューを設定およびリセットする 2 つの macroScript です。
macroScript SetQuads category:"Custom UI" tooltip:"Set Quad" ( on execute do ( quadmenu = menuMan.findQuadMenu "Modeling 2" if quadmenu != undefined do menuMan.setViewportRightClickMenu #nonePressed quadmenu quadmenu = menuMan.findQuadMenu "Sample 4x1" menuMan.setViewportRightClickMenu #controlPressed quadmenu ) )
macroScript ResetQuads category:"Custom UI" tooltip:"Reset Quads" ( on execute do ( quadmenu = menuMan.findQuadMenu "Default Viewport Quad" if quadmenu != undefined do menuMan.setViewportRightClickMenu #nonePressed quadmenu quadmenu = menuMan.findQuadMenu "Modeling 1 [Cntrl+RMB]" if quadmenu != undefined do menuMan.setViewportRightClickMenu #controlPressed quadmenu ) )