フラグ
 
 
 

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