.NET アセンブリ アトリビュートを使用する

Maya の .NET SDK では、.NET アセンブリ アトリビュートを使用して、プラグイン、コマンド、ノードなどを自動登録します。これは、Maya の C++ SDK とは異なる方法です。C++ の場合は、MFnPlugin クラスに、Maya の MPx プレフィックスが付いたすべてのクラスに対する登録メソッドが用意されています(MPxCommandMPxNode など)。.NET では、代わりにクラスをアトリビュートで修飾すると、アトリビュートがプラグイン ローダによって解釈されて、ローダが Maya への登録を行います。

詳細については、MFnPlugin クラスのリファレンス マニュアルを参照してください。

拡張プラグイン

プラグインで ExtensionPlugin アセンブリ アトリビュートを指定します。

通常、プラグインを定義するクラスの先頭にこのアセンブリ アトリビュートを追加します。

[assembly: ExtensionPlugin(typeof(PluginClass), "Name1", "Name2",…)]

ここで:

このアトリビュートは必須ではありませんが、指定すると、プラグインのロードが高速化します。指定しないと、IExtensionPlugin インタフェースを実装している最初の C# クラスが検索されます。このインタフェースには次のメソッドが含まれます。

bool InitializePlugin () ; // プラグインがロードされるときに呼び出されます

bool UninitializePlugin () ; // プラグインがアンロードされるときに呼び出されます

System::String^ GetMayaDotNetSdkBuildVersion(); // Maya の整数バージョンの文字列表現(例: "20135002")

コマンド

コマンドの定義

[assembly: MPxCommandClass(typeof(MPxCommandDerivedClass), "CommandName")]

ここで:

  • MPxCommandClass: このアトリビュートは、コマンド クラスが Maya に登録されることを保証します。
  • MPxCommandDerivedClass: MPxCommand から派生する C# クラスの名前です。

    クラスのネームスペースを含むフル パスを指定する必要があります。

  • CommandName: Maya のスクリプト エディタに表示されるコマンドの名前です。

例:

[assembly: MPxCommandClass(typeof(MayaNetTest.WhatIsCmd), "netWhatIs")]
namespace MayaNetTest 
{
    public class WhatIsCmd : MPxCommand, IMPxCommand 
    {
        override public void doIt(MArgList args)
        {
            …
        }
    }
}

コマンド構文

コマンド構文を記述するには、いくつかのクラス アトリビュート(コマンド クラスの定義の上にあります)が必要な場合もあります。

指定できるアトリビュートを次に示します。

コマンド引数

コマンドが引数を受け取る場合は、各引数に対して次のアトリビュートを追加する必要があります。

[MPxCommandSyntaxArg(typeof(ArgType))]

  • MPxCommandSyntaxArg: このアトリビュートにより、この引数は構文に追加されます。

  • ArgType: 引数の型(例: System.String)。

次に例を示します。

[MPxCommandSyntaxArg(typeof(System.String))] // a string argument
[MPxCommandSyntaxArg(typeof(System.Int32))] // an integer argument

引数がオブジェクトである場合は、さらに多くのコントロールでこのクラス アトリビュートを使用する必要があります。

[MPxCommandSyntaxSelection( UseSelectionAsDefault = UseSelection,  MinObjectCount = min, MaxObjectCount = max, ObjectsType = typeof(ObjType))]

ここで:

  • MPxCommandSyntaxSelection: このアトリビュートにより、この引数は構文に追加されます。
  • UseSelection: オブジェクトが指定されていない場合に、コマンドが選択を使用するかどうか。
  • min: ユーザが指定できるオブジェクトの最小数です。
  • max: ユーザが指定できるオブジェクトの最大数です。

ObjType は次のどちらかです。

  • typeof(MSelectionList): 常に選択を使用します。
  • typeof(System.String): ユーザが名前を使用してオブジェクトを指定します。

次に例を示します。

