Maya の .NET SDK では、.NET アセンブリ アトリビュートを使用して、プラグイン、コマンド、ノードなどを自動登録します。これは、Maya の C++ SDK とは異なる方法です。C++ の場合は、MFnPlugin クラスに、Maya の MPx プリフィックスが付いたすべてのクラスに対する登録メソッドが用意されています(MPxCommand、MPxNode など)。.NET では、代わりにクラスをアトリビュートで修飾すると、アトリビュートがプラグイン ローダによって解釈されて、ローダが Maya への登録を行います。
詳細については、MFnPlugin クラスのリファレンス マニュアルを参照してください。
プラグインで ExtensionPlugin アセンブリ アトリビュートを指定します。
通常、プラグインを定義するクラスの先頭にこのアセンブリ アトリビュートを追加します。
[assembly: ExtensionPlugin(typeof(PluginClass), "Name1", "Name2",…)]
ここで:
このアトリビュートは必須ではありませんが、指定すると、プラグインのロードが高速化します。指定しないと、IExtensionPlugin インタフェースを実装している最初の C# クラスが検索されます。このインタフェースには次のメソッドが含まれます。
bool InitializePlugin () ; // called when the plug-in is loaded
bool UninitializePlugin () ; // called when the plug-in is unloaded
System::String^ GetMayaDotNetSdkBuildVersion(); //Returns a string representation of the integer version of Maya (for example, “20135002”)
[assembly: MPxCommandClass(typeof(MPxCommandDerivedClass), "CommandName")]
ここで:
クラスのネームスペースを含むフル パスを指定する必要があります。
例:
[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))]
ここで:
ObjType には、以下を指定できます。
次に例を示します。
[MPxCommandSyntaxSelection(UseSelectionAsDefault = true, MinObjectCount = 1, MaxObjectCount = 2, ObjectsType = typeof(System.String))]
このコマンドは、1 つまたは 2 つのオブジェクトを受け取り、オブジェクトが指定されていない場合は選択を使用します。
コマンドが 1 つまたは複数のフラグを受け取る場合は、各フラグに次のクラス アトリビュートを追加する必要があります。
[MPxCommandSyntaxFlag( “flag’s short name“, “flag’s long name”, Arg1 = typeof(ArgType), Arg2 = typeof(ArgType), ... ]
ここで:
次に例を示します。
[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 つのモードで使用できます。
作成モードは常にサポートされ、既定のモードです。作成モードに加えて、コマンドは照会モードと編集モードの一方または両方をサポートできます。
次のクラス アトリビュートを使用して、異なるモードを指定できます。
[MPxCommandSyntaxMode(CommandMode)]
ここで:
例:
[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;