2018年12月16日日曜日

[houdini] node作成時に独自パラメーターを追加する方法

ノード生成時に独自のパラメーターを追加する方法を説明します。
(かれこれ5、6年前のh11とかh12の頃にやってた事なので、
 既知の内容かもしれませんが。。。)

例として、
ropのgeometryノードにパラメーターを追加します。

ここでは、geometry ropが元々持っているパラメーターを、
「Default」と言うフォルダ(タブ)を作ってそちらに全部入れ、
その上で新たに「Backburner」と言う名前のタブを追加してます。

これはデフォルトのパラメーター、    
 

こちらが新たに追加したタブとパラメーター

















どうやるか?

Houdiniには、
ノードが作成された直後、用意したスクリプトを実行してくれる仕組みがあります。

・OnCreated.py(どんなノード生成時も実行される)
・ノードタイプ名.py(ノードタイプ名のタイプのノードが作成された時だけ実行)
・ノードタイプ名_oncreated.py(HDAの場合)

上記スクリプトの中でパラメーターを追加するコードを書いておけば、
ノード生成時に独自のパラメーターを追加しておく事が可能です。


・OnCreated.py、ノードタイプ名_oncreated.pyは、
HOUDINI_PATHに通したパスの中の、/scripts/pythonに
ファイルを置いておけば実行してくれます。

・ノードタイプ名.pyは、
ノードはカテゴリ分けされており、
HOUDINI_PATHに通したパスの中の、/scripts/カテゴリ名フォルダ
にファイルを置いておけばいいです。


パラメーターの作り方

pythonでパラメーターを作成、追加することは可能ですが、
手動でコード書くのはかなりめんどくさい・・・

そこで、houdini上のUIでパラメーターを作成し、
それをpythonコードとして書き出す事ができるので、
書き出しておいて、後はそれを実行することで追加していきます。

パラメーターの追加は以下「Edit Parameter Interface」








「Backburner」以下追加してます。
















houdiniのパラメーターの持ち方

houdiniは、個々のノードが、parmTemplateGroupと言う入れ物を持っており、
この中にパラメーターとなるオブジェクトを持ってます。

各パラメーターは、
parmTemplateと言うクラスから派生したオブジェクトとなっており、
parmTemplateGroupが、それを持っています。

parmTemplate class
http://www.sidefx.com/docs/houdini/hom/hou/ParmTemplate.html

parmTemplateGroup class
http://www.sidefx.com/docs/houdini/hom/hou/ParmTemplateGroup.html




Pythonでノードにパラメーターを追加する方法

以下でまさにサンプルコードが載ってます。
http://www.sidefx.com/docs/houdini/hom/hou/Node.html#parmTemplateGroup

順を追って説明すると、

# ノードを作成(/obj以下にgeometryノードを作成)
node = hou.node("/obj").createNode("geo")

# ノードが持つparmTemplateGroup()(箱)を取得
group = node.parmTemplateGroup()

# My Parmsと言うラベルの付いたフォルダを作成
(フォルダはパラメーターのタブに当たります)
folder = hou.FolderParmTemplate("folder", "My Parms")

# フォルダにfloat型の myparm という名前のパラメーターを追加
folder.addParmTemplate(hou.FloatParmTemplate("myparm", "My Parm", 1))

# 最初に取得したparmTemplateGroup(箱)にフォルダごと追加
group.append(folder)


で、最後がポイントなのですが、
上記、group.append(folder) で、
parmTemplateGroup()で取得した箱にフォルダを追加しているのですが、
この時点ではノードにパラメーターは追加されず、何の変化もありません。

このparmTemplateGroup()で取得した箱と言うのは、
あくまでコピーを取得しており、
もはや実際のノードがもつ箱ではないので、
これに何を追加してもノードには反映されません。

ではどうするか、
最後に以下を行うことで追加したパラメーターを持つ箱parmTemplateGroupをセットでき、
めでたくパラメーターを追加することが可能になります。
node.setParmTemplateGroup(group)