kick the base

Houdiniと、CG技術と、日々のこと。

Houdini: テンプレートフラグを一括オフするツールを作りました

ああ忙しい忙しい。忙しい時は自動化だ!ということで小さなツールを作りました。

大きいネットワークで作業中、どこでテンプレートフラグが付いているか探しに行くのが大変なときがありますね。そんな時はこのツールを使うと幸せになるかもしれません。

現在操作しているSOPネットワークのテンプレートフラグを一括でオフにしてくれます。

目次

どんなときに使うの?

こんな感じでネットワークを寄りで使ってるとき、下記独り言を言った経験ありませんか。

「ああ!テンプレート表示が邪魔くさい!しかもどこのノードでテンプレートフラグが付いてるのかわからん!」

f:id:kickbase:20210311174737j:plain

引いてみるとこう。

f:id:kickbase:20210311174850j:plain

これらをすべてオフにして回るのもめんどうです。そこでシェルフツールの出番となります。

シェルフツールの解説

とても短いコードです。簡単な解説を書きますが、間違ってたりより良い書き方があればぜひ僕のTwitter ID、kickbaseまでご指摘いただけるととても喜びます。

main関数

  1. 現在開いているネットワークエディタの階層を取得し*1
  2. 階層のタイプがSOPだったら*2
  3. off_templateflags関数を実行します

off_templateflags関数

現在開いているネットワークエディタの階層にある子要素(ノード)をまるっとループしてテンプレートフラグをオフにします。

[ 追記 ]

ちょっと補足です。最初のコードではoff_templateflags関数は下記のようになっていました。

def off_templateflags(current):
    for child in current.children():
        hou.node(child.path()).setTemplateFlag(False)

でもこれだとエラーが出る時があるんですよね。SOPレベルに存在するノードの中でもROP FBX Outputなど、テンプレートフラグが存在しないノードがあるとHoudiniが困っちゃうというわけです。

f:id:kickbase:20210319163956p:plain

それを回避するために、下記のように修正しています。

def off_templateflags(current):
    for child in current.children():
        node = hou.node(child.path())
        if "setTemplateFlag" in dir(node):
            node.setTemplateFlag(False)

ポイントはif "setTemplateFlag" in dir(node):のところです。setTemplateFlagメソッドを持ってたら、実行するというかたちですね。

使い方

シェルフに登録したOffTempボタンをクリックするだけです。アイコンはhicon:/SVGIcons.index?NETVIEW_template_flag.svgを指定しています。*3

f:id:kickbase:20210311175747j:plain

シェルフツールの登録をしたことがないよ!という方は以前書いたこちらの記事にまとめていますのでご覧ください。

まとめ

非常に小さなツールですが、割とよくやる作業なので良さそうと思った方は使ってみてください。

*1:「現在開いているネットワークエディタの階層」ですが、複数のネットワークエディタを開いている場合はうまく取得ができないかもしれないのでゴニョゴニョしてください

*2:SOP以外のときはなにもしません

*3:Houdini自体のUIにあるテンプレートフラグアイコンです