Pythonでは、モジュールが関数、クラス、定数を共通ネームスペースにまとめることができます。
例えば、os
がモジュールで、os.getcwd
がそのモジュール内の関数です。
その関数に対してPythonアトリビュートを検索することで、そのモジュールの内容にアクセスすることができます。
HDAModuleは、特定のデジタルアセットタイプに関連したPythonモジュールです。 このモジュールによって、あなたのアセット内の、ある場所にPythonコードのライブラリを保存することができます。 そして、そのアセット内のパラメータ、イベントハンドラー、コールバックから、そのライブラリを呼び出すことができます。
このモジュールのソースコードは、 Type Properties ダイアログ内の Scripts タブの Python Module セクションに保存します。
例えば、デジタルアセットがgear
オブジェクトと仮定すると、そのPython Moduleセクションは以下のコードを含みます:
def position(): return (hou.frame() * 1.2, 0.0, 3.2) def onButtonPress(): print "you pressed the button" def onLoaded(): print "onLoaded section running"
名前でアクセスする標準のPythonモジュールとは違い、そのノードタイプに対してhou.NodeType.hdaModuleをコールすることで、デジタルアセットのPythonモジュールにアクセスします。 例えば、gearという名前のオブジェクトレベルのデジタルアセットを作成したとすると、そのPython Moduleセクションに上記のコードを記述します。 以下のように、Pythonモジュールの内容にアクセスすることができます:
>>> node_type = hou.nodeType(hou.objNodeTypeCategory(), "gear") >>> node_type.hdaModule().position() (1.2, 0.0, 3.2) >>> node_type.hdaModule().onButtonPress() you pressed the button
Pythonモジュールの1つの使用方法は、デジタルアセット内のノードのパラメータエクスプレッションを駆動させることです。
例えば、/obj/gear1
がデジタルアセットのインスタンスとすると、/obj/gear1/geo1
がそのアセット内のノードです。
geo1
のtx
パラメータエクスプレッションに以下のコードを記述することができます:
hou.node("..").type().hdaModule().position()[0]
便宜的に、hou.OpNode.hdaModuleを使用して、デジタルアセットのノードインスタンスからモジュールにアクセスすることもできます。 そのため、上記のエクスプレッションを以下のように単純化することができます:
hou.node("..").hdaModule().position()[0]
エクスプレッション内にhou.
接頭辞を使用する必要がないので、さらに以下のように単純化することができます:
node("..").hdaModule().position()[0]
以下のサンプルでは、ボタンパラメータのCallback Scriptフィールドから、このモジュール内のコードを実行する方法を載せています:
hou.pwd().hdaModule().onButtonPress()
例えばOn Loadedのようなイベントハンドラースクリプトでは、kwargs
辞書を使用することで、ノードタイプにアクセスすることができます:
kwargs["type"].hdaModule().onLoaded()
Houdiniは、Python Moduleからアクセス可能なローカルのkwargs
辞書も作成することに注目してください。
その辞書には"type"
キーの1つのエントリーを含んでおり、それを使用して、デジタルアセットで定義されたhou.NodeTypeにアクセスすることができます。
デジタルアセットで、あるモジュールに非常に多くのPythonコードを含んでしまうことが分かっていれば、サブモジュールを作成することができます。
例えば、bar
サブモジュールを作成したい場合、そのソースコードを新しいデジタルアセットセクション(例えば、"bar_PythonModule"
)に格納します。
そして、Python Moduleセクションから以下のコードを記述することができます:
import toolutils bar = toolutils.createModuleFromSection("bar", kwargs["type"], "bar_PythonModule")
Note
Houdini18.0から、createModuleFromSection
関数は、HDAセクション内にPython3スタイルのprintステートメントが必要になりました。
一般的には、これはHDAセクション内のprintステートメントが丸括弧で引数を閉じなければならないことを意味しています。
例
print("Hello world!")
旧
print "Hello world!"
これでbar
がメインモジュールのサブモジュールとして現れます。
例えば、bar_PythonModule
セクションに以下のコードが含まれていると:
def foo(): return 3.2
デジタルアセットノードのパラメータから以下のコードを記述することができます:
pwd().hdaModule().bar.foo()
Python Moduleのコードは、"PythonModule"
デジタルアセットのセクションに保存します。
例えば、そのソースコードを含んだ文字列は、node_type.definition().sections()["PythonModule"].contents()
のコードを使用して取得することができます。