コマンドで、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 には便利なメソッドがあり、これを使用すると、どのフラグが設定されているか判断できます。
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; }