On this page |
概要 ¶
ユーザがノードのViewer Stateで作業する時にインタラクティブにパラメータを編集できるようにする標準的な方法は、ノードパラメータに ハンドル をバインド(紐づけ)させることです。
ローレベルの入力デバイスイベントを解釈できたとしても、ハンドルの方が今でもステートでユーザがインタラクティブに操作できるようにセットアップするためのメインの方法です。 ハンドル自体が非常に強力で、幅広く色々とパラメータをセットアップできるように既製ユーザインターフェースを指定することができます。 色々なハンドルの多くのライブラリからそれを選択することができます。
ステートテンプレートを作成する時は、ステートにハンドルを バインド させます。 現在のところ、動的にハンドルを作成したり破棄することができません。つまり、ステートで必要となるハンドルすべてを事前に指定しておく必要があります。 しかし、hou.Handleを使えば動的にハンドルを制御することは可能です。
静的ハンドル ¶
静的 ハンドルのバインドは、ハンドルパラメータとノードパラメータの単純な1:1のマッピングに対応しています。 移動、回転、スケール、長さなどのハンドルパラメータは、ノードのそれに該当するパラメータと合わせることがほとんどなので、このマッピングを使用することがほとんどです。
ステートに追加したい静的ハンドル毎に、そのハンドルタイプの名前、そのハンドルの内部名(各ハンドルの名前はツール内の他のハンドルと被ってはいけません)、
ノードパラメータとハンドルパラメータをマッピングさせた("node_parm_name", "handle_parm_name")
タプルのリストでhou.ViewerStateTemplate.bindHandleStaticをコールします。
簡単なテスト用にPython Source Editor内で以下のサンプルを実行することができます:
import hou class PythonMeasureState(): def __init__(self, state_name, scene_viewer): self.state_name = state_name self.scene_viewer = scene_viewer template = hou.ViewerStateTemplate( "pythonmeasure", "Python Measure", hou.sopNodeTypeCategory() ) template.bindFactory(PythonMeasureState) # このステートのアセットに"start"と"end"の2個の移動パラメータがあることを想定します。 template.bindHandleStatic( "xform", "start_handle", [("startx", "tx"), ("starty", "ty"), ("startz", "tz")] ) template.bindHandleStatic( "xform", "end_handle", [("endx", "tx"), ("endy", "ty"), ("endz", "tz")] ) hou.ui.registerViewerState(template)
動的ハンドル ¶
動的ハンドルのバインドは、コールバック関数において、ハンドルの変更がノードパラメータにどのように影響を与えるのか、または、ノードパラメータの変更がハンドルパラメータにどのように影響を与えるのかを決定します。
ステートに追加したい動的ハンドル毎に、そのハンドルタイプの名前、そのハンドルの内部名(各ハンドルの名前はツール内の他のハンドルと被ってはいけません)でhou.ViewerStateTemplate.bindHandleをコールします。
Note
hou.ViewerStateTemplate.bindHandleは、cache_previous_parms
ブール引数を受け取ります。
cache_previous_parms=True
を渡すと、Houdiniは、そのハンドル値を追跡して、ハンドルコールバックに 以前 のハンドルと 新しい ハンドルの値の両方を渡します。
これは、ユーザがハンドルを動かした速さを調べたい時にその差分を追跡できるので便利です。
False
(デフォルト)を渡すと、Houdiniは、ハンドルコールバックに以前の値を渡しません。
簡単なテスト用にPython Source Editor内で以下のサンプルを実行することができます:
from __future__ import print_function import hou class PythonTwistState(): def __init__(self, state_name, scene_viewer): self.state_name = state_name self.scene_viewer = scene_viewer def onHandleToState(self, kwargs): # ユーザがハンドルを操作した時にコールされます。 handle_name = kwargs["handle"] parms = kwargs["parms"] prev_parms = kwargs["prev_parms"] print("User edited handle:", handle_name) for parm_name in kwargs["mod_parms"]: old_value = prev_parms[parm_name] new_value = parms[parm_name] print("%s was: %s now: %s" % (parm_name, old_value, new_value)) def onStateToHandle(self, kwargs): # 必要に応じて動的ハンドルを更新できるように、 # ユーザがパラメータ(s)を変更した時にコールされます。 parms = kwargs["parms"] print("Parameters are now:", parms) for p in parms: print(p) template = hou.ViewerStateTemplate( "pythontwist", "Python Twist", hou.sopNodeTypeCategory() ) template.bindFactory(PythonTwistState) template.bindHandle("xform", "twist_handle", cache_previous_parms=True) hou.ui.registerViewerState(template)
動的ハンドルイベントのメソッドに渡される辞書には、以下の標準アイテムが含まれています:
node
現行ステートで作用しているノードを表現したhou.OpNodeインスタンスを含んでいます。
state_parms
現行ステートにバインドされたステートパラメータを表現した名前を含んでいます。 この辞書は、パラメータステートを変更する際に使用します。 詳細は、ここを参照してください。
state_flags
ステートに関連した色々なフラグを含んだ辞書。
ステートフラグは、kwargs
引数を介して、すべてのステートハンドラーで設定することができます。
フラグ |
メモ |
---|---|
|
(による)マウスドラッグイベントを生成するかどうかを制御します。
デフォルトでは、マウスドラッグイベントを生成します(
あなたのステートではマウスドラッグイベントが不要な場合は、 class MyState(object): def __init__(self, state_name, scene_viewer): self.state_name = state_name self.scene_viewer = scene_viewer def onEnter( self, kwargs): kwargs['state_flags']['mouse_drag'] = False ... |
|
このフラグは、 デフォルトでは、ビューポートは常に再描画します。大規模シーンのパフォーマンス問題を軽減したいのであれば、あなたのステートがでビューポートの再描画が不要な時には class MyState(object): def __init__(self, state_name, scene_viewer): self.state_name = state_name self.scene_viewer = scene_viewer def onMouseEvent( self, kwargs): kwargs['state_flags']['redraw'] = False if __some_redraw_test__: kwargs['state_flags']['redraw'] = True ... |
|
このフラグは、 class MyState(object): def __init__(self, state_name, scene_viewer): self.state_name = state_name self.scene_viewer = scene_viewer def onEnter( self, kwargs): # 間接ハンドルドラッグを無効にします。 # ビューポート内でのMMBドラッグによってハンドルパラメータが修正できなくなります。 kwargs['state_flags']['indirect_handle_drag'] = False ... |
|
このフラグは、別のノードが選択された時に、ステートを抜けるのか、それともアクティブのままにするのか決めます。
True(デフォルトの挙動)に設定すると、別のノードが選択されるとステートが抜けます。
Falseに設定すると、別のノードが選択されてもステートはアクティブのままになります。
class MyState(object): def __init__(self, state_name, scene_viewer): self.state_name = state_name self.scene_viewer = scene_viewer def onGenerate( self, kwargs): # ノード選択が行なわれても、このノードなしステートがアクティブのままになるように設定します。 kwargs['state_flags']['exit_on_node_select'] = False ... |
interrupt_state
Volatileステートが有効な時または空っぽの文字列の時にPythonステートを中断するステートの名前。
onHandleToState ¶
これは、ハンドルを変更した時にノードパラメータ(またはステート/表示)を更新することができます。
このメソッドに渡される辞書には、以下の追加アイテムが含まれています:
handle
ハンドルの文字列ID。
parms
新しいハンドルパラメータ値を含んだ辞書。
mod_parms
変更されたパラメータの名前のリスト。
prev_parms
このキーは、hou.ViewerStateTemplate.bindHandleメソッドにcache_previous_parms=True
を渡した場合に のみ存在します 。
これは、前のハンドルのパラメータ値を含んだ辞書です。 これは、差分計算に役立ちます。
ui_event
ハンドル状態にアクセスするためのhou.UIEventオブジェクト。 例えば、hou.UIEvent.reasonが返したhou.uiEventReason値を使用することで、ユーザがハンドルのドラッグを開始または終了したかどうかを調べることができます。
以下のhou.uiEventReason値は、onHandleToState
に対して色々な意味があります:
-
uiEventReason.Active
: ユーザがハンドルをドラッグ中です。 -
uiEventReason.Changed
: ユーザがハンドルのドラッグを終了しました。この時点で、prev_parms
には直近のハンドル値が入っているはずです。 -
uiEventReason.Start
: ユーザがハンドルのドラッグを開始しました。 -
uiEventReason.Picked
: ハンドルメニュー操作、ホットキー、マウスクリック。例えば、Picked値はHUD
スライダをクリックしたときに生成されます。
onStateToHandle ¶
このメソッドは、 ノードのパラメータを変更する度に ステートにバインドされた 動的ハンドル毎に 別々にコールされます。 これは、変更されたノードパラメータに合うようにハンドルパラメータを更新することができます。
このメソッドに渡される辞書には、以下の追加アイテムが含まれています:
handle
ハンドルの名前。
parms
ハンドルのパラメータ名と値をマッピングした辞書。 この辞書の値を変更することで、そのハンドルパラメータを編集することができます 。
このメソッドでは、ノードのパラメータからパラメータを読み込んで、kwargs["parms"]
内の必要なハンドルのパラメータを動的に更新します:
def onStateToHandle(self, kwargs): node = kwargs["node"] handle_parms = kwargs["parms"] if kwargs["handle"] == "my_angle": node_tx = node.parm("tx").evalAsFloat() handle_parms["tx"] = node_tx * 2
特別な通知 ¶
Houdiniには、ユーザが動的ハンドルの制御を開始または終了した時にステートに通知するための特別なコールバックが備わっています。
onBeginHandleToState
は、onHandleToState
コールバックの直前にコールされます。
例えば、onBeginHandleToState
を使用することで、ユーザがハンドルを制御している間に
Undoブロックを開いて、Undo可能オペレーションを実行することができます。
onEndHandleToState
は、onHandleToState
コールバックの直後にコールされます。
onEndHandleToState
を使用することで、onBeginHandleToState
で開いたUndoブロックを閉じることができます。
ハンドルタイプ ¶
名前 |
説明 |
パラメータ |
---|---|---|
|
位置と回転のハンドル |
|
|
Bounding Box Vector |
|
|
Bounding Box |
|
|
Bounding Rectangle |
|
|
Bounder Bounding Box |
|
|
Circle Transform |
|
|
Clay Translate |
|
|
Curve Point Options |
|
|
Distance |
|
|
Domain |
|
|
Edit |
|
|
Extrude |
|
|
Extrude v2 |
|
|
Vector with Fallback |
|
|
HUD Int Slider |
|
|
HUD Slider |
|
|
Isoparm Segment |
|
|
Isoparm Segment |
|
|
Mouse Wheel Bump |
|
|
Mouse Wheel Radius |
|
|
Paste Range |
|
|
Peak |
|
|
Pill |
|
|
Pivot |
|
|
Project |
|
|
Soft Transformer |
|
|
Sphere Transformer |
|
|
Translate |
|
|
Torus Transformer |
|
|
Tube Transformer |
|
|
U Isoparm |
|
|
UV Edit Manipulator |
|
|
Texture Transformer |
|
|
UV Point |
|
|
UV Project Manipulator |
|
|
UV Range Manipulator |
|
|
UV Transform Manipulator |
|
|
UV Unwrap Manipulator |
|
|
Vector |
|
|
V Isoparm |
|
|
Transformer |
|
ハンドル設定 ¶
ハンドル設定は、ハンドルの挙動を変更するためのアトリビュートになっています。
関連項目:
HUD整数スライダの設定 ¶
hudharbourname('name')
スライダをグループに割り当てます。同じグループのスライダ同士がドッキングされます。
hudharbourx(int)
スライダグループのX位置。
hudharboury(int)
スライダグループのY位置。
hudnameside(int)
ラベル位置: 上(1), 左(2), 右(3), 下(4)
hudrangehigh(int)
スライダ範囲の上限値。
hudrangelow(int)
スライダ範囲の下限値。
hudlockhigh(int)
1に設定すると、スライダの上限がhudrangehigh
に設定され、スライダはその値より上に移動できません。
hudlocklow(int)
1に設定すると、スライダの下限がhudrangelow
に設定され、スライダはその値より下に移動できません。
hudvalueside(int)
位置の値: 上(1), 左(2), 右(3), 下(4)
hudx(int)
ビューアペイントのX位置。
hudy(int)
ビューアペインのY位置。
hudw(int)
幅
hudh
: 高さ
HUDスライダ設定 ¶
hudh
: 高さ
hudharbourname('name')
スライダをグループに割り当てます。同じグループのスライダ同士がドッキングされます。
hudharbourx(int)
スライダグループのX位置。
hudharboury(int)
スライダグループのY位置。
hudnameside(int)
ラベル位置: 上(1), 左(2), 右(3), 下(4)
hudrangehigh(float)
スライダ範囲の上限値。
hudrangelow(float)
スライダ範囲の下限値。
hudlockhigh(int)
1に設定すると、スライダの上限がhudrangehigh
に設定され、スライダはその値より上に移動できません。
hudlocklow(int)
1に設定すると、スライダの下限がhudrangelow
に設定され、スライダはその値より下に移動できません。
hudvalueside(int)
位置の値: 上(1), 左(2), 右(3), 下(4)
hudx(int)
ビューアペイントのX位置。
hudy(int)
ビューアペイントのY位置。
hudw(int)
幅
hudh(int)
高さ
xform設定 ¶
translate(int)
xform
移動モードを有効(1)または無効(0)。
scale(int)
xform
スケールモードを有効(1)または無効(0)。
rotate(int)
xform
回転モードを有効(1)または無効(0)。
snap_to_selection(int)
1に設定すると、ジオメトリコンポーネントへのスナップが有効になります。詳細はここを参照してください。
境界ボックス設定 ¶
translate(int)
boundingbox
移動モードを有効(1)または無効(0)。
rotate(int)
boundingbox
回転モードを有効(1)または無効(0)。
snap_to_selection(int)
1に設定すると、選択したジオメトリコンポーネントへのスナップが有効になります。詳細はここを参照してください。
ハンドルのスナップ ¶
ほとんどのハンドル(例えば、xform, pivot, distance, boundingboxなど)では、選択したコンポーネントへのスナップを回避したいです。 これらのハンドルは選択したジオメトリを動かすことを想定しているので、そのハンドルを同じジオメトリにスナップさせると、良くないフィードバックループが起きます。 たいていの場合、ここで問題になる選択は、ノードが生成したクック選択です。
Houdiniは、選択が存在した時にジオメトリコンポーネントが選択されているのか選択されていないのかの区別しかできません。
選択が存在しなければ、Houdiniはそのハンドルにバインドされているノードが生成したジオメトリ全体が選択されていると見なし、ハンドルがそのジオメトリにスナップするのを回避します。
snap_to_selection
設定を使用することで、選択されたコンポーネントにハンドルをスナップさせるかどうか制御することができ、
通常のAPIを使ってその設定をハンドルに適用することができます: