メインコンテンツまでスキップ

Schedulerを作る~パラメーター定義

Image from Gyazo

PythonScheduler は、 Save to Python Script を押すことで
ノードではなく Python スクリプトのプラグインとして保存することができます。
今回は、この Python スクリプト化をしたうえで、スケジューラーの実装に必要な手順を
順番に実装していきます。

Image from Gyazo

Save to Python Script を押すと、このような保存画面が表示されます。
PDG は、HOUDINI_PATH 下の pdg/types に指定の形式の Python を保存することでノードを作成することができます。

Image from Gyazo

追加すると、このようにスケジューラーを追加することができます。

def registerTypes(type_registry):
type_registry.registerScheduler(sample_pythonscheduler, label="Sample Scheduler", parm_category="OrigScheduler",node_category="SampleScheduler")

PDG の表示は、保存した Python スクリプトのレジストリ部分を書き換えることで変更できます。
label がノード名、parm_category が、カテゴリになります。 node_category はこの後のパラメーター設定で使用します。

Image from Gyazo

上記のコードの場合は、このようになります。 これで準備ができました。

パラメーターを作る

Image from Gyazo

デフォルトだと、このようにパラメーターがすべて列挙された状態になるので
カスタムパラメーターを足しても微妙になります。
ので、まずはここを整理してパラメーターを追加します。

https://www.sidefx.com/ja/docs/houdini/tops/custom_scheduler.html#spare

作成するには、Spare パラメータを追加します。

open("C:/Users/USER_NAME/Documents/houdini20.5/topscheduler.user.ds", "w").write(hou.node("/tasks/topnet1/pdg_sample_pythonscheduler1").parmTemplateGroup().asDialogScript(full_info=True))

まず、現在のノードのパラメーターを保存します。
作成しているスケジューラーノードを指定して、指定のフォルダ以下に保存をします。
HOUDINI_PATH が通っている場所なら大丈夫なので、MyDocuments の HoudiniVersion フォルダ以下に
保存します。

そのままだとエラーになってしまうので、いくつか書き換えをしつつ新しいパラメーターを追加します。

https://gist.github.com/fereria/68423152aff60c436e4e6ad0e75674fc

全文はこちら
ポイントは、collection で全体をくくることと、
コレクションとグループに対して、node_category で指定した名前をいれます。

collection {
name "sample_pythonscheduler"
label "Sample Scheduler"
parmtag { spare_category "SampleScheduler" }
group {
name "settings"
label "Settings"
parmtag { spare_category "SampleScheduler" }
parm {
name "sample_int"
label "Load Item Data From"
type ordinal
default { "0" }
menu {
"0" "Value_0"
"1" "Value_1"
}
}
}
}

スケジューラー本体のパラメーターは以下のようにします。

    @classmethod
def templateBody(cls):
return json.dumps(
{
"name": "pythonscheduler1_template",
"parameters": [
{
"name": "sample_int",
"label": "Sample Value",
"type": "Integer",
"value": 0,
"tag": ["pdg::scheduler"],
}
],
}
)

この状態で Houdini を再起動して、パラメーターを確認します。

Image from Gyazo

Node Properties を見ると、先ほど編集したパラメーター情報が表示されます。
表示はされますがこのままだと表示できないので、 Existing Parameters を削除して
このパラメーターをインストールします。

Image from Gyazo

Delete Parameters で削除してから、

Image from Gyazo

Install Parameters を実行します。

Image from Gyazo

戻ると、このように topscheduler.user.ds の group がタブ扱い
メニュー形式の UI も作成できます。

ただ、毎度パラメーターを作るのはめんどくさいので
ノード作成時などに自動でパラメーターを追加する仕組みを追加します。

Type Properties を開いて、ノード名を確認します。

Image from Gyazo

pdg_sample_pythonscheduler という名前でしたので、このノードが作られた時とロードされたときに
パラメーターをいい感じにするスクリプトを作成します。

Image from Gyazo

場所は、HOUDINI_PATH/scripts/top 下で
名前_OnCreated.py 名前_OnLoaded.py にします。

OnCreated は、

node = kwargs['node']

if node:
node.removeSpareParms()
templ = hou.properties.parmTemplate('top', 'sample_pythonscheduler')
parmtuple = node.addSpareParmTuple(templ, (), False)

現在のパラメーターを削除してから、SpareParm を足します。

OnLoaded は、

node = kwargs['node']

if node:
vals = {}
for i in node.spareParms():
vals[i.name()] = i.rawValue()

node.removeSpareParms()
templ = hou.properties.parmTemplate('top', 'sample_pythonscheduler')
parmtuple = node.addSpareParmTuple(templ, (), False)

for name in vals.keys():
parm = node.parm(name)
if parm:
if isinstance(parm.parmTemplate(), hou.ToggleParmTemplate):
parm.set(1 if vals[name] == 'on' else 0)
else:
parm.set(vals[name])

設定済の値を保存してからパラメーターを更新する処理を実行します。

parmTemplate で指定する名前は topscheduler.user.ds の collection で指定した名前です。

Image from Gyazo

ここまでできたら、ノードを作成した段階でこのように Tab や Menu が表示された状態になります。

パラメーターを足したい場合は topscheduler.user.ds と スケジューラーの Python の
パラメーターに足せば OK です。

https://www.sidefx.com/ja/docs/houdini/hom/locations.html#node_event_files

ハンドル周りはこのあたりを参考にしました。

あとはスケジューラーの処理を書いていくのですが、それはまた次に。