API ガイド > コマンド プラグイン >

# フラグ

コマンドで、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;
    }