[python] Mayaのノードで再帰処理テスト

再帰処理の書き方をいつも忘れてしまうのでメモついでに。
ついでに、Python的な書き方も試してみました。

まず1つめ。
トップノードからノードを検索して、1つずつ調べるような処理を書きたい場合。

DAGのルートノードのみを取得したい場合は、select(ado=True)でトップノードを選択し、
そのノードを取得できます。

続いて再帰処理。
再帰処理で何か数値を返したい場合、関数の引数にreturn用の変数を渡したり、globalで変数を定義しないといけない…
なんかどちらもしっくりこなかったのですが、

pythonの場合、関数の中に関数を定義するという気持ちの悪い所行が可能…
なので、関数の中に再帰処理関数を定義して、return する という書き方にしてみました。
↑の場合は、 listRelatives(ad=True)してるのと同じですが、
ret_val.append(node) の前後で、nodeに対して処理をしたり
nodeのタイプをチェックして特定の処理をする…などを行えるので、DAGノードに対して複雑な検索を
するには有効な手かなぁと思います。

続いてDGノードの場合。

search_shader

こんな感じのシェーディングネットワークがあった時に、
シェーダー以外のノードを選択して、シェーダーノードを検索する処理を書きたい場合。
(↑なら、 p2dTextureノード選択で、lambert2 lambert3 を取得したい)

まず、引数のノードのoutput先のノードを取得するコマンド。
connections(c=True,p=True) とすると、
(自分自身のoutput or input のアトリビュート,接続先ノード名)
の配列が取得できます。

(Attribute(u’place2dTexture1.translateFrame’), nt.File(u’file1′))

p2dTexture をconnections(c=True,p=True) すると、こんな感じのタプルの配列が取得できます。
しかし、この時点だと、(自分、相手)とう順序で帰ってくるだけで、input なのか outputなのかが分かりません。
なので、 node.isSource() で、outputのもののみを取得して、そのoutput先のノードを配列にいれ、
重複しているものを削除してreturnしています。

続いて、シェーダーを取得する再帰処理

指定のノードの場合は返すようにして、指定のノード以外(shadingEngineにつながっているもの)や、どこにも繋がっていないノード
はスキップして、指定のノードがあった場合returnします。

再帰処理を利用すると綺麗に書ける処理は結構あるので、これ以外にも色々と試してみようと思います。

まだまだ勉強だー

[python] Mayaのノードで再帰処理テスト」への1件のフィードバック

  1. 自分自身を使う再帰もありそうです。 🙂

    def get_child_node(root_node):
    ____ret_val = []
    ____
    ____# 何か処理を書く。戻すなら ret_val
    ____ret_val.append(root_node)
    ____
    ____c = mc.listRelatives(root_node, なにやら〜)
    ____for i in (c or []): #c is None を [] 扱いに
    ________ret_val += get_child_node(i)
    ____return ret_val

コメントを残す

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


*