「Hello World」プラグインには、多くの重要な機能が導入されています。その機能について以下で説明します。
単純なコマンド プラグインに使用する特殊なヘッダ ファイル。新しいコマンドを Maya に登録するときに必要な作業をすべて、DeclareSimpleCommand マクロを使用して処理します。しかし、1 つのプラグインに対し 1 つのコマンドしか作成できません。
メソッドの成功か失敗を表します。API クラスのほとんどのメソッドは、ステータス コードを MStatus で返します。返されるステータス コードについては、それぞれのメソッドの項で説明します。想定される他のステータス コードとのネームスペースの衝突を避けるには、すべての MStatus 値を「MS」でスコープ宣言します。たとえば、MS::kSuccess は成功を表すステータス コードです。コードの完全なリストは、MStatus.h にあります。
API ではいくつかのステータス コードを使用しますが、エラー ロギングが MGlobal::startErrorLogging() を実行して API で有効になると、メソッドが MS::kSuccess 以外のものを返す場合に、詳細なエラー メッセージがエラー ログ ファイルに追加して出力されます。これについては、エラー チェック、MStatus クラス、エラー ロギングで詳細を説明しています。
DeclareSimpleCommand マクロには、コマンドの実装に使用するクラスの名前、コマンドのベンダ(作者)の名前、コマンドのバージョン番号という、3 つのパラメータが必要です。
MSimple.h と同じように、DeclareSimpleCommand() マクロでも、Maya がファイルをプラグインとして適切に認識するために必要となる登録コードを作成する必要がありません。しかし、単純化するために、コマンドの undo メソッドを指定できなくなっています。したがって、このマクロを使用して完全に元に戻す(Undo)が可能なコマンドを作成することはできません。
Hello World プラグインを少し変更するとこのプラグインになります(最初のプラグインを作成するを参照)。「helloWorld」プラグインは常に同じものしか出力しませんでしたが、ここでは Maya と対話するプラグインを作成します(対話の 1 つの方法として、MEL でコマンド ライン引数を使用することが挙げられます)。
以下は、「Hello」に続いて入力内容を出力する、単純なプログラムです。
#include <maya/MSimple.h> #include <maya/MIOStream.h> DeclareSimpleCommand( hello, "Autodesk", "2017"); MStatus hello::doIt( const MArgList& args ) { cout << "Hello " << args.asString( 0 ).asChar() << endl; return MS::kSuccess; }
hello.cpp というファイルに保存してコンパイルします。コマンド ライン ウィンドウに「hello neighbor」と入力した場合に「Hello neighbor」と出力されます。
以下は、らせん形のカーブを構築するプラグインです。NURBS ジオメトリの簡単な説明は、付録 A: NURBS ジオメトリを参照してください。
#include <math.h> #include <maya/MIOStream.h> #include <maya/MSimple.h> #include <maya/MPoint.h> #include <maya/MPointArray.h> #include <maya/MDoubleArray.h> #include <maya/MFnNurbsCurve.h> DeclareSimpleCommand( doHelix, "Autodesk - Example", "2017"); MStatus doHelix::doIt( const MArgList& ) { MStatus stat; const unsigned deg = 3; // Curve Degree const unsigned ncvs = 20; // Number of CVs const unsigned spans = ncvs - deg; // Number of spans const unsigned nknots = spans+2*deg-1; // Number of knots double radius = 4.0; // Helix radius double pitch = 0.5; // Helix pitch unsigned i; MPointArray controlVertices; MDoubleArray knotSequences; // Set up cvs and knots for the helix // for (i = 0; i < ncvs; i++) controlVertices.append( MPoint( radius * cos( (double)i ), pitch * (double)i, radius * sin( (double)i ) ) ); for (i = 0; i < nknots; i++) knotSequences.append( (double)i ); // Now create the curve // MFnNurbsCurve curveFn; MObject curve = curveFn.create( controlVertices, knotSequences, deg, MFnNurbsCurve::kOpen, false, false, MObject::kNullObj, &stat ); if ( MS::kSuccess != stat ) cout << "Error creating curve.\n"; return stat; }
このプラグインをコンパイルしてロードし、プロンプトに「doHelix」と入力してください。らせん形のカーブが Maya ビューに表示されます。
MArgList クラスは、C または C++ プログラムのエントリ ポイントの argc/argv パラメータと同じような機能を提供して、引数のリストを関数に与えます。このクラスでは、引数を integer、double、string、vector などさまざまな型として取り出すメソッドを提供します。
次の例では、helix コマンドは MArgList オブジェクトを介して複数の引数を渡せるように定義されています。その 2 つの引数がピッチ(pitch)と半径(radius)です。
#include <math.h> #include <maya/MSimple.h> #include <maya/MIOStream.h> #include <maya/MFnNurbsCurve.h> #include <maya/MPointArray.h> #include <maya/MDoubleArray.h> #include <maya/MPoint.h> DeclareSimpleCommand( helix, "Autodesk - Example", "3.0"); MStatus helix::doIt( const MArgList& args ) { MStatus stat; const unsigned deg = 3; // Curve Degree const unsigned ncvs = 20; // Number of CVs const unsigned spans = ncvs - deg; // Number of spans const unsigned nknots = spans+2*deg-1;// Number of knots double radius = 4.0; // Helix radius double pitch = 0.5; // Helix pitch unsigned i; // Parse the arguments. for ( i = 0; i < args.length(); i++ ) if ( MString( "-p" ) == args.asString( i, &stat ) && MS::kSuccess == stat) { double tmp = args.asDouble( ++i, &stat ); if ( MS::kSuccess == stat ) pitch = tmp; } else if ( MString( "-r" ) == args.asString( i, &stat ) && MS::kSuccess == stat) { double tmp = args.asDouble( ++i, &stat ); if ( MS::kSuccess == stat ) radius = tmp; } MPointArray controlVertices; MDoubleArray knotSequences; // Set up cvs and knots for the helix // for (i = 0; i < ncvs; i++) controlVertices.append( MPoint( radius * cos( (double)i ), pitch * (double)i, radius * sin( (double)i ) ) ); for (i = 0; i < nknots; i++) knotSequences.append( (double)i ); // Now create the curve // MFnNurbsCurve curveFn; MObject curve = curveFn.create( controlVertices, knotSequences, deg, MFnNurbsCurve::kOpen, false, false, MObject::kNullObj, &stat ); if ( MS::kSuccess != stat ) cout << "Error creating curve.\n"; return stat; }
argc/argv と MargList の重要な違いは、MArgList のゼロ番目の要素が、C や C++ プログラムのようにコマンド名にならず、コマンドの最初の引数になることです。