重要なプラグイン機能

「Hello World」プラグインには、多くの重要な機能が導入されています。その機能について以下で説明します。

MSimple.h

単純なコマンド プラグインに使用する特殊なヘッダ ファイル。新しいコマンドを Maya に登録するときに必要な作業をすべて、DeclareSimpleCommand マクロを使用して処理します。しかし、1 つのプラグインに対し 1 つのコマンドしか作成できません。

注:
  • 複数のディペンデンシー グラフ ノードやコマンドなどを実装する単一プラグインの作成は十分可能で、こちらがむしろ一般的です。このようなプラグインには、MSimple.h は使用できません。ユーザはプログラムを作成し、プラグインの機能を Maya に通知する必要があります。
  • このマクロの大きな制限事項は、元に戻す(Undo)が不可能なコマンドしか作成できないということです。この制限事項については、以下のセクションで詳しく説明します。

MStatus

メソッドの成功か失敗を表します。API クラスのほとんどのメソッドは、ステータス コードを MStatus で返します。返されるステータス コードについては、それぞれのメソッドの項で説明します。想定される他のステータス コードとのネームスペースの衝突を避けるには、すべての MStatus 値を「MS」でスコープ宣言します。たとえば、MS::kSuccess は成功を表すステータス コードです。コードの完全なリストは、MStatus.h にあります。

注:

API ではいくつかのステータス コードを使用しますが、エラー ロギングが MGlobal::startErrorLogging() を実行して API で有効になると、メソッドが MS::kSuccess 以外のものを返す場合に、詳細なエラー メッセージがエラー ログ ファイルに追加して出力されます。これについては、エラー チェックMStatus クラスエラー ロギングで詳細を説明しています。

DeclareSimpleCommand

DeclareSimpleCommand マクロには、コマンドの実装に使用するクラスの名前、コマンドのベンダ(作者)の名前、コマンドのバージョン番号という、3 つのパラメータが必要です。

MSimple.h と同じように、DeclareSimpleCommand() マクロでも、Maya がファイルをプラグインとして適切に認識するために必要となる登録コードを作成する必要がありません。しかし、単純化するために、コマンドの undo メソッドを指定できなくなっています。したがって、このマクロを使用して完全に元に戻す(Undo)が可能なコマンドを作成することはできません。

注:

元に戻す(undo)をサポートしていないコマンドで、決してシーンの状態を変更しないようにしてください。このようなコマンドは、シーンのさまざまな情報の検索に使用できますが、変更には使用できません。元に戻すが不可能なコマンドで変更を行うと、Maya の元に戻す(undo)機能が破壊されます。

Maya と対話するプラグインの作成

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

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++ プログラムのようにコマンド名にならず、コマンドの最初の引数になることです。