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

Houdiniにはノード上のパラメータが更新されたときに自動でPythonスクリプトを実行してくれる機能があります
Edit Parameter Interface内のCallback ScriptにPythonを書けば値の変更時にそのPythonを実行してくれます
![bandicam 2019-11-16 21-57-31-466.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308102/e4fe4b0f-e3a3-8aab-3133-688a0b6975da.jpeg)

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

一番簡単な定義の方法はメニューの
Windows > Python Source Editorを開いてその中に関数定義を書くことです
![bandicam 2019-11-20 10-51-42-016.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308102/330b59f9-52d4-115a-60f0-e58fcd642b6a.jpeg)
![bandicam 2019-11-16 22-06-49-389.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308102/70347c03-cc88-3e00-adf7-01f436d47991.jpeg)

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

例えば、

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


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

```python
#パラメータを指定してコピー
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))
```


![bandicam 2019-11-16 22-32-19-427.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308102/cfd4f093-4a47-565f-a6dc-cf93a7b550fa.jpeg)
コピー元のパスとコピー先のパスを文字列(string)として受け取ってforでループしながらコピーするコードです

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

ノードを操作するとき使うもの↓
[hou.node HOM function](https://www.sidefx.com/ja/docs/houdini/hom/hou/node_.html)
[hou.nodes HOM function](https://www.sidefx.com/ja/docs/houdini/hom/hou/nodes.html)
[hou.Node class](https://www.sidefx.com/ja/docs/houdini/hom/hou/Node.html)

パラメータを操作するとき使うもの↓
[hou.parm HOM function](https://www.sidefx.com/ja/docs/houdini/hom/hou/parm_.html)
[hou.Parm class](https://www.sidefx.com/ja/docs/houdini/hom/hou/Parm.html)

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

パラメータを操作するときは`b = a.parm('tx')`と書くと`b`に代入されるのはhou.Parm型のクラスで、`b`を使ってパラメータを操作できます→[hou.Parm class](https://www.sidefx.com/ja/docs/houdini/hom/hou/Parm.html)

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

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

##null1からnull2にコピー

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

null1のCallback Scriptには次のように書いて関数を呼び出します
![bandicam 2019-11-16 22-53-26-969.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308102/d1b108bc-ef0e-a9db-9e7d-937fdaea80fa.jpeg)
`hou.session.Send('.','../null2','t2x t2y t2z')`

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

null1のt2xに0.3と入れてみると、null2のt2xも0.3に変わりました
![bandicam 2019-11-16 21-44-42-466.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308102/db5792d5-9408-a6ba-2350-9a7179b9e1f4.jpeg)


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

![bandicam 2019-11-20 10-59-43-402.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308102/bdc92c61-b48f-279e-a913-4ca8281305f4.jpeg)

この場合はボタンのCallback Scriptにボタンを押した時、実行したいスクリプトを記述しましょう
![bandicam 2019-11-20 11-03-15-849.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308102/114d64e6-5b68-f14c-d016-1901e995c0c2.jpeg)