Menu 如何将菜单项安全地添加到Maya MEL中的现有菜单

Menu 如何将菜单项安全地添加到Maya MEL中的现有菜单,menu,maya,mel,Menu,Maya,Mel,我尝试使用MEL将菜单项添加到Maya中的现有菜单 例如: menuItem -label "Mylabel" -insertAfter "someEntry" -parent $gMainFileMenu; menuItem -label "Mylabel2" -insertAfter "someEntry" -parent $gMainFileMenu; 问题是菜单没有像应该的那样被正常的条目填充,而只是被我用这两行代码添加的条目填充 例如,“文件”菜单通常包含“新建场景”、“打开场景”、

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

例如:

menuItem -label "Mylabel" -insertAfter "someEntry" -parent $gMainFileMenu;
menuItem -label "Mylabel2" -insertAfter "someEntry" -parent $gMainFileMenu;
问题是菜单没有像应该的那样被正常的条目填充,而只是被我用这两行代码添加的条目填充

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


是否有修复或解决方法来确保菜单完全填充?有没有一种方法可以强制Maya在用户没有实际单击的情况下构建它?

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

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

通过强制构建菜单: 您需要做的是找到Maya调用的函数以构建所需的菜单。您可以在文件夹
/scripts/startup/*
中找到这些函数。查找过程名称的一个好方法是打开Maya控制台,启用“echo all commands”,然后单击要查看用于构建该过程的函数的菜单

在本例中,该函数称为
buildFileMenu()
,可以在脚本
FileMenu.mel
中找到

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

现在让我们构建它

全局字符串$gMainFileMenu;//检索菜单名
buildFileMenu();//建造它
//现在构建菜单
menuItem-分隔符true-父项$gMainFileMenu超级分隔符;
menuItem-标签“MyLabel1”-父级$gMainFileMenu SuperMenuLab1;
menuItem-标签“MyLabel2”-父级$gMainFileMenu SuperMenuLab2;
//创建删除菜单项的过程
全局进程RemoveMyMenuItems()
{
if(`menuItem-ex SuperMenuDivider`)deleteUI-mi SuperMenuDivider;
if(`menuItem-ex SuperMenuLab1`)deleteUI-mi SuperMenuLab1;
if(`menuItem-ex SuperMenuLab2`)deleteUI-mi SuperMenuLab2;
}
//然后,您可以在插件的卸载函数中调用该函数。

通过注册build menuItem调用 您需要做的是使用一个名为
addMenuItemSafe
的函数,该函数包含3个参数:要填充的菜单、填充菜单的函数名以及保存回调的全局变量名

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

首先,添加和删除菜单项的两个功能:

全局过程字符串AddMyMenuItems()
{
//用于保存测试以查看菜单是否已填充的全局变量。
全球整数$gMyMenuItemsTest;
//菜单VAR需要在我们的情况下,因为我们正在插入菜单的中间
全局字符串$gMainFileMenu;
如果($gMyMenuItemsTest==0)
{
//实际上,建立你的菜单。
//请注意,如果不需要在特定条目后插入它,
//您只需执行'menuItem-label“blep”`。不需要-ia和-p
/同时,为了插入中间,你必须把东西倒序排列。
//如果只是追加,请按正常顺序进行。
menuItem-标签为“Mylabel2”-插入在“someEntry”之后-父级$gMainFileMenu MyMenuLab2;
menuItem-标签“Mylabel”-在“someEntry”之后插入-父项$gMainFileMenu MyMenuLab;
menuItem-分隔符true-父项$gMainFileMenu MyMenuDiv;
$gMyMenuItemsTest=1;
}
return“removeMeyMenuItems()”;//返回回调
}
全局进程RemoveMyMenuItems()
{
全球整数$gMyMenuItemsTest;
如果($gMyMenuItemsTest==1)
{
//删除你的项目,如果他们存在(是的,我们是一种
//检查了两次,但我觉得很安全。
//用户可以在命令中从Maya中将其删除
//无论出于什么原因,更健壮总是好的。
if(`menu-ex MyMenuDiv`)deleteUI-mi MyMenuDiv;
if(`menu-ex MyMenuLab`)deleteUI-mi MyMenuLab;
if(`menu-ex MyMenuLab2`)deleteUI-mi MyMenuLab2;
}
}
然后是对AddMenuItemSafe的实际调用:

//我们要使用的菜单…这里是文件菜单。
全局字符串$gMainFileMenu;
//addSafe调用所需的变量
全球整数$gMyMenuItemsTest;
全局字符串$gMyMenuVariable;
$gMyMenuItemsTest=0;
$gMyMenuVariable=“”;
//菜单创建
addMenuItemSafe($gMainFileMenu,“AddMyMenuItems”,“gMyMenuVariable”);
您可以将该函数调用放在插件实例化中,或者放在任何您喜欢的地方

有关函数AddMenuItemSafe的详细信息,可以进入Maya脚本目录,该目录应位于“AddMenuItemSafe.mel”中


如何查找菜单名 注意:对于菜单变量名,您可以使用以下约定“构建”它们

“g”+视图+名称+“菜单”

其中:

  • 视图是可以找到该菜单的视图。例如:主菜单、多边形、动画等

  • Name是菜单的名称。例如:文件、编辑、网格等

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