フラグ

コマンドで、doIt() メソッドに渡された MArgList からフラグのような文字列を直接解析することはできますが、これはコマンドを MEL からコールする場合のみ可能です。 Python では、フラグの指定にまったく異なる構文を使用し、フラグに MArgList からアクセスすることすらできません。

構文オブジェクトを利用すると、コマンドのフラグの指定、検証、解析といったタスクが簡単で、MEL と Python の両方で同じように作業できます。

フラグを定義するとき、フラグ名のショート バージョンとロング バージョン両方を指定する必要があります。ショート フラグは 3 文字以下、ロング フラグは 4 文字以上です。

これらのフラグは、#define 宣言を使用して 1 カ所で定義します。たとえば、scanDagSyntax では次のフラグを使用します。

#define kBreadthFlag "-b"
#define kBreadthFlagLong "-breadthFirst"
#define kDepthFlag "-d"
#define kDepthFlagLong "-depthFirst"

構文オブジェクトを作成する

コマンドクラスに、コマンドの構文が設定される newSyntax メソッドを作成する必要があります。このメソッドは、構文オブジェクトである MSyntax を返すスタティックなメソッドであることが必要です。

newSyntax メソッド内で、必要なフラグを構文オブジェクトに追加して、それを返す必要があります。

scanDagSyntax クラスの newSyntax は、次のように定義します。

class scanDagSyntax: public MPxCommand
{
    public:
        ...
        static MSyntax newSyntax();
        ...
};
MSyntax scanDagSyntax::newSyntax()
{
    MSyntax syntax;
    syntax.addFlag(kBreadthFlag, kBreadthFlagLong);
    syntax.addFlag(kDepthFlag, kDepthFlagLong);
    ...
    return syntax;
}

引数を解析する

慣習的に、コマンドの引数は一般的に doIt からコールされる parseArgs メソッドで解析されます。この parseArgs メソッドは、構文オブジェクトおよびコマンドの引数で初期化される、ローカルな MArgDatabase を作成します。MArgDatabase には便利なメソッドがあり、これを使用すると、どのフラグが設定されているか判断できます。

注:

別途指定しない限り、すべての API メソッドでは Maya の内部単位(cm およびラジアン)が使用されます。

MStatus scanDagSyntax::parseArgs(const MArgList &args,
                                 MItDag::TraversalType &
                                 traversalType,
                                 MFn::Type &filter,
                                 bool &quiet)
{
    MArgDatabase argData(syntax(), args);
    if (argData.isFlagSet(kBreadthFlag))
        traversalType = MItDag::kBreadthFirst;
    else if (argData.isFlagSet(kDepthFlag))
        traversalType = MItDag::kDepthFirst;
    ...
    return MS::kSuccess;
}

コマンドのフラグを複数回使用する

MSyntax クラスでは、コマンド コールでフラグを再度使用することができます。たとえば、次のようにコマンドに複数の文字列を指定することができます。

	printDagNodeInfo -name "pSphere1" -name "pSphere2";

プラグイン コマンドでフラグを多重使用する場合、フラグが繰り返し使用される場所を特定するためのコーディングが別途必要になります。以下のコード スニペットは、多重フラグの使用例です。

#define NFLAG "-nm"
#define NFLAGLONG "-name"
MSyntax nodeInfo::newSyntax()
{
    MSyntax syntax;
    syntax.addFlag(NFLAG, NFLAGLONG, MSyntax::kString) ;
    syntax.makeFlagMultiUse(NFLAG) ;
    return syntax;
}
MStatus nodeInfo::parseArgs( const MArgList& args )
{
    MStatus status = MS::kSuccess;
    // Arg database and also find the
    // number of uses of the NFLAG
    MSyntax syntax = newSyntax();
    MArgDatabase parse( syntax, args) ;
    int num = parse.numberOfFlagUses(NFLAG) ;
    // Iterate and find all uses of the NFLAG
    unsigned int pos;
    for(int i = 0 ; i < num ; i++)
    {
        // First we get the position
        status = parse.getFlagArgumentPosition(NFLAG, i, pos) ;
        if(status != MS::kSuccess)
        return status;

        // Then we get the argument
        MArgList mArgs1;
        parse.getFlagArgumentList(NFLAG, i, mArgs1);
        MString str( mArgs1.asString(0) );
        MGlobal::displayInfo( str );
    } 
    return status;
} 

登録

構文オブジェクトを作成するメソッドは、initializePlugin メソッドでコマンドを使用して登録します。

MStatus initializePlugin( MObject obj )
{ 
    MStatus status;
    MFnPlugin plugin(obj, "Autodesk - Example", 
        "2.0", "Any");
    status = plugin.registerCommand("scanDagSyntax",
        scanDagSyntax::creator,
        scanDagSyntax::newSyntax); 
    return status;
}