投稿

2月, 2019の投稿を表示しています

op シンタックス

Fileタイプの入力を求めてくるインプットにたいして、ネットワーク上のオブジェクトを設定したい場合はopシンタックスを利用する opシンタックスは絶対パス表記でなければいけない op:/obj/geo1/vdbfrompolygon1 相対パスを利用したい場合は、相対パスを絶対パスに変換するファンクションと組み合わせる op:`opfullpath(../vdbfrompolygon1)` ファイルパスなどを設定するString型のインプットでは、基本的に文字型のデータしか受け付けない。しかし`expression`とすることで、エクスプレッションを実行することが出来る。 接続されているノードから直接パスを取りたい場合は以下のようにしてもよい op:`opinputpath(".",1)`

Houdini Path 表記法

Houdiniのパスの表記はUNIXのルールに倣っている。 / から始まるものは絶対パス 例>>> /obj/geo1/dopnet1/smokesolver1 . から始まるものは相対パス 例>>> .  >>>自オブジェクトを指す 活用例>>> opinputpath(".",0) ..は自ノードを内包している一階層上のオブジェクトを指す 例>>> ../smokesolver --この場合だと自ノードのあるネットワークにあがってから、さらに”/”で、そのネットワークの中にある、smokesolverを参照することになっている ../somethingは、自ノードが存在するネットワークと同じネットワークに存在するノードを参照する時に利用するので、利用頻度は最も高いと思う 活用例>>> opinputpath("..",0) >>>自ノードが内包されているオブジェクトに接続されているノードを参照する ../.. >> この場合だと二階層上になる

Houdini Menu barをカスタマイズする

TAT changeWrangleNodeCol $HOUDINI_USER_PREF_DIR\pyCode\setWrangleNodeCol.py

現在のObject Network からノードを獲得する

#現在のUIに存在するNetwork Editorを取得 current_networkEditor = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor) #現在のネットワークエディターが表示しているオブジェクトのパスを取得する cd = current_networkEditor.pwd() #もし取得したパスのカテゴリーがジオメトリーなら if(cd.type().description() =="Geometry"): print "yas, it is geometry" #このオブジェクトに含まれるノードを全て取得する nodes = cd.children() for c in nodes: print c.type().description() else: print "please go to sop network" print cd.type().description() #このオブジェクトに含まれるノードを全て取得する nodes = cd.children() for c in nodes: print c.type().description()

HDA viewer state について

viewer stateはユニークな名前がついてないとエラーになる。よってHDAがロードされたとき( OnInstallイベントがこれに相当する)にのみ一度だけ定義されるのがよい。 もしくは、該当するイベントが既にScene上に存在しないかどうかをチェックして、存在すれば一度クリアしてから再作成しても良いかもしれない。 以下のコマンドで、当該HDAの名前を利用したviwer stateを削除できる。 state_name = kwargs['type'].name() + ".pystate" hou.ui.unregisterViewerState(state_name) 以下は登録方法。HDA python moduleにtemplateという変数でviewer stateのインスタンスが存在するなら、これを有効化できる。 module = kwargs['type'].hdaModule() hou.ui.registerViewerState(module.template) 以下実装方法 Template本体 Python Moduleに書き込む from __future__ import print_function class myState(object): def __init__(self,state_name,scene_viewer): self.state_name = state_name self.scene_viewer = scene_viewer # Handler methods go here def onMouseEvent(self, kwargs): dev = kwargs["ui_event"].device() print("Mouse:", dev.mouseX(), dev.mouseY(), dev.isLeftButton()) def createVST(): nodetype = kwargs['type'] ...

他のパラメーターの値に応じて、あるパラメータを非表示にする。

イメージ
Type Properties window > Parameters > ByType のリストから、非表示または無効にしたいパラメータを選択する。 以下のパラメータに下記のエクスプレッションを書き込む。 Disable when -- 無効化したい場合(グレー表示にして編集不可になる) Hide when -- 隠したい場合 //////////////////////////////////////// エクスプレッションのスタイル {参照したいパラメータのname 条件式 値} ※パラメーターのnameと条件式の間には、スペースを必ず入れないと動作しない。ブービートラップ!! //////////////////////////////////////// 具体例 parm1という名前のパラメータがTrueだった場合に、あるパラメータを隠したい場合 以下のように書き込む {parm1 == 1}

HDAの作成、更新とバージョン管理について

イメージ
今回はHDAの作成、更新の仕方と、バージョン管理方法についてメモしたい とりあえずSOPネットワーク内でOTLを作成する場合について。 OTLにしたいSOPノードを選択してCtrl+Cを押すと、それらのノードが内包されたSubnetが作成される。このノードを選択してから右クリックするとポップアップメニューが現れるので、そこから"Create Digital Asset"を選択する。 すると次に以下のWindowが現れる ここでAcceptするとHDAが作成されるが、この方法ではバージョン管理ができない。バージョンを有効にするには operator name以下のような形式で設定する。 nameSpace::NodeName:version nameSpace, NodeNameはどのような文字列でも構わない。ただしそれぞれの間に :: を挟まないといけない。 versionはとりあえず1.0から始めることにした。 つぎに作成されたOTLを選択して、右クリック>Show in Asset Manager...を選択する デフォルト設定ではバージョンを変更するためのUIがOTLには表示されないので、これを表示させるために Asset Bar > Display Menu of All Definitionsを有効にする。 すると、このようにOTLのパラメータにバージョンを変更するためのバーが表示される。 つぎにバージョンをアップさせる方法。OTLを選択してもう一度右クリック>Show in Asset Manager... operator Tab に移動する。OTLのリストが表示されるので、バージョンアップしたいアセットを選択する。そして右クリック> SideFXのリソースはこれ http://www.sidefx.com/docs/houdini/assets/namespaces.html

VDB Volume merge HDA

今回は複数のVDBボリュームを簡単にマージするHDAを作ってみたい。

Object Merge Node をWrapしたHDAを作ってみる

今回は既存のSOPノードのUIを加工するためのHDAの作成方法についてメモしてみたい。

ボタンイベントコールバックとHDA Moduleとfunction

イメージ
HDAのボタンUIから、自分で定義したPythonの関数を実行する方法をメモする。 まずボタンから実行したいPythonスクリプトを、関数として定義する。 設定できる場所はType properties > script > Event Handler > Pthon Module すると右側のエディターにスクリプトを書き込む事ができる。Helloと言う文字列を書き出すだけの単純なスクリプトを設定した。  ボタンUIを作成したら、CallBack Scriptのところに、以下のようなスクリプトを設定する。 kwargs['node'].hdaModule().myFunctionA()

Developing HDA with Python 備忘録

少し凝ったHDAを開発する上で避けることの出来ないHoudiniのPython でもそんなに使う機会がないので、久しぶりに使うと忘れてしまっている。 なので徒然なるままにメモを残しておこうと思う。