4

MELを使ってMayaの既存メニューにメニュー項目を追加してみた

例:

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

問題は、メニューに通常のエントリが表示されず、これらの 2 行のコードで追加したエントリだけが表示されることです。

例えば、ファイルメニューには通常「新規シーン」「シーンを開く」「シーンを保存」などが含まれているのですが、この2行を実行すると「Mylabel」と「Mylabel2」しか含まれません。

メニューが完全に表示されるようにするための修正または回避策はありますか? ユーザーが実際にクリックせずに強制的に Maya にビルドさせる方法はありますか?

4

1 に答える 1

8

実際の問題は、ユーザが最初にメニューを開いたときに、Maya が最初にメニューに入力することです。メニューの長さをチェックし、それが 0 より大きい場合は、それを設定しません。2 つのエントリを追加したため、メニューの長さは 0 より大きく、標準のエントリが取り込まれません。

この問題を解決するには、2 つの方法があります。メニュー項目を強制ビルドするか、ビルド menuItem を登録することで、これを行うことができます。ボットの方法は、さまざまな場合に使用できます。

メニューを強制的に構築することにより:

必要なメニューを構築するために 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 呼び出しを登録することによって

あなたがしなければならないことは、addMenuItemSafe3 つのパラメーター、入力するメニュー、メニューに入力する関数の名前、およびコールバックを保持するためのグローバル変数名を取る関数という名前を使用することです。

したがって、最初に行う必要があるのは、メニューにデータを入力する関数を作成し、次にメニューを削除する関数を作成してからAddMenuItemSafeメソッドを呼び出すことです。Maya はメニューが表示されるたびにその関数を呼び出すため、この関数では、メニューが既に作成されているかどうかを確認する必要があることに注意してください。

まず、メニュー エントリを追加および削除する 2 つの関数:

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" + ビュー + 名前 + "メニュー"

どこ :

  • ビューは、そのメニューを見つけることができるビューです。例: メイン、ポリゴン、アニメーションなど

  • 名前はメニューの名前です。例: ファイル、編集、メッシュなど

Autodesk は、メニューの名前を変更し、古い globalVariable 名を使用する場合があるため、この方法を使用しても常に機能するとは限りません。

于 2013-10-07T23:41:28.313 に答える