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」を設定しています。メニュー名は、[クアッド カスタマイズ]ダイアログ ボックスに表示されるクアッド メニューでなければなりません。メニュー名は、[クアッド] (Quads)カスタマイズ ダイアログ ボックスにリストされているクアッド メニューでなければならず、大文字と小文字を含む名前が完全に一致する必要があります。ビューポートの右クリック メニューを許可されていないメニューに設定しようとすると、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 menuMAX のメイン メニュー バーとして使用されているメニューを設定します。結果を表示するには、「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 の場合、4 つすべてのクアッドが同時に表示されます。クアッド メニューは、現在のカーソルの位置に表示されます。
メニューはメニュー項目のコンテナです。 メニューには次の関数があります。
menu.setTitle "title"メニューのタイトルを指定された文字列に設定します。
menu.getTitle()メニューの現在のタイトルを返します。
menu.numItems()メニューに保持されている項目の数を返します。
menu.getItem index指定されたインデックスのメニュー項目を取得します。
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 ) )