Pythonでパラメータの値を移す


Houdiniにはノード上のパラメータが更新されたときに自動でPythonスクリプトを実行してくれる機能があります
Edit Parameter Interface内のCallback ScriptにPythonを書けば値の変更時にそのPythonを実行してくれます

方法

Callback Scriptの欄には一行分しか書くスペースが無いので、どこかに実行する関数を定義しておいてそれを呼ぶようにします

一番簡単な定義の方法はメニューの
Windows > Python Source Editorを開いてその中に関数定義を書くことです

ここに関数を書いておけばhou.sessionからアクセスできます

例えば、

def func():
    pass

という関数定義の場合、hou.session.func()で呼び出せます

実際に書いてみます
下記は一例です

#パラメータを指定してコピー
def Send(from_path, to_path, params):
    from_path = hou.nodes(from_path.split())
    to_path = hou.nodes(to_path.split())
    params = params.split()
    for f, t in zip(from_path,to_path):
        for p in params:
            t.parm(p).set(f.evalParm(p))


コピー元のパスとコピー先のパスを文字列(string)として受け取ってforでループしながらコピーするコードです

HoudiniをPythonで操作するにはhouに含まれるクラスや関数を使います
↓が参考になります
hou package
https://www.sidefx.com/docs/houdini/hom/hou/index.html

ノードを操作するとき使うもの↓
hou.node HOM function
hou.nodes HOM function
hou.Node class

パラメータを操作するとき使うもの↓
hou.parm HOM function
hou.Parm class

例えばa = hou.node('../null')と書くと、このaを使って'../null'のノードを操作できます
aにはhou.Node型を継承した何かしらのクラスが代入されているので、これを使うにはhou.Node classを見ると良いです 様々なクラス内関数があります

パラメータを操作するときはb = a.parm('tx')と書くとbに代入されるのはhou.Parm型のクラスで、bを使ってパラメータを操作できます→hou.Parm class

hou.Parm classでよく使う関数はsetevalでしょう
b.set(888)と書くとtx888に更新します
c = b.eval()c888等の値が代入出来ます

ちなみにabを使うのは冗長なのでhou.node('../null').parm('tx').set(888)と書けば一発です

null1からnull2にコピー

null1とnull2ノードを作って値をコピーしてみます

null1のCallback Scriptには次のように書いて関数を呼び出します

hou.session.Send('.','../null2','t2x t2y t2z')

'.'は呼び出したノード(この場合はnull1)を表す文字列です
t2x t2y t2zはパラメータの名前です

null1のt2xに0.3と入れてみると、null2のt2xも0.3に変わりました

ボタンを押した時に実行

上の例ではt2xの変更ですぐに関数が実行されましたが、ボタンを作っておいてユーザーがボタンを押したタイミングで値をコピーすることもできます

この場合はボタンのCallback Scriptにボタンを押した時、実行したいスクリプトを記述しましょう