構文オブジェクトにはフラグが必要です。ショート フラグとロング フラグの両方を定義する必要があります。ショート フラグは 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;
}
構文オブジェクトを作成するメソッドは、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;
}