環境:Houdini 20.0.751
マウスのクリックはui_event.device()のisLeftButton()やisMiddleButton()を使う。
# マウスの移動やクリック時に呼び出される
def onMouseEvent(self, kwargs):
ui_event = kwargs["ui_event"]
device = ui_event.device()
# 左ボタンクリック
if device.isLeftButton():
pass
# 中ボタンクリック
if device.isMiddleButton():
passマウスカーソルの座標

マウスカーソルのスクリーンスペース座標をカーソルの上に表示するサンプルコード。
import hou
import viewerstate.utils as su
class State(object):
MSG = "Show Mouse Cursor Position"
def __init__(self, state_name, scene_viewer):
self.state_name = state_name
self.scene_viewer = scene_viewer
self.mouse_screen = hou.Vector2()
self.cursor_text = "Text"
self.text = hou.TextDrawable(self.scene_viewer, "text")
def show(self, visible):
""" Display or hide drawables.
"""
self.text.show(visible)
def onEnter(self, kwargs):
self.show(True)
self.scene_viewer.setPromptMessage( State.MSG )
def onResume(self, kwargs):
self.show(True)
self.scene_viewer.setPromptMessage( State.MSG )
def onInterrupt(self,kwargs):
self.show(False)
def onMouseEvent(self, kwargs):
ui_event = kwargs["ui_event"]
mousex = ui_event.device().mouseX()
mousey = ui_event.device().mouseY()
(origin, dir) = ui_event.ray()
self.mouse_screen = self.scene_viewer.curViewport().mapToScreen(origin)
self.cursor_text = "<font size=4,>%.2f, %.2f</font>" % ( self.mouse_screen[0],
self.mouse_screen[1] )
def onDraw( self, kwargs ):
""" This callback is used for rendering the drawables
"""
handle = kwargs["draw_handle"]
# cursor text
params = {
"text": self.cursor_text,
"multi_line": True,
"translate": (self.mouse_screen[0],self.mouse_screen[1], 0.0),
"highlight_mode": hou.drawableHighlightMode.MatteOverGlow,
"glow_width": 1,
"color1": hou.Color(1.0,1.0,1.0),
"color2": (0.0,0.0,0.0,1.0) }
self.text.draw(handle, params)
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 = "ViewerStateTest::1.0"
state_cat = hou.sopNodeTypeCategory()
template = hou.ViewerStateTemplate(state_typename, state_label, state_cat)
template.bindFactory(State)
template.bindIcon(kwargs["type"].icon())
return templateワールド座標をビューポート座標に変換する
hou.GeometryViewportクラスのmapToScreen()を使う。
# ワールド空間からスクリーンスペース空間へ座標を変換
viewport = self.scene_viewer.curViewport()
point_pos = hou.Vector3(0,0,0)
view_space_pos = viewport.mapToScreen(point_pos)
