メニュー マネージャ

MAXScript には、メニュー マネージャとメニュー作成システムへのフル アクセスがあります。

注:この API を使用またはテストする場合は十分に注意してください。この API はメニュー データベースに永続的な変更を加え、大きな混乱を引き起こす可能性があります。たとえば、メイン メニュー バーを登録解除すると、3ds Max が起動しなくなります。

この API を使用する場合には、任意のスクリプトを実行する前に、「..\UI\MaxStartUI.mnu」ファイルのコピーを作成する必要があります。問題が発生した場合は、バックアップ バージョンを MaxMenu.mnu にコピーしてしてください。

公開されている MAXScript へのインタフェースには、メニュー マネージャメニュー オブジェクトクアッド メニュー オブジェクト、およびメニュー項目の 4 つがあります。

メニュー マネージャ

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 customization)ダイアログ ボックスに表示されるクアッド メニューでなければなりません。また、メニュー名は大文字を含めて正確に一致する必要があります。 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

指定されたクアッド メニューに「すべての四角を表示」フラグを設定します。「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

genClassID() 関数 を使用して生成します。

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

関連事項