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 () ; // プラグインがロードされるときに呼び出されます
bool UninitializePlugin () ; // プラグインがアンロードされるときに呼び出されます
System::String^ GetMayaDotNetSdkBuildVersion(); // Maya の整数バージョンの文字列表現(例: "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(typeof(System.String))] // a string argument [MPxCommandSyntaxArg(typeof(System.Int32))] // an integer argument
引数がオブジェクトである場合は、さらに多くのコントロールでこのクラス アトリビュートを使用する必要があります。
[MPxCommandSyntaxSelection( UseSelectionAsDefault = UseSelection, MinObjectCount = min, MaxObjectCount = max, ObjectsType = typeof(ObjType))]
[MPxCommandSyntaxSelection(UseSelectionAsDefault = true, MinObjectCount = 1, MaxObjectCount = 2, ObjectsType = typeof(System.String))]
コマンドが 1 つまたは複数のフラグを受け取る場合は、各フラグに次のクラス アトリビュートを追加する必要があります。
[MPxCommandSyntaxFlag( “フラグの短い名前“, “フラグの長い名前”, 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))]
Maya コマンドは、作成、照会、編集という 3 つのモードで使用できます。
作成モードは常にサポートされ、既定のモードです。作成モードに加えて、コマンドは照会モードと編集モードの一方または両方をサポートできます。
次のクラス アトリビュートを使用して、異なるモードを指定できます。
[MPxCommandSyntaxMode(CommandMode)]
[MPxCommandSyntaxMode(MPxCommandSyntaxModeAttribute.CommandMode.kQuery)]
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;