[Maya API] API memo – 08/12/16

ここ数日、APIと戦っていたので、メモ。
と思ったが、怒涛勢いで情報が流れ込んで来た為、何がなんだったかほとんど覚えていない。
ギャーーーー

ということでとりあえず直近で引っかかったところだけでもメモっときます。


xxx[0]みたいな、配列型のアトリビュートのプラグを取得したい時
// nodeはノードのMObjectとする。
MFnDependencyGraph dgFn(node);
MPlug crvDataPlug = dgFn.findPlug("worldSpace");
crvDataPlug = crvDataPlug.elementByLogicalIndex(0);

→findPlug(“worldSpace[0]”)とかやっても取れませんでした:P

transformをcreateNodeしたい時
MDagModifier dagmod;
MObject tr = dagmod.createNode("transform");

→これはずいぶんハマッた。。
 どうやらAPIでは、DGかDagか、というのをMELの数倍明確に意識してやる必要があるっぽい。
 両方ノードだから一緒じゃーん、ってMDGModifierでcreateNodeやってたら、MFn::kInvalidしか返ってこなくてMayaがエラーで落ちまくって、、、
 まだまだ勘所がつかめなくて大変。。
 これってUndoいらないならMFnDagNode.create()でもOKなのかな。
 とするとExporter的なものとかはMFnDagNodeでいいってことか、、、な?

ところで、
MObject tr = dagmod.createNode(“transform”);の部分は、
MObject tr(dagmod.createNode(“transform”));
の方がC++的には美しい形なのだろうか。

代入と初期化の違い、、とか?
でも結局コンストラクタで代入するんだとしたら一緒なんじゃないの?ってそんなことない?

あとこれは特にAPIに限ったことではないんですが、、
メモリ確保(変数宣言含め)の場所は良く考える
これです。

スクリプト言語のノリで適当にやってたら、思ったパフォーマンスの1/10ぐらいしかでなくて焦りました。
この辺少しまとめたらずいぶん速くなりました。
コマンドならちょい待てばいいんですが、ノードの場合、そうは烏賊のニャン玉なので、
今後は注意してみてやらんと、、、

いろいろ分からないこと多いです。。
要学習。。。!!

さて、、やっと動いた、、、
いろんなクラス使う必要があって、あっちゃこっちゃ行ったり来たり、、、
あぁもう面倒だな、APIよ。

まぁでも大体こんなもんですか。
スクリプトしか知らないド素人なので許してください。
精進します。

「[Maya API] API memo – 08/12/16」への4件のフィードバック

  1. MELでopenMayaPref -el on
    とするとカレントディレクトリにOpenMayaErrorLogというログファイルができます(ログはバッファされて書き込まれないことがあるのでopenMayaPref -el offしてから見た方がいいです)。

    $ cat /OpenMayaErrorLog
    API Error Log Opened Tuesday, December 16, 2008 9:38:16 PM
    Object is incompatible with this method
    Method: createNode
    Class: MDGModifier
    API Error Log Closed Tuesday, December 16, 2008 9:39:31 PM

    Pythonだとエラー直接表示、こうゆうところは便利ですねー。

    dgmodif.createNode(“transform”)
    dgmodif.doIt()# Error: (kInvalidParameter): Object is incompatible with this method
    # Traceback (most recent call last):
    # File “”, line 2, in ?
    # File “/engserv/rbuild/178/build/wrk/optim/runTime/Maya.app/Contents/Frameworks/Python.framework/Versions/2.4/lib/python2.4/site-packages/maya/OpenMaya.py”, line 2425, in createNode
    # RuntimeError: (kInvalidParameter): Object is incompatible with this method #

  2. >hohehohe2さん
    おお!
    そんな隠し(?)コマンドが!
    慣れていない分鼻も効かず、どこで何が起こってるのかが謎過ぎて困っていたので非常に助かります。
    ありがとうございます!

  3. > ところで、
    MObject tr = dagmod.createNode(”transform”);の部分は、
    MObject tr(dagmod.createNode(”transform”));
    の方がC++的には美しい形なのだろうか。
    > 代入と初期化の違い、、とか?
    > でも結局コンストラクタで代入するんだとしたら一緒なんじゃないの?ってそんなことない?

    おんなじ、ですね。どちらもcreateNode()で作られたMObjectが戻り値となり、それがコピーコンストラクタに渡されます。確か
    MObject tr = dagmod.createNode(”transform”);
    でコピーコンストラクタが呼ばれるようにしたのは組み込み型との互換性をとる為だった気が(どこで読んだのか忘れましたが)。

  4. >hohehohe2さん
    おおおおお、なるほど!
    これはずいぶんスッキリします。
    ご回答感謝です!

    > MObject tr = dagmod.createNode(”transform”);
    の方が慣れ親しんだ形ではあるんですが、
    > MObject tr(dagmod.createNode(”transform”));
    の方がオブジェクト指向的だなー、なんて思ったりします。

コメントを残す

メールアドレスが公開されることはありません。