[OpenMaya] CompoundAttributeの値取得方法

前回作成したCompoundAttributeの値の取得方法がわかったのでメモ。

 

CompoundAttributeは、↑のようにいくつかのAttributeをグループ化したアトリビュートです。

調べていっても、コレの使い方の参考が見つからず、それぞれのノードのアトリビュートにアクセスする方法が分からなくてヽ(`Д´)ノウワァァァンになりました。

サンプルは、CompoundAttributeの Num を合計した値を output に出力するノードです。

まず、MDataBlockからCompoundAttributeのHandleを取得します。
アトリビュートを作成したときに setArray(True) にしていた場合は、Handleを取得する時も
arrayで取得します。( inputArrayValue(AttributeObject) )

CompoundAttributeの子供の値を取得するには

1 jumpToElement[num]     で、数字の配列にシーク
2 arrayHanle.inputValue() で、指定の配列のMDataHanle()を取得
3 MDataHandle.child( AttributeのMObject ) で、
取得したいCompoundAttributeの子供のAttributeのHandleを取得
4 MDataHandle.asXXXX() で、値を取得


の順でコマンドを書きます(めんどくさい)

こんな感じで、シークしてHandle取得して、Childで子供を取得 というのが基本の流れで
子供アトリビュートが増えたり、孫アトリビュートとかがでてきても、同じような感じでやればOK?
のようです。

サンプルの場合は、CompoundAttributeの要素数を取得して、その数分だけループして合計を
outNumにセットしています。

微妙に間違って最後悩んだのが、 handle.asFloat() で値を取得するときに
asDouble() にしていて、取得した値が全然違う小数点の数字になってしまったこと。
ここの asXXX() は、アトリビュートを作成したときに、 create() の3番目の引数で指定したもの
にする必要があります。(言われてみれば当たり前なんですが(´Д`))

*追記メモ*
Attributeを作成して、Computeで計算して、結果を出力するときは、 inputとoutputの関係を
initializer内に記述する必要があります。
書き方は
cls.attributeAffects(inputAttr, outputAttr)
これを入れると、Attributeの値が変わった時にCompute内が実行され、outputAttrの
値が更新されます。

そんなこんなでできあがったののノードプラグインが
https://gist.github.com/fereria/9252846 こちら
長いのでリンクのみをば。

おおむね、アトリビュートの作成と取得の方法はわかったので、次はMeshやらCurveやらの作成
をもう少し調べてみようかと思います。

まだまだ続くよどこまでも。

コメントを残す

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


*