「Hello World」プラグインには、多くの重要な機能が導入されています。その機能について以下で説明します。
単純なコマンド プラグインに使用する特殊なヘッダ ファイル。新しいコマンドを Maya に登録するときに必要な作業をすべて、DeclareSimpleCommand マクロを使用して処理します。しかし、1 つのプラグインに対し 1 つのコマンドしか作成できません。
メソッドの成功か失敗を表します。API クラスのほとんどのメソッドは、ステータス コードを MStatus で返します。返されるステータス コードについては、それぞれのメソッドの項で説明します。想定される他のステータス コードとのネームスペースのコリジョンを避けるには、すべての MStatus 値を「MS」でスコープ宣言します。たとえば、MS::kSuccess は成功を表すステータス コードです。コードの完全なリストは、MStatus.h にあります。
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", "2009");
MStatus hello::doIt( const MArgList& args )
{
cout << "Hello " << args.asString( 0 ).asChar() << endl;
return MS::kSuccess;
}
hello.cpp というファイルに保存してコンパイルしてください。コマンド ライン ウィンドウに「hello neighbor」と入力した場合に「Hello neighbor」と出力されます。
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;
}
以下は、らせん形のカーブを構築するプラグインです。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", "2009");
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 ビューに表示されます。