フラグと引数

スクリプト エディタからコマンドを呼び出すときに、フラグと引数をコマンドに渡すことができます。

コマンドでフラグと引数を使用するには、フラグを定義する構文オブジェクト MSyntax を作成し、フラグと引数を抽出できるオブジェクト MArgDatabase を作成してコマンド ラインからこれらを解析する必要があります。

フラグはコマンドに対する名前付きのオプションです。各フラグには、引き渡すパラメータとして引数を与えることができます。たとえば、polyCube コマンドの場合、「sx」、「sy」、「sz」、「h」はコマンド フラグ、10、15、5、20 は各フラグの引数です。

polyCube -sx 10 -sy 15 -sz 5 -h 20;

名前付きフラグを必要としない引数も、コマンドに渡すことができます。たとえば、circle1sphere1 は、この group コマンドに渡される引数です。

group -n group1 circle1 sphere1;

フラグとその引数は、MSyntax::addFlag() メソッドを使用して構文オブジェクトに追加します。newSyntax() 関数を実装して、フラグのロング ネーム、ショート ネーム、および引数タイプを設定します。

MSyntax myCommand::newSyntax()
{
    MSyntax syntax;
    syntax.addFlag("-f", "-firstFlagLongName", kUnsigned);
    syntax.addFlag("-s", "-secondFlagLongName", kString);
    return syntax;
}

addFlag() の 3 番目のパラメータは、フラグの引数タイプを定義します。このパラメータを省略した場合、フラグは引数を取りません。引数タイプをパラメータとして渡すには、タイプを kSelectionItem に設定します。

名前付きのフラグを必要としない引数を追加するには、MSyntax::addArg() を使用します。

構文オブジェクトは initializePlugin()registerCommand() に渡されます。

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

引数とフラグは doIt() で解析されます。規則により、解析は doIt() によって呼び出される parseArgs() 関数で実行されます。コマンド コードに parseArgs() を実装する必要があります。

解析は、MArgDatabase オブジェクトを作成することで行われます。MArgDatabase には、構文オブジェクトの情報を使用して MArgList 内でコマンドに渡されたフラグと引数を解析するメンバー メソッドが含まれています。

MStatus myCommand::parseArgs(const MArgList& args)
{
    unsigned firstFlagArg;
    MString secondFlagArg;
    MArgDatabase argData(syntax(), args);
    [...]
    if (argData.isFlagSet("-f")) 
        argData.getFlagArgument("-f", 0, firstFlagArg);
    if (argData.isFlagSet("-s"))
        argData.getFlagArgument("-s", 0, secondFlagArg);
    [...]
}

同じコマンドで同じフラグを再利用できます。例:

myCommand -f 3 -s "hello" -s "there"

これを行うには、MSyntax::makeFlagMultiUse() を使用してフラグを多目的に使用するように宣言する必要があります。次に、MArgDatabase::numberOfFlagUses() を使用してフラグが使用された回数を特定し、MArgDatabase::getFlagArgumentPosition() を使用してフラグの特定の用途ごとに引数の位置を取得する必要があります。その後、MArgDatabase::getFlagArgument() を使用して引数を抽出する必要があります。