Jump to content
Sign in to follow this  
denisVFX

Python States problem dynamic binding uisoparm handle

Recommended Posts

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

Share this post


Link to post
Share on other sites

I don't know what happened, but after restarting houdini handle appeared and works fine. It seems to be some bug....

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×