環境:Houdini 20.0.751
静的な入力:onKeyEvent()
キーを押した時だけトリガーが発生するイベントにはonKeyEvent()を使う。
https://www.sidefx.com/ja/docs/houdini/hom/state_events.html
このコードで押したキーを表示することができる。
#キーボード入力を検知
def onKeyEvent(self,kwargs):
ui_event = kwargs["ui_event"]
self.key_pressed = ui_event.device().keyString()
self.log(ui_event.device().keyString()) # 押しているキーがログに表示される
return TrueキーボードのAを押すことでモードを切り替えるサンプルコード。
import hou
import viewerstate.utils as su
from enum import Enum
# Enumでモード切り替え
class Mode(Enum):
SELECT = 1
EDIT = 2
class State(object):
def __init__(self, state_name, scene_viewer):
self.state_name = state_name
self.scene_viewer = scene_viewer
self.mode = Mode.SELECT
def onEnter(self, kwargs):
pass
def onResume(self, kwargs):
pass
def onInterrupt(self,kwargs):
pass
#キーボード入力を検知
def onKeyEvent(self,kwargs):
ui_event = kwargs["ui_event"]
self.key_pressed = ui_event.device().keyString()
#Aキーが押されたらモードを切り替える
if self.key_pressed in ("a"):
if self.mode == Mode.SELECT:
self.mode = Mode.EDIT
else:
self.mode = Mode.SELECT
print(self.mode)
return True
self.key_pressed = None
return False
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動的な入力:onKeyTransitEvent()
キーを押したり、押し続けたり、離したりと状態が必要なトリガーにはonKeyTransitEvent()を使う。
def onKeyTransitEvent(self, kwargs):
ui_event = kwargs["ui_event"]
key_pressed = ui_event.device().keyString()
key_isKeyUp = ui_event.device().isKeyUp()
key_isKeyDown = ui_event.device().isKeyDown()
# Xキーが押下されているか判定
if self.current_mode == Mode.EDIT:
if key_pressed in ("x") and key_isKeyDown == True:
self.is_snapping_point = True
return True
else:
self.is_snapping_point = False
return FalseCtrl、Shift、Altなどの修飾キーの判定
def onKeyTransitEvent(self, kwargs):
ui_event = kwargs["ui_event"]
if ui_event.device().isCtrlKey() == 1:
self.ctrl = 1
else:
self.ctrl = 0ui_event.device()で取得できるプロパティは以下のように調べることが出来る。
self.log(ui_event.device())
'''
'isAltKey' : 0, 'isAutoRepeat' : 0, 'isKeyPressed' : 1, 'isKeyDown' : 1, 'isKeyUp' : 0,\
'isCapsLock' : 0, 'isCtrlKey' : 1, 'isKeyPad' : 0, 'isShiftKey' : 0, 'isFunctionKey' : 0,\
'isArrowDown' : 0, 'isArrowLeft' : 0, 'isArrowRight' : 0, 'isArrowUp' : 0,\
'isLeftButton' : 0, 'isMiddleButton' : 0, 'isRightButton' : 0,\
'isLeftButtonReleased' : 0, 'isMiddleButtonReleased' : 0, 'isRightButtonReleased' : 0\
'keyString' : 'Ctrl', 'keyValue' : 0, 'modifierString' : 'Ctrl',\
'mouseWheel' : 163.84, 'mouseX' : 531, 'mouseY' : 388\
'isTablet' : 0, 'tabletAngle' : 0, 'tabletPressure' : 1, 'tabletRoll' : 0, 'tabletTilt' : 90,\
'time' : 27175.5\
'''

