denisVFX Posted March 12, 2021 Share Posted March 12, 2021 I need to create a HDA with uisoparm handle which will be show/hide on hotkey, and dynamically tune different parameters in my hda. For example by pressing some hotkey it will tune param0, and after pressing same hotkey it will tune param1, etc... The problem is that I can't understand why uisoparm handle doesn't shows in viewport after its creation. Another handles like circle, xform, vector works fine. template.bindHandle("circle", "my_handle") But uisoparm handle doesn't appear in viewport , and I can't understand why here is example of my code. also I attached a hip file with hda. import hou import viewerstate.utils as su class State(object): def __init__(self, state_name, scene_viewer): self.state_name = state_name self.scene_viewer = scene_viewer self.node = None self.start_pt = None self.end_pt = None self.displayRotHandle = True self.start_handle = hou.Handle(self.scene_viewer, "rotate_start") self.end_handle = hou.Handle(self.scene_viewer, "rotate_end") self.displayCarveHandle = True self.carve0_handle = hou.Handle(self.scene_viewer, "carve_0") self.carve1_handle = hou.Handle(self.scene_viewer, "carve_1") def onEnter(self, kwargs): self.node = kwargs["node"] # rotation handles init self.start_handle.disableParms(["tx", "ty", "tz", "rx", "rz"]) self.end_handle.disableParms(["tx", "ty", "tz", "rx", "rz"]) self.start_handle.show(True) self.end_handle.show(True) self.start_handle.update() self.end_handle.update() self.displayRotHandle = True # carve handles init self.carve0_handle.show(True) self.carve1_handle.show(True) self.carve0_handle.enableParms(["input", "k","onoff"]) self.carve1_handle.enableParms(["input", "k","onoff"]) self.carve0_handle.update() self.carve1_handle.update() self.displayCarveHandle = True self.start_pt = self.node.node("start_pt").geometry() self.end_pt = self.node.node("end_pt").geometry() def onMouseEvent(self, kwargs): """ Find the position of the point to add by intersecting the construction plane. """ ui_event = kwargs["ui_event"] device = ui_event.device() origin, direction = ui_event.ray() return True def onKeyEvent(self, kwargs): ui_device = kwargs["ui_event"].device() self.key_pressed = ui_device.keyString() if self.key_pressed == "a": if self.displayRotHandle == True: self.scene_viewer.showHandle("rotate_start", 0) self.scene_viewer.showHandle("rotate_end", 0) self.scene_viewer.showHandle("carve_0", 0) self.scene_viewer.showHandle("carve_1", 0) self.displayRotHandle = False else : self.displayRotHandle = True self.scene_viewer.showHandle("rotate_start", 1) self.scene_viewer.showHandle("rotate_end", 1) self.scene_viewer.showHandle("carve_0", 1) self.scene_viewer.showHandle("carve_1", 1) return True def onHandleToState(self, kwargs): # Called when the user manipulates a handle handle_name = kwargs["handle"] parms = kwargs["parms"] prev_parms = kwargs["prev_parms"] node = kwargs["node"] if handle_name == self.start_handle.name(): # user manipulates rotation start handle node.parm("rot_start").set(parms["ry"]) if handle_name == self.end_handle.name(): # user manipulates rotation end handle node.parm("rot_end").set(parms["ry"]) if handle_name == self.carve0_handle.name(): # user manipulates carve 0 handle node.parm("carve_0").set(parms["k"]) node.parm("first_u").set(parms["onoff"]) if handle_name == self.carve1_handle.name(): # user manipulates carve 1 handle node.parm("carve_1").set(parms["k"]) node.parm("second_u").set(parms["onoff"]) def onStateToHandle(self, kwargs): # Called when the user changes parameter(s), so you can update dynamic handles if necessary handle = kwargs["handle"] handle_parms = kwargs["parms"] node = kwargs["node"] if self.start_pt != None: pos_start = self.start_pt.point(0).position() else: pos_start = [0.0, 0.0, 0.0] if self.end_pt != None: pos_end = self.end_pt.point(0).position() else: pos_end = [0.0, 0.0, 0.0] if handle == "rotate_start": handle_parms["tx"] = pos_start[0] handle_parms["ty"] = pos_start[1] handle_parms["tz"] = pos_start[2] if handle == "rotate_end": handle_parms["tx"] = pos_end[0] handle_parms["ty"] = pos_end[1] handle_parms["tz"] = pos_end[2] if handle == "carve_0" : handle_parms["k"] = 0 if handle == "carve_1" : handle_parms["k"] = 1 def createViewerStateTemplate(): """ Mandatory entry point to create and return the viewer state template to register. """ state_typename = kwargs["type"].definition().sections()["DefaultState"].contents() state_label = "Denis test dynamic handle" state_cat = hou.sopNodeTypeCategory() template = hou.ViewerStateTemplate(state_typename, state_label, state_cat) template.bindFactory(State) template.bindIcon(kwargs["type"].icon()) template.bindHandle("circle", "rotate_start") template.bindHandle("circle", "rotate_end") template.bindHandle("uisoparm", "carve_0", "ownerop('carve_0') owneropgroup('group')", cache_previous_parms=True, handle_parms=["input", "k","onoff"] ) template.bindHandle("uisoparm", "carve_1", "ownerop('carve_0') owneropgroup('group')", cache_previous_parms=True, handle_parms=["input", "k","onoff"] ) return template carve_python_states_v01.zip Quote Link to comment Share on other sites More sharing options...
denisVFX Posted March 17, 2021 Author Share Posted March 17, 2021 I don't know what happened, but after restarting houdini handle appeared and works fine. It seems to be some bug.... Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.