投稿

Choose and set current camera from list

import hou import nodesearch import toolutils #set current viewport def setViewport(cam): scene_view = toolutils.sceneViewer() viewport = scene_view.curViewport() viewport.setCamera(cam) # find cameras in scene matcher = nodesearch.NodeType("cam") network = hou.node("/obj/") cams = matcher.nodes(network, recursive=True) camList = [] #make list of camera name for UI for i in cams: camList.append(i.name()) #set UI if not len(camList)==0: cam = hou.ui.selectFromList(camList,message="Choose Camera") idx = cam[0] setViewport(cams[idx]) else: hou.ui.displayMessage("No Camera in Scene",buttons=("OK",))

Qt Designer with Houdini

Qt Designer を使って作成したUIを、Shelfなどから呼び出す。 import sys from hutil.Qt import QtCore, QtUiTools, QtWidgets class MyDialog(QtWidgets.QDialog): def __init__(self, *args, **kwargs): #set parent super(MyDialog,self).__init__(*args, **kwargs) #import ui file ui_file = r'D:\Houdini\sw\saveUI\saveUI002.ui' self.ui = QtUiTools.QUiLoader().load(ui_file, parentWidget=self) self.setParent(hou.ui.mainQtWindow(), QtCore.Qt.Window) #connect dialog button dialog_btn = self.findChild(QtWidgets.QDialogButtonBox, "buttonBox") dialog_btn.accepted.connect(self.ok) dialog_btn.rejected.connect(self.close) #connect push button print_btn = self.findChild(QtWidgets.QPushButton, "pushButton") print_btn.clicked.connect(self.hello) #accpet def ok(self): self.accepted() hou.ui.displayMessage("ok") ...

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'] ...