.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 () ; // 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(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;