メニュー マネージャ
 
 
 

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" -- 3ds Max のヘルプ メニューを取得します。
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.setViewportRightClickMenuwhich 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

指定されたクアッド メニューに「すべての四角を表示」フラグを設定します。「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 フォルダに配置する必要があります。

例:

-- メニュー エクステンション スクリプトのサンプル
-- このスクリプトを stdplugs¥stdscripts フォルダに配置すると、
-- 3ds Max の起動時に新しい項目がメニュー バーに
-- 追加されます。
-- メニュー項目にアタッチする macroScript のサンプル
macroScript MyTest
category: "Menu Test"
tooltip: "Test Menu Item"
(
on execute do print "Hello World!"
)

例:

-- この例では、新しいエントリを 3ds Max のメイン「Help」メニューに追加します。
-- メニュー コンテキストを登録します。このコンテキストを初めて登録する場合は true が返され、
-- メニューに追加することができます。これが
-- false を返す場合、コンテキストは既に登録されており、
-- 項目は既にメニューに存在します。
-- 0x246c6dbe は乱数です。

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

if menuMan.registerMenuContext 0x246c6dbe then
(
-- メイン メニュー バーを取得します。
local mainMenuBar = menuMan.getMainMenuBar()
-- ヘルプ メニューは必ず最後のメニューになります。
local helpMenuIndex = mainMenuBar.numItems()
-- ヘルプ メニューを保持するメニュー項目を取得します。
local helpMenuItem = mainMenuBar.getItem(helpMenuIndex)
-- 項目からメニューを取得します。
local helpMenu = helpMenuItem.getSubMenu()
-- メニュー区切り項目を作成します。
local sepItem = menuMan.createSeparatorItem()
-- サンプル macroScript を呼び出すメニュー項目を作成します。
local testItem = menuMan.createActionItem "MyTest" "Menu Test"
-- ヘルプ メニューの最後に区切りを追加します。
-- -1 の位置は最後に追加することを意味します。
helpMenu.addItem sepItem -1
-- ヘルプ メニューの最後にアクション項目を追加します。
helpMenu.addItem testItem -1
-- 新しい項目を反映してメニュー バーを再描画します。
menuMan.updateMenuBar()
)

例:

-- この例では、新しいサブメニューを 3ds Max のメイン メニュー バーに追加します。
-- 「Help」メニューの直前にメニューを追加します。
if menuMan.registerMenuContext 0x1ee76d8e then
(
-- メイン メニュー バーを取得します。
local mainMenuBar = menuMan.getMainMenuBar()
-- 新しいメニューを作成します。
local subMenu = menuMan.createMenu "Test Menu"
-- サンプル macroScript を呼び出すメニュー項目を作成します。
local testItem = menuMan.createActionItem "MyTest" "Menu Test"
-- 項目をメニューに追加します。
subMenu.addItem testItem -1
-- 追加したメニューをサブメニューとして新しいメニュー項目を作成します。
local subMenuItem = menuMan.createSubMenuItem "Test Menu" subMenu
-- メイン メニュー バーの最後から 2 番目のメニュー項目のインデックスを計算します。
local subMenuIndex = mainMenuBar.numItems() - 1
-- サブメニューを最後から 2 番目のスロットに追加します。
mainMenuBar.addItem subMenuItem subMenuIndex
-- 新しい項目を反映してメニュー バーを再描画します。
menuMan.updateMenuBar()
)

例:

-- この例では、新しいコマンドを 3ds Max の既定値の右クリック クアッド メニューに追加します。
if menuMan.registerMenuContext 0x36690115 then
(
-- 既定値のビューポート右クリック クアッド メニューを取得します。
local quadMenu = menuMan.getViewportRightClickMenu #nonePressed
-- クアッドから左下のメニューを取得します。
local menu = quadMenu.getMenu 3
-- サンプル macroScript を呼び出すメニュー項目を作成します。
local testItem = menuMan.createActionItem "MyTest" "Menu Test"
-- 項目をメニューに追加します。
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
)
)
関連事項