メニュー システムは 3ds Max 2025 で完全に書き換えられました。以前の多くの API は廃止されました。この新しいシステムの詳細な概要については、『3ds Max 開発者用ヘルプ』の「メニュー システム」を参照してください。
MAXScript を使用して作成および管理できるメニューは、次の 3 種類です。
プラグインを使用して 3ds Max にメニューを追加するには、メニュー定義ファイル(.mnx または .qmnx ファイル)をロードするか、C++ または MAXScript を使用してプログラムによって追加します。いずれの場合も、メニューは起動時にロードされます。MAXScript で作成したメニューを実行するには、スタートアップ プラグイン ディレクトリにあるスクリプトを使用するか、プラグインの Package.xml ファイルで「起動前のスクリプトの一部」として指定する必要があります。パッケージ ファイル形式の詳細については、3ds Max 開発者ヘルプの「パッケージ プラグイン」のトピックを参照してください。
3 つのすべてのメソッド、メニュー定義ファイル、C++ および MAXScript を使用してメニューを作成する例は、3ds Max SDK の howto/ui/menudemo にあります。
MAXScript を使用してプラグインでメニューを作成するには:
#cuiRegisterMenus
イベントのコールバックを登録します。CreateSubMenu()
、CreateSeparator()
、CreateAction()
)を使用して、メニューを作成します。 次に、完全な例を示します。
function menuCallback =
(
print "menuCallback"
local menuMgr = callbacks.notificationParam()
local mainMenuBar = menuMgr.mainMenuBar
-- Id of "Help" menu in main menu bar. Can be found in Menu editor -> right click on menu item -> copy item id
local helpMenuId = "cee8f758-2199-411b-81e7-d3ff4a80d143"
local newSubMenu = mainMenuBar.CreateSubMenu "F8FFB827-741C-4A81-8C89-BBF856DCF56D" "Demo Menu MXS" beforeId:helpMenuId
local separatorId = "96FB49D4-6263-4D8E-AC95-6D304673327B"
newSubMenu.CreateSeparator separatorId
-- Add existing actions from autobackup action table
local autobackupTableId = -889262067
newSubMenu.CreateAction "FD48D7BC-6CBB-4B05-985F-EBAC6CF29546" autobackupTableId "0" beforeId:separatorId
newSubMenu.CreateAction "6C18B511-BA95-422F-AA10-A2E5229759D2" autobackupTableId "1" beforeId:separatorId
newSubMenu.CreateAction "CC351EB5-E95C-4694-A68A-1A34BF32FA84" autobackupTableId "2" beforeId:separatorId
newSubMenu.CreateAction "6AC5FDFE-2AF7-4069-8493-D8A1462F4E7F" autobackupTableId "3" beforeId:separatorId title:"Custom Title"
-- Insert dynamic menu defined in mxsDynamicMenuExample.ms
newSubMenu.CreateAction "0C4D0C3D-D870-476A-9CDD-B6ED35A580C0" 647394 "MXS_Demo_Action_Item`Menu Demo Category"
)
callbacks.removeScripts id:#menuDemo
callbacks.addScript #cuiRegisterMenus menuCallback id:#menuDemo
通常のメニューと同様に、クアッド メニューは起動時にのみ追加できます。
MAXScript を使用してプラグインでクアッド メニューを作成するには:
#cuiRegisterQuadMenus
イベントのコールバックを登録します。CreateSubMenu()
、CreateSeparator()
、CreateAction()
)を使用して、メニューを作成します。 次に、完全な例を示します。
function quadMenuCallback =
(
function populateMenuWithManyItems menu =
(
-- Add existing actions from autobackup action table
local autobackupTableId = -889262067
-- Menu item ids need to be consistent at all times. Other menu customizations might rely on these ids.
-- However, since this is a demo plugin plugin and we just want some filler content, just generate random ids on every run.
-- This is not recommended for production code.
menu.CreateAction (genGUID()) autobackupTableId "0"
menu.CreateAction (genGUID()) autobackupTableId "1"
menu.CreateAction (genGUID()) autobackupTableId "2"
menu.CreateAction (genGUID()) autobackupTableId "3" title:"Custom Title"
menu.CreateSeparator (genGUID())
-- Insert dynamic menu defined in mxsDynamicMenuExample.ms
menu.CreateAction (genGUID()) 647394 "MXS_Demo_Action_Item`Menu Demo Category"
)
print "quadMenuCallback"
local quadMenuMgr = callbacks.notificationParam()
local viewportContextId = "ac7c70f8-3f86-4ff5-a510-e4fd6a9c368e" -- from ICuiQuadMenuManager.h
local viewportContext = quadMenuMgr.GetContextById viewportContextId
local mxsQuad = viewportContext.CreateQuadMenu "7A021F1D-3AEC-4398-9C84-60E48EE81F83" "Demo Quad Menu MXS"
-- This will override the existing viewport quad assigned to this right click modifier
viewportContext.SetRightClickModifiers mxsQuad #shiftAndControlPressed
local topRightMenu = mxsQuad.CreateMenu "2B5DCB81-E4D5-49B6-B693-2213E594B557" "MXS Top Right Quad" #TopRight
local bottomLeftMenu = mxsQuad.CreateMenu "EC6FBB46-E450-4F8F-AB13-A4A48A92FAF6" "MXS Bottom Left Quad" #BottomLeft
PopulateMenuWithManyItems topRightMenu
PopulateMenuWithManyItems bottomLeftMenu
)
callbacks.removeScripts id:#quadMenuDemo
callbacks.addScript #cuiRegisterQuadMenus quadMenuCallback id:#quadMenuDemo
メニューやクアッド メニューとは異なり、ダイナミック メニューはいつでも処理中に作成できます。ダイナミック メニューは、現在の条件に応じて、プログラムによってメニュー システムに取り込まれます。ダイナミック メニューを作成するには、2 つのイベント ハンドラ populateDynamicMenu
および dynamicMenuItemSelected
を使用してマクロ スクリプトを作成します。たとえば、次のサンプルをボタンまたはメニュー項目に割り当てると、メニュー セットが動的に作成します。
populateDynamicMenu ハンドラの構文は次のようになります。
on populateDynamicMenu <CuiDynamicMenu> [<hwnd> [<Point2>]] do
最初の引数は、ハンドラを呼び出すメニューまたはクアッド メニューです。メニューから呼び出した場合、最後の 2 つの引数は 0 [0,0]
になります。クアッド メニューから呼び出した場合は、クアッド メニューのビューポートの hwnd、およびそのビューポート内のクアッドの座標になります。
macroscript MXS_Demo_Action_Item category:"Menu Demo Category" buttonText:"MXS Demo Action Item"
(
-- Defining these two event handlers tells the system that this macroscript should produce a dynamic menu
on populateDynamicMenu menuRoot do
(
-- Generate some custom menu items. Each item has a unique id.
-- Id is passed to dynamicMenuItemSelected when user clicks on menu item.
-- These ids are not visible to the rest of the menu system. They only matter for this specific dynamic menu.
menuRoot.AddItem 1234 "Say Hello in listener"
menuRoot.AddItem 2345 "Say Goodbye in listener"
menuRoot.addSeparator()
subMenu = menuRoot.addSubMenu "Sub-Menu"
subMenu.AddItem 3456 "Say 3ds Max in listener"
menuRoot.addSeparator()
-- Add existing actions from autobackup action table
local autobackupTableId = -889262067
menuRoot.AddAction autobackupTableId "0"
menuRoot.AddAction autobackupTableId "1"
menuRoot.AddAction autobackupTableId "2"
menuRoot.AddAction autobackupTableId "3" title:"Custom Title"
)
on dynamicMenuItemSelected id do
(
case id of
(
1234: print "Hello"
2345: print "Goodbye"
3456: print "3ds Max"
)
)
)