On this page | |
Since | 17.0 |
概要 ¶
LOPノードを使って表現するのが難しい技術的タスクまたは統合タスクには、このノードを使用してUSD APIのフルパワーを使ってシーングラフツリーを読み込んで修正したり、HOMのパワーを使って残りのHoudiniにアクセスしてコントロールすることができます。もちろん、Pythonとそのライブラリのフルパワーを使って外部データにアクセスしてパイプラインや他のシステムに統合することもできます。
このノードは、独自のパイプライン固有のタスクをスクリプト化するのに役立つ事が多いです。
APIのヘルプはPixarのPython APIチュートリアルを参照してください。
ステージのスクリプト化 ¶
-
hou.pwd()
をコールすることで、このノードの参照をhou.Nodeとして取得することができます。 この参照を介して現行ステージ も 取得することができます(以下参照)。 さらには、この参照を使ってこのノードに追加されているSpareパラメータにアクセスすることができます。 -
hou.pwd().editableStage()
をコールすることで、編集可能なpxr.Usd.Stage
オブジェクトを取得することができます。 このオブジェクトは、このノードの出力(APIによって加えられた変更を含みます)を表現しています。(USD Edit Targetは自動的にアクティブレイヤーに設定されます。 このEdit Targetを変更しないでください 。変更してしまうと予期しない間違った結果を招いてしまいます。)
-
hou.pwd().inputs()[0].stage()
をコールして入力ステージを読み込み、次に、評価されたプリミティブパターンまたは他の値をスタッシュ(保存)した **後に**hou.pwd().editablestage()
をコールしてください。順番を誤ってこの処理が行なわれても、通常ではHoudiniはそのコードを実行しますが、効率が低下します。
サンプル ¶
ステージに新しいPrimsを追加する。
stage = hou.pwd().editableStage() xform = stage.DefinePrim('/shapes', 'Xform') cube = stage.DefinePrim('/shapes/cube1', 'Cube')
シーングラフツリー内のすべてのPrimをループする。
stage = hou.pwd().editableStage() for prim in stage.Traverse(): # Primにアクセスまたは編集します。 pass
USDのハイレベルAPIsを使って複雑なアトリビュートを制御する。
from pxr import UsdGeom stage = hou.pwd().editableStage() cube = stage.GetPrimAtPath("/shapes/cube1") # アトリビュートを直接変更する。 cube.GetAttribute("size").Set(1.5) # APIsは便利なショートカットを持つことができます。 cube_api = UsdGeom.Cube(cube) color = cube_api.GetDisplayColorAttr() color.Set([(0, 0, 1.0)]) # マトリックスアトリビュートを直接いじることなくXformCommonAPIを使ってトランスフォームを制御することができます。 UsdGeom.XformCommonAPI(cube).SetTranslate((4, 5, 6))
すべてのライトをループさせて、ライトの露出をライトの強度にコピーし、その露出をクリアする。
from pxr import UsdLux stage = hou.pwd().editableStage() # UsdLuxには、シーン内のすべてのライトを効率的に検索するための特別なAPIが用意されています。 api = UsdLux.ListAPI(stage.GetPseudoRoot()) for lightprim in light api.ComputeLightList(): exposure_attr = lightprim.GetAttribute("exposure") intensity_attr = lightprim.GetAttribute("intensity") intensity = intensity_attr.Get() exposure = exposure_attr.Get() if exposure: intensity_attr.Set(intensity * (exposure ** 2)) exposure_attr.Set(0)
hou.LopSelectionRuleを使って、すべてのライトの強度を現行値の半分にする。
node = hou.pwd() # まず最初に、入力上のすべてのライトPrimsを検索します。 # 入力ノードの重い再クックを回避するために、編集可能ステージを取得する前に、これをする必要があります。 ls = hou.LopSelectionRule() ls.setPathPattern('{ usd_istype(0, @primpath, "UsdLuxLight") }') paths = ls.expandedPaths(node.inputs()[0]) # これで一連のPrimパスが取得できたので、編集可能ステージを取得して変更を加えることができます。 stage = node.editableStage() for path in paths: prim = stage.GetPrimAtPath(path) intensity = prim.GetAttribute('intensity') intensity.Set(intensity.Get() * 0.5)
他のAPIでアクティブレイヤーをスクリプト化する ¶
-
Usd
APIsを使ってステージを制御する 代わりに 、ローレベルのSdf
APIsを使ってアクティブレイヤーを編集することができます。 同じスクリプト内で両方の処理を制御することはできません。 -
ローレベルAPIsの方を好む理由があれば、おそらくアクティブレイヤーだけをスクリプト化したいことでしょう。
pxr.Usd
メソッドは、非常に使い勝手の良いハイレベルメソッドです。pxr.Usd
メソッドは、エラーチェックやデータの有効性を実行する処理が多いです。 しかし、pxr.Sdf
APIsは劇的に高速で、特に新しいUSD Primsを作成する時がそうです。 -
アクティブレイヤーの編集可能な
pxr.Sdf.Layer
参照を取得したいのであれば、hou.pwd().editableLayer()
をコールします。 これをコールした場合、同じスクリプト内でhou.pwd().editableStage()
をコール しないでください (コールした場合は単にNone
が返されます)。 -
The returned editable layer is not on any USD stage while the python LOP is cooking, so there is no need to use
Sdf.ChangeBlock
objects to batch change notifications when making edits. -
After calling
editableLayer
, you may callhou.pwd().uneditableStage()
to get access to a read-onlyUsd.Stage
. This stage will be the output of the node connected to this node’s input. But unlike callinghou.pwd().stage()
orhou.pwd().input(0).stage()
, this approach will not trigger recursion errors or warnings about getting a read lock for an already locked stage. The returned stage can be used to access information about the current state of the stage to inform the edits being made to the editable layer. Because the editable layer is not composed onto this uneditable stage, changes made to the layer will not affect the content of this stage.
Tips ¶
-
コードを編集する時、このノードは、エディタ外をクリックまたはAlt + Enterを押した時にクックします。
-
このノード上にSpareパラメータを追加することで、このノードにグラフィカルインターフェースを追加することができます。 例えば、Primパスを受け取る
primpath
という名前のテキストボックスを追加することができます。 これによって、スクリプト内でそのパラメータ値にアクセスすることができます:node = hou.pwd() primpath = node.evalParm("primpath")
-
作成した便利なPython Scriptノードを共有したい場合、そのノードインスタンスをLOPデジタルアセットに変換することができます。 ネットワークエディタ内でそのノードを右クリックして、 Create Digital Asset を選択します。 このスクリプトがデジタルアセットの一部として格納され、このノードも同じように動作しますが、共有とバージョン管理が可能なアセットとして機能します。
-
エディタの右側にあるポップアップメニューボタンは、Houdiniパス内の
PythonScripts.txt
ファイルからスニペットを取り込みます。$HOUDINI_USER_PREFS_DIR/PythonScripts.txt
ファイルを作成し、そのテキストにスニペットを追加すれば、このメニューにそれらのスニペットが表示されます。$HFS/houdini/PythonScripts.txt
を読んで、必要なファイル形式を確認してください。 -
スクリプトで“何とかのPrimsすべてを検索”する必要がある場合、USDの走査系メソッドを使用するよりも、hou.LopSelectionRuleを使用することを考慮してください。 hou.LopSelectionRuleオブジェクトは、HoudiniのUSDプリミティブパターンマッチを実装しています。 このオブジェクトは
Sdf.Path
オブジェクトのリストを生成します。stage.GetPrimAtPath(pathstring)
を使用することで、Sdf.Path
をUsd.Prim
オブジェクトに変換することができます。 この手法を使用すると、入力ノード上の選択ルールを評価したり、pwd().editableStage()
が返すUsd.Stage
上の選択ルールを直接評価することができます。 入力ノードを使用する場合、入力ステージの重い複製を回避するために、このノードの編集可能ステージを取得する前に選択ルールを評価してください。 -
It is almost always a bad idea to call hou.setContextOption() from within the script of a Python LOP. This causes a global context option to be created. Global context options are accessible anywhere in the hip file, which means cooking this LOP and running its script can potentially cause nodes anywhere else in the hip file to become dirty, if they use this context option. Further, the global context option will only be set when the node cooks, but changing the global context option value in the context option editor or using Python code (in a python shell or in another Python LOP) will not dirty this node, and so it will not recook and reset the option value as might be expected. Instead, setting context options locally within a LOP network should be done using the
Edit Context Options LOP.
-
ステージのルートレイヤーを編集しないでください。このルートレイヤーはPython APIからアクセスできますが、このLOPクックの構造上、どの単一LOPノードからも干渉されないようにそのルートレイヤーを自由に管理できる必要があります。この間違いを招いてしまうよくある使い方は、サブレイヤーをルートレイヤーに追加したい時です。サブレイヤーをルートレイヤーに追加したいのであれば、代わりにhou.LopNode.addSubLayerメソッドを使用すると良いでしょう。
パラメータ ¶
Python Code
このノードをクックする時に実行するPythonコード。Tipsとサンプルは上記のメインヘルプを参照してください。
Maintain State
有効にすると、大元のPythonインタープリタがクック間でクリアされなくなります。 これによって、いくらかパフォーマンスが良くなりますが、その反面、予期しない挙動を招く可能性があります。 通常では、これを無効なままにすることを推奨します。