实际问题在于Maya在用户第一次打开菜单时首先填充菜单。它会检查菜单长度是否大于0,如果是,则不填充。因为你已经添加了2个条目,所以菜单长度大于0,就不会用标准条目填充了。
要解决这个问题,有两种方法。你可以通过强制构建菜单项或注册构建menuItem来完成。两种方法都适用于不同的情况。
通过强制构建菜单:
你需要做的是找到Maya调用构建菜单的函数。你可以在文件夹/scripts/startup/*中找到这些函数。一个好的方法是打开Maya控制台,启用“echo all commands”,然后单击要查看构建函数的菜单。
在你的情况下,函数名为buildFileMenu(),可以在脚本FileMenu.mel中找到。
现在你有了这个函数名称,你需要检查它的参数。有时它需要一个菜单名称作为参数,有时不需要。关于如何找到菜单名称,请参见底部部分。
现在让我们开始构建它。
global string $gMainFileMenu;
buildFileMenu();
menuItem -divider true -parent $gMainFileMenu SuperMenuDivider;
menuItem -label "MyLabel1" -parent $gMainFileMenu SuperMenuLab1;
menuItem -label "MyLabel2" -parent $gMainFileMenu SuperMenuLab2;
global proc RemoveMyMenuItems()
{
if(`menuItem -ex SuperMenuDivider`) deleteUI -mi SuperMenuDivider;
if(`menuItem -ex SuperMenuLab1`) deleteUI -mi SuperMenuLab1;
if(`menuItem -ex SuperMenuLab2`) deleteUI -mi SuperMenuLab2;
}
通过注册构建菜单项调用
您需要使用一个名为addMenuItemSafe
的函数,它有三个参数:要填充的菜单、填充菜单的函数名称以及保存回调的全局变量名称。
首先要做的是创建一个函数来填充您的菜单,然后再创建另一个函数来移除它,最后调用AddMenuItemSafe
方法。请注意,在函数中,您需要检查菜单是否已经创建,因为 Maya 会在每次显示菜单时都调用该函数。
首先,添加和删除菜单项的两个函数:
global proc string AddMyMenuItems()
{
global int $gMyMenuItemsTest;
global string $gMainFileMenu;
if( $gMyMenuItemsTest == 0 )
{
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()";
}
global proc RemoveMyMenuItems()
{
global int $gMyMenuItemsTest;
if( $gMyMenuItemsTest == 1 )
{
if(`menu -ex MyMenuDiv`) deleteUI -mi MyMenuDiv;
if(`menu -ex MyMenuLab`) deleteUI -mi MyMenuLab;
if(`menu -ex MyMenuLab2`) deleteUI -mi MyMenuLab2;
}
}
接下来是对 AddMenuItemSafe 的实际调用:
global string $gMainFileMenu;
global int $gMyMenuItemsTest;
global string $gMyMenuVariable;
$gMyMenuItemsTest = 0;
$gMyMenuVariable = "";
addMenuItemSafe($gMainFileMenu, "AddMyMenuItems", "gMyMenuVariable");
您可以将该函数调用放在插件实例化或任何其他位置。
如需了解有关函数“AddMenuItemSafe”的更多信息,您可以进入Maya Scripts目录,在那里应该会找到“AddMenuItemSafe.mel”。
如何查找菜单名称
请注意,对于菜单变量名称,您可以使用以下约定“构建”它们
"g" + View + Name + "Menu"
其中:
-
View是您可以在其中找到该菜单的视图。例如:Main、Polygons、Animations等。
-
Name是菜单的名称。例如:File、Edit、Mesh等。
请注意,Autodesk有时会重命名菜单并使用旧的globalVariable名称,因此使用此方法可能不总是有效。