2013年10月18日金曜日

Nuke Python 特定のクラスのノードの取得


全てのノードを取得

nuke.allNodes()
選択している全てのノードを取得
nuke.selectedNodes()


という関数達ですが、これ()の中でクラスを指定すると指定したクラスのノードだけ取得出来るんですね。

全てのノードからReadノードだけ取得
nuke.allNodes('Read')
選択しているノードからReadノードだけ取得
nuke.selectedNodes('Read')


クラスの調べ方はノード選択して「i」を押すと2行目に「Class=Read」みたいに書いてあったり
node.Class()
でクラス名を取得出来るので、ノードを一個選択して
print nuke.selectedNode().Class()
などでクラス名を調べることが出来るようです。

【例文】全てのReadノードのファイル名を取得
for n in nuke.allNodes('Read'):
    f = n['file'].value()
    print f

【例文】全てのVectorBlurをオン
for n in nuke.allNodes('VectorBlur'):
    n['disable'].setValue(False)

【例文】全てのVectorBlurをオフ
for n in nuke.allNodes('VectorBlur'):
    n['disable'].setValue(True)


【例文】重いと評判の全てのVectorBlurのオン/オフするツール
重いと評判のVectorBlurをオン/オフするツールを作ってみましょう。
ところで、UIを持つツール作るの結構面倒ですよね。
一番簡単な方法はManage User Knobを使って特定ノードを拡張する方法でしょうか

「NoOp」や「BackDropNode」など当たり障りのないNodeを作成

適当なところを右クリックして「Manage User Knobs...」を選択

Addから「Python Script Button」を選択
Nameに適当な名前を入力。Labelは表示されるボタンのテキストなのですが空白の場合はNameと同じものに設定されます。
Script:部分にボタンが押されたときに実行されるスクリプトを書きます。
全てのVectorBlurをオフにするスクリプトはこんな感じみたいです。

for n in nuke.allNodes('VectorBlur'):
    n['disable'].setValue(True)
コードが書けたら「OK」押す
全てのVectorBlurをオフにするボタン完成
同じ要領でオンにするボタンも作ります。
Start new lineのチェックを外しておくと横並びになります。
全てのVectorBlurをオンにするパイソンコードは以下の感じになるようです。
for n in nuke.allNodes('VectorBlur'):
    n['disable'].setValue(False)
全てのVectorBlurをオン/オフするツール完成
【例文】色んなノードのオン/オフ
もうちょっとだけ拡張してみましょうか。色んなノードに対応出来るようなものを作ってみましょう。
先に必要なパーツ揃えます。
Addから「Text input Knob」を選択

Nameを「ClassName」とします。今回は値を参照するためこのNameがとても大切になってきます。
スクリプトで参照する際はこのNameを指定します。Labelは表示される文字なのでどーでもいいです。
Add→Python Script Buttonでオンにするボタンを作成。Start new lineはオフにしました。
Add→Python Script Buttonでオフにするボタンを作成
必要なパーツ完成。Scriptを記述していないので、ボタンを押しても何も起きません。
Classの文字列を取得して表示する仕組みを実装してみます。
Manage user knob → onを選択 → Editを押す
Script部分に以下のスクリプトを記述します。

n = nuke.thisNode()
c = n['ClassName'].value()
print c

書けたら全部閉じてscript Editorを立ち上げて下さい。

Propertiesの文字とかを右クリックするとあります。
Classに適当な文字を入力して「On」のボタンを押すと。Script Editorの上の方入力した文字が出力される。
連打する事で大量のyamagishiを表示出来ます。楽しいですね。
Classから文字列を取得する仕組みが出来たので、Classに入力したクラスのオンオフをするように書き換えていきます。


n = nuke.thisNode()
c = n['ClassName'].value()
for node in nuke.allNodes(c):
    node['disable'].setValue(False)
オフの方は割愛しますが、上のsetValue()の中身をTrueにしたものを記述して下さい。

n = nuke.thisNode()
c = n['ClassName'].value()
for node in nuke.allNodes(c):
    node['disable'].setValue(False)

Classに「VectorBlur」と書くと全てのVectorBlurをオンオフする。
Classに「Read」と書くと全てのReadノードをオンオフする。

と、こんな感じです。
今回は文字列でしたが、スライダーやカラーパレットからも値を取得出来るので色々試してみると夢が広がるかもしれません。慣れてきたらPythonPanelを使ったり、さらにはPySideで俺俺UIを実装してみたり。

ちなみにですが、WriteノードにはPythonタブがあり、ここの
befor renderがレンダリング前に実行するPythonコード
after renderがレンダリング後に実行するPythonコード


全てのVectorBlurのオンオフは
オン
for n in nuke.allNodes('VectorBlur'):
    n['disable'].setValue(False)
オフ
for n in nuke.allNodes('VectorBlur'):
    n['disable'].setValue(True)

なので、before renderにオンするスクリプトをペーストして、after renderにオフにするスクリプトをペーストする事で、レンダリングする際に全てのVectorBlurをオンにして、レンダリングが終わったら全てのVectorBlurをオフにするというようなWriteNodeの完成ですね。

0 件のコメント:

コメントを投稿