[MPxCommandSyntaxSelection(UseSelectionAsDefault = true, MinObjectCount = 1, 
MaxObjectCount = 2, ObjectsType = typeof(System.String))]

このコマンドは、1 つまたは 2 つのオブジェクトを受け取り、オブジェクトが指定されていない場合は選択を使用します。

コマンド フラグ

コマンドが 1 つまたは複数のフラグを受け取る場合は、各フラグに次のクラス アトリビュートを追加する必要があります。

[MPxCommandSyntaxFlag( “フラグの短い名前“, “フラグの長い名前”, Arg1 = typeof(ArgType), Arg2 = typeof(ArgType), ... ]

ここで:

  • MPxCommandSyntaxFlag: このアトリビュートにより、フラグがコマンドの構文に追加されます。
  • フラグの短い名前: フラグの短い名前です(例: -i)。
  • フラグの長い名前: フラグの長い名前です(例: -index)。
  • ArgType: フラグ引数がある場合、その型(例: System.Double)。

次に例を示します。

[MPxCommandSyntaxFlag("-na", "-name", Arg1=typeof(System.String))]
[MPxCommandSyntaxFlag("-ip", "-inPosition", 
Arg1 = typeof(System.Double), 
Arg2 = typeof(System.Double), 
Arg3 = typeof(System.Double))]
注:フラグ -c、-q、-e は、コマンド モード用に予約されています(「コマンド モード」を参照)。

コマンド モード

Maya コマンドは、作成、照会、編集という 3 つのモードで使用できます。

  • 作成: コマンドは要素の作成に使用されます(既定)。
  • 照会: –q フラグを指定したコマンドは、すでに作成されている要素の照会に使用されます。
  • 編集: –e フラグを指定したコマンドは、すでに作成されている要素の修正に使用されます。

作成モードは常にサポートされ、既定のモードです。作成モードに加えて、コマンドは照会モードと編集モードの一方または両方をサポートできます。

次のクラス アトリビュートを使用して、異なるモードを指定できます。

[MPxCommandSyntaxMode(CommandMode)]

上記の説明:

  • MPxCommandSyntaxMode: このアトリビュートにより、コマンド構文でモードが正しく設定されます。
  • CommandMode:
    • MPxCommandSyntaxModeAttribute.CommandMode.kNone: コマンドは作成モードのみをサポートします。
    • MPxCommandSyntaxModeAttribute.CommandMode.kQuery: コマンドは作成モードと照会モードのみをサポートします。
    • MPxCommandSyntaxModeAttribute.CommandMode.kEdit: コマンドは作成モードと編集モードのみをサポートします。
    • MPxCommandSyntaxModeAttribute.CommandMode.kBoth: コマンドは 3 つのモードすべてをサポートします。

例:

[MPxCommandSyntaxMode(MPxCommandSyntaxModeAttribute.CommandMode.kQuery)]

このコマンドは、作成(既定)と照会モード(-q)をサポートします。

コマンドからの引数とフラグの取得

MArgDatabase クラスを使用して、引数とフラグを取得するには、コマンドの syntax() メソッドを使用します。

次のような構文アトリビュートのあるコマンドについて考えます。

[MPxCommandSyntaxFlag("-i", "-index")]
[MPxCommandSyntaxSelection(MinObjectCount = 1, MaxObjectCount = 1, ObjectsType = typeof(MSelectionList))]
[MPxCommandSyntaxModeAttribute(MPxCommandSyntaxModeAttribute.CommandMode.kNone)]

次のようにして引数を取得できます。

bool isIndex;
MxPlug fPlug;
               
const string kIndexFlag = "-i" ;
const string kIndexFlagLong = "-index" ;

// the following transfers all the class attributes information 
var argData = new MArgDatabase( syntax(), args);

if ( argData.isFlagSet (kIndexFlag) )
    isIndex =true ;

// Get the plug specified on the command line.
var slist = argData.getObjects() as MSelectionList;