gpt4 book ai didi

menu - 如何安全地将 menuItems 添加到 Maya MEL 中的现有菜单

转载 作者:行者123 更新时间:2023-12-01 09:59:07 27 4
gpt4 key购买 nike

我尝试使用 MEL 将菜单项添加到 Maya 中的现有菜单

例子:

menuItem -label "Mylabel" -insertAfter "someEntry" -parent $gMainFileMenu;
menuItem -label "Mylabel2" -insertAfter "someEntry" -parent $gMainFileMenu;

问题是菜单没有像它应该的那样由普通条目填充,而只是由我用这两行代码添加的条目填充。

例如,文件菜单通常包含“新建场景”、“打开场景”、“保存场景”等,但是当我做这2行时,它只包含“Mylabel”和“Mylabel2”。

是否有修复或解决方法来确保菜单完全填充?有没有办法强制 Maya 构建它而无需用户实际单击它?

最佳答案

实际上,问题在于 Maya 在用户第一次打开菜单时首先填充菜单。它检查菜单长度是否大于 0,它不会填充它。由于您添加了 2 个条目,因此菜单长度大于 0,并且不会填充标准条目。

要解决这个问题,有两种方法可以做到。您可以通过强制构建菜单项或注册您的构建菜单项来实现。 Bot 方式可用于不同的情况。

通过强制构建菜单:

您需要做的是找到 Maya 调用的函数来构建您需要的菜单。您可以在文件夹 <MayaInstall>/scripts/startup/* 中找到这些函数。查找过程名称的一个好方法是打开 Maya 控制台,启用“回显所有命令”,然后单击要查看调用以构建它的函数的菜单。

在您的情况下,该函数称为 buildFileMenu() 并且可以在脚本 FileMenu.mel 中找到。

既然你有了那个函数名,你必须检查它的参数。有时它需要一个菜单​​名称作为参数,有时则不需要。如果需要,请参阅底部关于如何查找菜单名称的部分。

现在让我们构建它。

global string $gMainFileMenu; // Retrieve the menu name
buildFileMenu(); // Build it

// Now build your menu
menuItem -divider true -parent $gMainFileMenu SuperMenuDivider;
menuItem -label "MyLabel1" -parent $gMainFileMenu SuperMenuLab1;
menuItem -label "MyLabel2" -parent $gMainFileMenu SuperMenuLab2;

// Create a proc to remove your menu items
global proc RemoveMyMenuItems()
{
if(`menuItem -ex SuperMenuDivider`) deleteUI -mi SuperMenuDivider;
if(`menuItem -ex SuperMenuLab1`) deleteUI -mi SuperMenuLab1;
if(`menuItem -ex SuperMenuLab2`) deleteUI -mi SuperMenuLab2;
}
// You can then call that function when in the unload function of your plugin.

通过注册构建 menuItem 调用

您需要做的是使用一个名为 addMenuItemSafe 的函数,它带有 3 个参数、您要填充的菜单、填充菜单的函数名称以及一个用于保存回调的全局变量名称。

因此,您首先要做的是创建将填充菜单的函数,然后是删除它的函数,然后调用 AddMenuItemSafe 方法。请注意,在该函数中,您必须检查菜单是否已创建,因为每次显示菜单时 Maya 都会调用该函数。

首先,添加和删除我们的菜单项的两个函数:

global proc string AddMyMenuItems()
{
// Global variable to hold the test to see if the menu is populated.
global int $gMyMenuItemsTest;

// Menu var needed in our case because we are inserting in the middle of the menu
global string $gMainFileMenu;

if( $gMyMenuItemsTest == 0 )
{
// Actually build your menu.
// Note that if you don't need to insert it after a specific entry,
// You can just do `menuItem -label "blep"`. No need of -ia and -p
// Also, for inserting in the middle you have to put stuff in reverse order.
// If you are just appending, put it in the normal order.
menuItem -label "Mylabel2" -insertAfter "someEntry" -parent $gMainFileMenu MyMenuLab2;
menuItem -label "Mylabel" -insertAfter "someEntry" -parent $gMainFileMenu MyMenuLab;
menuItem -divider true -parent $gMainFileMenu MyMenuDiv;

$gMyMenuItemsTest = 1;
}
return "RemoveMyMenuItems()"; // Returns the callback
}

global proc RemoveMyMenuItems()
{
global int $gMyMenuItemsTest;

if( $gMyMenuItemsTest == 1 )
{
// Delete your items if they exist (yes we are kind of
// doing the check twice, but I find it safe.
// The user could have deleted it from Maya in the command
// line for whatever reason, more robustness is always good.
if(`menu -ex MyMenuDiv`) deleteUI -mi MyMenuDiv;
if(`menu -ex MyMenuLab`) deleteUI -mi MyMenuLab;
if(`menu -ex MyMenuLab2`) deleteUI -mi MyMenuLab2;
}
}

然后实际调用 AddMenuItemSafe:

// The menu we want to use ... here it is the File Menu.
global string $gMainFileMenu;

// Our variables needed for the addSafe call
global int $gMyMenuItemsTest;
global string $gMyMenuVariable;
$gMyMenuItemsTest = 0;
$gMyMenuVariable = "";

// The menu creation
addMenuItemSafe($gMainFileMenu, "AddMyMenuItems", "gMyMenuVariable");

您可以自由地将该函数调用放在插件实例中或任何您喜欢的地方。

有关函数 AddMenuItemSafe 的更多信息,您可以进入您的 Maya 脚本目录,它应该在“AddMenuItemSafe.mel”中。

如何查找菜单名称

注意菜单变量名称,您可以使用以下约定“构建”它们

"g" + View + Name + "Menu"



在哪里 :
  • View 是您可以找到该菜单的 View 。例如:主要、多边形、动画等。
  • 名称 是菜单的名称。例如:文件、编辑、网格等。

  • 注意 Autodesk 有时会重命名菜单并使用旧的 globalVariable 名称,因此使用此方法可能并不总是有效

    关于menu - 如何安全地将 menuItems 添加到 Maya MEL 中的现有菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19236669/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com