MELやPythonでは一発でできない文字列操作用のカスタムコマンドをC++で作ろうと思い、久しぶりにOpenMayaを触ったんですが、ほとんど細かいところを忘れてしまっていました。
そのうちまた仕事で使うことになる可能性が高いので、思い出した内容を備忘録も兼ねてここに記していこうと思います。
とりあえず、カスタムコマンドにフラグなしの引数を与えて、戻り値を返す書き方すら忘れてしまっていたので、それを書いておきます。
シンプルな例として2つの引数を加算して戻り値で返すだけのmyCommandコマンドを作ることを考えます。Mayaで実行すると次のように結果が返るコマンドです。
まずカスタムコマンドを作るためにはMPxCommandクラスを継承したクラスを作る必要がありました。myCommandコマンドの中身を定義するMyCommandクラスをMPxCommandを継承して作ります。
下記はMyCommandクラスのdoIt関数の中身です。
args.asInt(0, stat)で0番目の引数の値を整数型で取得します。statには成功したか失敗したかが入ります。同じくargs.asInt(1, stat)で1番目の引数の値を整数型で取得します。
最後にsetResult(res)で戻り値にresの値が設定されます。
そのうちまた仕事で使うことになる可能性が高いので、思い出した内容を備忘録も兼ねてここに記していこうと思います。
とりあえず、カスタムコマンドにフラグなしの引数を与えて、戻り値を返す書き方すら忘れてしまっていたので、それを書いておきます。
シンプルな例として2つの引数を加算して戻り値で返すだけのmyCommandコマンドを作ることを考えます。Mayaで実行すると次のように結果が返るコマンドです。
myCommand 4 7;
// Result: 11 //
// Result: 11 //
下記はMyCommandクラスのdoIt関数の中身です。
MStatus MyCommand::doIt(const MArgList& args)
{
MStatus stat;
int res;
//** check number of arguments
if(args.length() != 2) {
return MStatus::kFailure;
}
//** get 1st argument as MString
int a = args.asInt(0, &stat);
if(stat!=MS::kSuccess)
{ return MStatus::kFailure; }
//** get 2nd argument as int
int b = args.asInt(1, &stat);
if(stat!=MS::kSuccess)
{ return MStatus::kFailure; }
//** main operation(add 2 values)
res = a+b;
//** set return value
MPxCommand::setResult(res);
return MStatus::kSuccess;
}
args.asInt(0, stat)で0番目の引数の値を整数型で取得します。statには成功したか失敗したかが入ります。同じくargs.asInt(1, stat)で1番目の引数の値を整数型で取得します。
最後にsetResult(res)で戻り値にresの値が設定されます。
本当に基本的なことですが、最近記憶力が衰えてきて、しばらく触っていないと忘れてしまいます。メモはつけるように心がけたいです。