Viewer Stateは、ビューポート内での操作を制御します。
例えば、 RotateツールはViewer Stateです。
Handlesツールは、現行ノードに関連したステートにアクセスすることができます。
Houdiniでは、Pythonによって独自のViewer Stateを作成して登録することができます。
このオブジェクトは、その独自のViewer Stateを表現しています。このオブジェクトには、それを実装したクラスとバインド(例えば、メニュー、ハンドル、ホットキー、セレクターなど)が含まれています。 その独自のViwer Stateを登録する時に、このオブジェクトのインスタンスを用意すると、Houdiniはそのインスタンスを使って、テンプレートからステートの具体的なインスタンスを作成します。
import hou # ステートのコールバックを実装するクラスを作成します。 class MyState(object): def __init__(self, state_name, scene_viewer): self.state_name = state_name self.scene_viewer = scene_viewer # ステートとそのバインドを表現したテンプレートを作成します。 template = hou.ViewerStateTemplate( "mystate", "My Custom State", hou.sopNodeTypeCategory() ) template.bindFactory(MyState) template.bindHandleStatic( "rotate", "rot", [("rx", "x"), ("ry", "y"), ("rz", "z")] ) # 作成したテンプレートをHoudiniに登録します。 hou.ui.registerViewerState(my_template)
独自のViewer Stateを作成する方法に関しては、Pythonステートを参照してください。
メソッド ¶
__init__(state_name, state_label, node_type_category, contexts=None)
固有なカスタムステートタイプを表現したViewerStateTemplate
の新しいインスタンスを作成します。
ViewerStateTemplate
は、名前とカテゴリタイプで識別します。
この名前がステートのカスタムタイプになります。
カテゴリには、Houdiniがステートを実行する際に使用するコンテキストレベルを指定します。
ステートを複数のコンテキストレベルで実行できるようにしたいのであれば、contexts
パラメータを使ってコンテキストを追加することができます。
そのため、ステートがアクティブで、ユーザが新しいコンテキストに切り替えた時、その新しいコンテキストがステートコンテキストのどれかに合致すれば、Houdiniは現行ステートインスタンスを再利用します。
以下のサンプルでは、SOP
コンテキストでもCHOP
コンテキストでも実行可能なOBJ
ステートを登録する方法について説明しています:
import hou # ステートコールバックを実装したクラスを作成します。 class MyState(object): def __init__(self, state_name, scene_viewer): self.state_name = state_name self.scene_viewer = scene_viewer # ステートとそのバインドを表現したテンプレートを作成します。 state_name = "mystate" state_label = "My Custom State" node_type_category = hou.objNodeTypeCategory() extra_contexts = [hou.sopNodeTypeCategory(), hou.chopNodeTypeCategory()] template = hou.ViewerStateTemplate( state_name, state_label, node_type_category, contexts=extra_contexts ) template.bindFactory(MyState) # このテンプレートをHoudiniに登録します。 hou.ui.registerViewerState(my_template)
state_name
Viewer Stateを識別するための固有の文字列。
state_label
ユーザインターフェースで表示されるステートの人が解読可能な名前。
node_type_category
hou.NodeTypeCategoryのインスタンス。SOPsに関しては、以下の結果を使用します:
hou.sopNodeTypeCategory()
OBJステートを使用した場合:
hou.objNodeTypeCategory()
LOPステートを使用した場合:
hou.lopNodeTypeCategory()
DOPステートを使用した場合:
hou.dopNodeTypeCategory()
contexts
ステートに追加でコンテキストレベルを指定するためのhou.NodeTypeCategoryオブジェクトのリスト。
contexts
に追加可能な以下のどれかのタイプを選択します:
Note
未対応のタイプを使用すると例外が発生します。
Note
hou.lopNodeTypeCategory()は追加コンテキストに対応していないので、そのようなコンテキストでは使用することができません。
typeName()
→ str
Viewer Stateの識別に使用されている固有の文字列を返します。
categoryName()
→ str
適切なカテゴリオブジェクトの作成に使用可能なステートのノードタイプカテゴリの名前を返します。
bindFactory(callable)
ステートインターフェースの実装を返す(クラスまたは関数などの)コール可能オブジェクトを受け取ります。 通常では、ここにはクラス(Pythonクラスは、クラスのインスタンスを返すコール可能オブジェクトです)を渡します。 コール可能オブジェクトは、2つの引数を受け取るはずです: ステートの名前を含んだ文字列、現行ビューアを表現したhou.SceneViewerオブジェクト。
class MyState(object): def __init__(self, state_name, scene_viewer): self.state_name = state_name self.scene_viewer = scene_viewer def onMouseEvent(sefl, kwargs): ui_event = kwargs["ui_event"] def createViewerTemplate(*args): template = hou.ViewerStateTemplate("mystate", "My State", hou.sopNodeTypeCategory()) template.bindFactory(MyState) return template
bindHandle(handle_type, name, settings=None, cache_previous_parms=False, handle_parms=None)
動的にハンドルをステートにバインドします(bindHandleStatic()も参照してください)。 静的バインドは事前にハンドルを 条件なし でパラメータにバインドするのに対して、このメソッドの方だともっと柔軟性があり、実行時のコールバック関数によってバインドさせるパラメータを選択したり、複数のパラメータにバインドすることができます。
特定のハンドルを特定のパラメータにバインドさせる必要があることを事前にわかっているのであれば(これが通常のケースであれば)、代わりにbindHandleStatic()
を使用した方がわかりやすいです。
handle_type
ハンドルタイプの名前の文字列。選択できるハンドルタイプのリストは、ステートのハンドルタイプを参照してください。
name
ハンドルの識別に使用する固有の文字列。各バインドの名前は、 このステート内 では必ず固有にしてください。2回以上同じ名前のバインドを試すと例外が発生します。
settings
ハンドル固有の設定を含んだ文字列。複数の設定は、スペースで区切って指定してください。
これは、HUDスライダを値とロックの制限に特化した設定にバインドします。
t = hou.ViewerStateTemplate('my_state', 'my_state_label', hou.sopNodeTypeCategory()) t.bindHandle( 'hudslider', 'Modifier', cache_previous_parms=True, settings="hudrangelow(0) hudrangehigh(5) hudlocklow(0) hudlockhigh(5)" )
cache_previous_parms
Trueの場合、そのハンドルが以前の値の記録を維持します。これは、例えばユーザがハンドルをドラッグした速さを調べるためにユーザがハンドルを動かした時の差分を計算するコードを記述する場合に便利です。
handle_parms
特定のハンドルパラメータを有効にする際に使用可能なハンドルパラメータ名の配列。
handle_parms
が空っぽ(デフォルト)の時は、すべてのハンドルパラメータが有効になります。
以下のコードは、vector
ハンドルをバインドして、回転ベクトル(vx
)とtwist
パラメータのみを有効にします。
残りのハンドルパラメータは、そのUIコントロールでは無効になります。
t = hou.ViewerStateTemplate('my_state', 'my_state_label', hou.sopNodeTypeCategory()) t.bindHandle( 'vector', 'Vector', handle_parms=["vx","vy","vz", "twist"] )
bindHandleStatic(handle_type, name, bindings, settings=None)
ハンドルをViewerステートで駆動されるノードパラメータにバインドします。 ハンドルをドラッグすると、そのハンドルにバインドされたパラメータが自動的に更新されます。 bindHandle()も参照してください。
handle_type
ハンドルタイプの名前の文字列。
name
ハンドルの識別に使用する固有の文字列。各バインドの名前は、 このステート内 では必ず固有にしてください。2回以上同じ名前のバインドを試すと例外が発生します。
bindings
("node_parm_name", "handle_parm_name")
タプルのリスト。これは、ハンドルの一部をノードの個々のパラメータにバインドします。
settings
ハンドル固有の設定を含んだ文字列。複数の設定は、スペースで区切って指定してください。
t = hou.ViewerStateTemplate('my_state', 'my_state_label', hou.sopNodeTypeCategory()) ... t.bindHandleStatic( 'vector', 'Up Direction', [ ('group', 'input'), ('originx', 'tx'), ('originy', 'ty'), ('originz', 'tz'), ('upx', 'vx'), ('upy', 'vy'), ('upz', 'vz') ] )
bindGeometrySelector(prompt, allow_drag=False, quick_select=True, auto_start=True, toolbox=True, use_existing_selection=True, consume_selection=True, secure_selection=hou.secureSelectionOption.Obey, initial_selection="", initial_selection_type=hou.geometryType.Primitives, ordered=False, geometry_types=[], primitive_types=[], allow_other_sops=False, hotkey="", name="")
ジオメトリセレクターをSOPタイプのViewer Stateにバインドします。このセレクターは、大元のViewer Stateがアクティブな時にジオメトリエレメントの選択に使用します。 このセレクターは、シーンビューア内でのみ使用することができます。それ以外の場合には、登録(hou.ui.registerViewerStateTemplate)の時点で例外が発生します。
Viewer Stateには複数のジオメトリセレクターをバインドすることができます。 しかし、他のセレクタータイプと混在させることはできず、その場合には例外が発生します。
Viewer StateプラグインにonSelection
メソッドを実装することで、新しい選択を取得することができます。onSelection
メソッドは、その新しい選択を、入力のkwargs
辞書のselection
エントリーにhou.GeometrySelectionとして格納します。
選択ツールが終了されたらその戻り値はTrue
、実行中であればFalse
になります。また、Enterを押すとセレクターが終了します。
allow_drag
コンポーネントを選択する時に1回のマウスクリックで選択を完了させるかどうかを決定します。典型的には、これはコンポーネントが複数選択されないようにするために使用します。デフォルトはFalseです。
allow_other_sops
ビューポート内で可視の他のジオメトリノードからジオメトリのコンポーネント選択を許可します。デフォルトはFalse
です。
auto_start
True
(デフォルト)の場合、Viewer Stateがアクティブになった時にセレクターを開始します。False
の場合、セレクターをアクティブにするにはhotkey
引数を指定しなければなりません。
toolbox
True
(デフォルト)の場合、セレクターがアクティブになった時にセレクターツールボックスが表示されます。
False
の場合、セレクターツールボックスが非表示になります。
consume_selection
True
(デフォルト)の場合、セレクターが非アクティブになった時に現行選択がクリアされます。
geometry_types
ユーザが選択できるコンポーネントタイプを表現したhou.geometryType値の配列。 デフォルトは空っぽのリストで、セレクターがジオメトリ選択モードに従います。
hotkey
セレクターを開始/停止するスイッチとして作用するオプションのホットキー。デフォルトは空っぽの文字列です。
initial_selection
use_existing_selection
がFalse
の時、ここには、Viewer Stateがアクティブになった時に選択に設定したい内容を表現したコンポーネントグループ構文の文字列を指定します。デフォルトは選択なしです。
initial_selection_type
initial_selection
引数に指定されたコンポーネントのタイプを表現したhou.geometryType値。
デフォルトはNoneで、セレクターがジオメトリ選択モードに従います。
name
オプションのセレクターの名前ID(デフォルトはNone
)。このIDはViewer State内で固有にしてください。
この名前は、トリガーセレクターオペレーションで使用します。
ordered
これがTrue
の場合、Houdiniは、ユーザが選択した順番で選択内のコンポーネントを返します。デフォルトはFalse
なので、取得されるコンポーネントの順番は、選択した順番に関係ありません。
例えば、ユーザがクリックした最初または最後といった特定のプリミティブを区別する必要がある理由がある場合にのみ、これをTrue
に設定してください。
prompt
セレクターがアクティブになった時にビューポートで表示させるプロンプト。このprompt
は必須です。
primitive_types
ユーザが選択可能なプリミティブタイプを表現したhou.primType値のリスト。 空っぽのリスト(デフォルト)は、すべてのタイプの選択を許可します。
quick_select
これがTrue
の場合、選択内容が変わる度にステートの選択イベントがコールされます。
これがFalse
の場合、HoudiniはユーザがEnterを押して選択を完了するのを待ってから、新しい選択に関するステートを通知します。
secure_selection
このオプションを使用して、Secure Selectionのセレクターを設定します。 デフォルトでは、セレクターは常に現行ビューアのSecure Selection設定に準拠します。 詳細は、Secure Selection対応とhou.secureSelectionOptionを参照してください。
use_existing_selection
これがTrue
の場合、ユーザがステートをアクティブにした時にコンポーネント選択から抜けて、Houdiniは、その選択を使ってonSelection
をコールします。
これがFalse
の場合、Houdiniは既存選択をクリアして新しい選択を促します。
bindObjectSelector(prompt, quick_select=True, auto_start=True, toolbox=True, use_existing_selection=True, allow_multisel=True, secure_selection=hou.secureSelectionOption.Obey, allowed_types=('*',), hotkey="", name="")
オブジェクトセレクターをOBJタイプのViewer Stateにバインドします。 このセレクターは、大元のViewer Stateがアクティブな時にオブジェクト選択に使用します。 このセレクターは、シーンビューア内でのみ使用することができます。それ以外の場合には、登録(hou.ui.registerViewerStateTemplate)の時点で例外が発生します。
Viewer Stateには複数のオブジェクトセレクターをバインドすることができます。 しかし、他のセレクタータイプとOBJセレクターを混在させることはできず、その場合には例外が発生します。
Viewer StateプラグインにonSelection
メソッドを実装することで、新しい選択を取得することができます。onSelection
メソッドは、その新しい選択を、入力のkwargs
辞書のselection
エントリーにhou.Nodeオブジェクトのリストとして格納します。
選択ツールが終了されたらその戻り値はTrue
、実行中であればFalse
になります。また、Enterを押すとセレクターが終了します。
allowed_types
ユーザが選択可能な1つ以上のオブジェクトタイプを指定した文字列のリスト。
例えば、ジオメトリオブジェクトだけを選択できるようにするにはgeo
をallowed_types
に追加します。
*
などのパターンを使用することで、任意のオブジェクトを選択したり、*cam*
などの制限パターンを使用することで任意のカメラオブジェクトを選択することができます。
利用可能なすべてのオブジェクトタイプは、hou.objNodeTypeCategory.nodeTypesを使って取得することができます。デフォルトは*
です。
auto_start
True
(デフォルト)の場合、Viewer Stateがアクティブになった時にセレクターを開始します。
False
の場合、セレクターをアクティブにするためのhotkey
引数を指定しなければなりません。
toolbox
True
(デフォルト)の場合、セレクターがアクティブになった時にセレクターツールボックスが表示されます。
False
の場合、セレクターツールボックスは非表示になります。
hotkey
セレクターを開始/停止するスイッチとして作用するオプションのホットキー。デフォルトは空っぽの文字列です。
name
オプションのセレクターの名前ID(デフォルトはNone
)。このIDはViewer State内で固有にしてください。
この名前は、トリガーセレクターオペレーションで使用します。
prompt
セレクターがアクティブになった時にビューポートに表示するプロンプト。このプロンプトは必須です。
quick_select
これがTrue
の場合、選択が変わる度にステートの選択イベントがコールされます。
これがFalse
の場合、HoudiniはユーザがEnterを押して選択を終了するのを待って、その後で新しい選択に関するステートを知らせます。
デフォルトはTrue
です。
secure_selection
このオプションを使用して、Secure Selectionのセレクターを設定します。 デフォルトでは、セレクターは常に現行ビューアのSecure Selection設定に準拠します。 詳細は、Secure Selection対応とhou.secureSelectionOptionを参照してください。
use_existing_selection
これがTrue
の場合、ユーザがViewer Stateをアクティブにした時に既にコンポーネントが選択されていれば、Houdiniはその選択を使ってonSelection
をコールします。
これがFalse
の場合、Houdiniは既存の選択をクリアして、新しい選択を促します。
デフォルトはTrue
です。
bindSceneGraphSelector(prompt, allow_drag=True, quick_select=True, auto_start=True, toolbox=True, use_existing_selection=True, secure_selection=hou.secureSelectionOption.Obey, consume_selection=False, allow_multisel=True, prior_selection_paths=None, prim_mask=None, path_prefix_mask=None, prim_kind=None, hotkey="", name="")
シーングラフセレクターをSOPタイプのViewer Stateにバインドします。 このセレクターは、大元のViewer Stateがアクティブな時にシーングラフエレメント選択に使用します。 このセレクターは、シーングラフビューア内でのみバインドすることができます。それ以外の場合には、登録(hou.ui.registerViewerStateTemplate)の時点で例外が発生します。
Viewer Stateには複数のシーングラフセレクターをバインドすることができます。 しかし、他のセレクタータイプとシーングラフセレクターを混在させることはできず、その場合には例外が発生します。
Viewer StateプラグインにonSelection
メソッドを実装することで、新しい選択を取得することができます。onSelection
メソッドは、その新しい選択を、入力のkwargs
辞書のselection
エントリーにエレメントパスのリストとして格納します。
選択ツールが実行中であればその戻り値はTrue
、終了されたらFalse
になります。また、Enterを押すとセレクターが終了します。
allow_drag
1回のマウスクリックで選択を完了させることができます。デフォルトはTrueです。
allow_multisel
ツールが複数エレメントを選択することを許可します。デフォルトはTrueです。
auto_start
Viewer Stateがアクティブになった時にセレクターを開始します。デフォルトはTrueです。
toolbox
True
(デフォルト)の場合、セレクターがアクティブになった時にセレクターツールボックスが表示されます。
False
の場合、セレクターツールボックスが非表示になります。
consume_selection
Trueの場合、セレクターが非アクティブになった時に現行選択がクリアされます。デフォルトはFalse
です。
hotkey
セレクターを開始/停止するスイッチとして作用するオプションのホットキー。デフォルトは空っぽの文字列です。
name
オプションのセレクターの名前ID(デフォルトはNone
)。このIDはViewer State内で固有にしてください。
この名前は、トリガーセレクターオペレーションで使用します。
path_prefix_mask
名前の接頭辞で、選択可能なエレメントをフィルタリングします。デフォルトは空っぽです。
prim_kind
ハイライトさせるプリミティブの種類。デフォルトは空っぽです。
prim_mask
選択用フィルターマスク(hou.scenePrimMask)。デフォルトはhou.scenePrimMask.ViewerSettingです。
prior_selection_paths
事前選択するエレメントパスの配列。
prompt
セレクターがアクティブになった時にビューポートに表示するプロンプト。このプロンプトは必須です。
quick_select
セレクターがクィック選択を使用するように設定します。
True
の場合、選択の度に自動的に選択コールバックがコールされます。
False
の場合、ユーザはEnterを押して選択を完了しなければなりません。デフォルトはTrue
です。
secure_selection
このオプションを使用して、Secure Selectionのセレクターを設定します。 デフォルトでは、セレクターは常に現行ビューアのSecure Selection設定に準拠します。 詳細は、Secure Selection対応とhou.secureSelectionOptionを参照してください。
use_existing_selection
Trueの場合、セレクターは既存の選択を使用します。デフォルトはTrue
です。
bindDynamicsSelector(prompt, allow_objects=True, allow_modifiers=False, quick_select=True, auto_start=True, toolbox=True, use_existing_selection=True, secure_selection=hou.secureSelectionOption.Obey, allow_multisel=True, hotkey="", name="")
ダイナミクスセレクターをDOPタイプのViewer Stateにバインドします。 このセレクターは、大元のViewer Stateがアクティブな時にダイナミクスのオブジェクトとモディファイアを選択するのに使用します。 このセレクターは、シーンビューア内でのみ使用することができます。それ以外の場合には、登録(hou.ui.registerViewerStateTemplate)の時点で例外が発生します。
Viewer Stateには複数のダイナミクス/ポイント/ポリゴンセレクターをバインドすることができます。 しかし、他のセレクタータイプとDOPセレクターを混在させることはできず、その場合には例外が発生します。
Viewer StateプラグインにonSelection
メソッドを実装することで、新しい選択を取得することができます。onSelection
メソッドは、その新しい選択を、入力のkwargs
辞書のselection
エントリーにhou.DopDataオブジェクトのリストとして格納します。
選択ツールが終了されたらその戻り値はTrue
、実行中であればFalse
になります。また、Enterを押すとセレクターが終了します。
allow_modifiers
選択ツールがシミュレーションモディファイアの選択を許可します。
allow_modifiers
とallow_objects
の両方をFalseに設定すると例外が発生します。デフォルトはFalseです。
allow_multisel
選択ツールが複数のエレメントの選択を許可します。デフォルトはTrueです。
allow_objects
オブジェクト選択を許可します。allow_modifiers
とallow_objects
の両方をFalseに設定すると例外が発生します。デフォルトはTrueです。
auto_start
True
(デフォルト)の場合、Viewer Stateがアクティブになった時にセレクターを開始します。
False
の場合、セレクターをアクティブにするためのhotkey
引数を指定しなければなりません。
toolbox
True
(デフォルト)の場合、セレクターがアクティブになった時にセレクターツールボックスが表示されます。
False
の場合、セレクターツールボックスが非表示になります。
hotkey
セレクターを開始/停止するスイッチとして作用するオプションのホットキー。デフォルトは空っぽの文字列です。
name
オプションのセレクターの名前ID(デフォルトはNone
)。このIDはViewer State内で固有にしてください。
この名前は、トリガーセレクターオペレーションで使用します。
prompt
セレクターがアクティブになった時にビューポートに表示するプロンプト。このプロンプトは必須です。
quick_select
これがTrue
の場合、選択が変わる度にステートの選択イベントがコールされます。
これがFalse
の場合、HoudiniはユーザがEnterを押して選択を終了するのを待って、その後で新しい選択に関するステートを知らせます。
secure_selection
このオプションを使用して、Secure Selectionのセレクターを設定します。 デフォルトでは、セレクターは常に現行ビューアのSecure Selection設定に準拠します。 詳細は、Secure Selection対応とhou.secureSelectionOptionを参照してください。
use_existing_selection
これがTrue
の場合、ユーザがViewer Stateをアクティブにした時に既にコンポーネントが選択されていれば、Houdiniはその選択を使ってonSelection
をコールします。
これがFalse
の場合、Houdiniは既存の選択をクリアして、新しい選択を促します。
bindDynamicsPointSelector(prompt, allow_objects=True, allow_modifiers=False, quick_select=True, auto_start=True, toolbox=True, use_existing_selection=True, secure_selection=hou.secureSelectionOption.Obey, allow_multisel=True, only_select_points=True, object_based_point_selection=False, use_last_selected_object=False, hotkey="", name="")
ダイナミクスポイントセレクターをDOPタイプのViewer Stateにバインドします。 このセレクターは、大元のViewer Stateがアクティブな時にポイントエレメントの選択に使用します。 このセレクターは、シーンビューア内でのみ使用することができます。それ以外の場合には、登録(hou.ui.registerViewerStateTemplate)の時点で例外が発生します。
Viewer Stateには複数のダイナミクス/ポイント/ポリゴンセレクターをバインドすることができます。 しかし、他のセレクタータイプとDOPセレクターを混在させることはできず、その場合には例外が発生します。
Viewer StateプラグインにonSelection
メソッドを実装することで、新しい選択を取得することができます。onSelection
メソッドは、その新しい選択を、入力のkwargs
辞書のselection
エントリーに(hou.DopData,hou.GeometrySelection)タプルのリストとして格納します。
選択ツールが終了されたらその戻り値はTrue
、実行中であればFalse
になります。また、Enterを押すとセレクターが終了します。
allow_modifiers
選択ツールがシミュレーションモディファイアの選択を許可します。デフォルトはFalseです。
allow_multisel
選択ツールが複数のエレメントの選択を許可します。デフォルトはTrueです。
allow_objects
オブジェクト選択を許可します。デフォルトはTrueです。
auto_start
True
(デフォルト)の場合、Viewer Stateがアクティブになった時にセレクターを開始します。
False
の場合、セレクターをアクティブにするためのhotkey
引数を指定しなければなりません。
toolbox
True
(デフォルト)の場合、セレクターがアクティブになった時にセレクターツールボックスが表示されます。
False
の場合、セレクターツールボックスが非表示になります。
hotkey
セレクターを開始/停止するスイッチとして作用するオプションのホットキー。デフォルトは空っぽの文字列です。
name
オプションのセレクターの名前ID(デフォルトはNone
)。このIDはViewer State内で固有にしてください。
この名前は、トリガーセレクターオペレーションで使用します。
object_based_point_selection
False
の場合、一番近いオブジェクト上のポイントが選択されます。True
の場合、現在選択されているオブジェクト上のポイントを選択します。
デフォルトはFalseです。
only_select_points
デフォルトはTrueです。
prompt
セレクターがアクティブになった時にビューポートに表示するプロンプト。このプロンプトは必須です。
quick_select
これがTrue
の場合、選択が変わる度にステートの選択イベントがコールされます。
これがFalse
の場合、HoudiniはユーザがEnterを押して選択を終了するのを待って、その後で新しい選択に関するステートを知らせます。
secure_selection
このオプションを使用して、Secure Selectionのセレクターを設定します。 デフォルトでは、セレクターは常に現行ビューアのSecure Selection設定に準拠します。 詳細は、Secure Selection対応とhou.secureSelectionOptionを参照してください。
use_existing_selection
これがTrue
の場合、ユーザがViewer Stateをアクティブにした時に既にコンポーネントが選択されていれば、Houdiniはその選択を使ってonSelection
をコールします。
これがFalse
の場合、Houdiniは既存の選択をクリアして、新しい選択を促します。
use_last_selected_object
選択したオブジェクト上のポイントのみを選択できるようにし、他のオブジェクトの選択を許可しません。デフォルトはFalseです。
bindDynamicsPolygonSelector(prompt, quick_select=True, auto_start=True, toolbox=True, use_existing_selection=True, object_based_point_selection=False, secure_selection=hou.secureSelectionOption.Obey, use_last_selected_object=False, hotkey="", name="")
ダイナミクスポリゴンセレクターをDOPタイプのViewer Stateにバインドします。 このセレクターは、大元のViewer Stateがアクティブな時にポリゴンエレメントの選択に使用します。 このセレクターは、シーンビューア内でのみ使用することができます。それ以外の場合には、登録(hou.ui.registerViewerStateTemplate)の時点で例外が発生します。
Viewer Stateには複数のダイナミクス/ポイント/ポリゴンセレクターをバインドすることができます。 しかし、他のセレクタータイプとDOPセレクターを混在させることはできず、その場合には例外が発生します。
Viewer StateプラグインにonSelection
メソッドを実装することで、新しい選択を取得することができます。onSelection
メソッドは、その新しい選択を、入力のkwargs
辞書のselection
エントリーに(hou.DopData,hou.GeometrySelection)タプルのリストとして格納します。
選択ツールが終了されたらその戻り値はTrue
、実行中であればFalse
になります。また、Enterを押すとセレクターが終了します。
auto_start
True
(デフォルト)の場合、Viewer Stateがアクティブになった時にセレクターを開始します。
False
の場合、セレクターをアクティブにするためのhotkey
引数を指定しなければなりません。
toolbox
True
(デフォルト)の場合、セレクターがアクティブになった時にセレクターツールボックスが表示されます。
False
の場合、セレクターツールボックスが非表示になります。
hotkey
セレクターを開始/停止するスイッチとして作用するオプションのホットキー。デフォルトは空っぽの文字列です。
name
オプションのセレクターの名前ID(デフォルトはNone
)。このIDはViewer State内で固有にしてください。
この名前は、トリガーセレクターオペレーションで使用します。
object_based_point_selection
False
の場合、一番近いオブジェクト上のポイントが選択されます。True
の場合、現在選択されているオブジェクト上のポイントを選択します。
デフォルトはFalseです。
prompt
セレクターがアクティブになった時にビューポートに表示するプロンプト。このプロンプトは必須です。
quick_select
これがTrue
の場合、選択が変わる度にステートの選択イベントがコールされます。
これがFalse
の場合、HoudiniはユーザがEnterを押して選択を終了するのを待って、その後で新しい選択に関するステートを知らせます。
secure_selection
このオプションを使用して、Secure Selectionのセレクターを設定します。 デフォルトでは、セレクターは常に現行ビューアのSecure Selection設定に準拠します。 詳細は、Secure Selection対応とhou.secureSelectionOptionを参照してください。
use_existing_selection
これがTrue
の場合、ユーザがViewer Stateをアクティブにした時に既にコンポーネントが選択されていれば、Houdiniはその選択を使ってonSelection
をコールします。
これがFalse
の場合、Houdiniは既存の選択をクリアして、新しい選択を促します。
use_last_selected_object
選択したオブジェクト上のポリゴンのみを選択できるようにし、他のオブジェクトの選択を許可しません。デフォルトはFalseです。
bindSelector(name, selector_type, prompt, primitive_types=None, group_parm_name=None, input_index=0, input_required=True, allow_dragging=True)
このViewer Stateに関連付けられたデジタルアセットにセレクターをバインドします。 同じViewer Stateに複数のセレクターをバインドすることができます。
典型的には、これらのセレクターは、SOP
ノードの新しいインスタンスを作成するデジタルアセットのシェルフツールで使用します。
Houdiniは、バインドされたセレクターすべてを呼び出し、ユーザがジオメトリを選択するのを待ってから、その入力のSOP
sを接続して、選択された内容をグループパラメータに設定します。
このタイプのセレクターは、hou.ViewerStateTemplate.bindGeometrySelectorまたはhou.ViewerStateTemplate.bindObjectSelectorを使って作成されるセレクターとは異なります。このセレクターはHoudini側で完全に使用され、hou.SceneViewer.triggerStateSelectorを使ってトリガーさせることができません。
name
固有のセレクター名の識別子。
selector_type
バインドするセレクターのタイプ。以下のタイプに対応しています:
タイプ |
説明 |
---|---|
|
プリミティブのみを選択します。 |
|
ポイントのみを選択します。 |
|
エッジのみを選択します。 |
|
ジオメトリを選択します。 |
prompt
ユーザに選択すべき内容を指示するためにビューポートに表示するプロンプト。このプロンプトは必須です。
primitive_types
選択可能プリミティブのタイプ(hou.primType)を指定します。デフォルトは、すべてのタイプです。
group_parm_name
グループフィールドを含んだSOPノードパラメータの名前。 セレクターは、ユーザがビューア内で選択したポイント、プリミティブ、エッジなどを表現した文字列をこのパラメータに設定します。 Noneの場合、セレクターは“group”という名前のパラメータを検索します。
input_index
セレクターが入力のSOP
sを接続するSOP
ノードの入力コネクタのインデックス。
例えば、Cookie SOP
には2つの入力コネクタがあります。
このSOP
に2個のセレクターがあれば、各入力コネクタに1個のセレクタが接続されます。デフォルトは0です。
input_required
入力が必須かどうかを指定します。ユーザが何もジオメトリを選択せず、入力が必須でない場合、セレクターは入力コネクタに何も接続しません。 デフォルトはTrueです。
allow_dragging
クリックアンドドラッグの操作を許可するかどうかを決定します。 クリックアンドドラッグの操作は、1回のマウスドラッグでジオメトリを選択してハンドルの制御を開始します。 ジオメトリをドラッグすると、セレクターが即座に終了し、そのセレクターが入力を接続して、グループパラメータを設定し、それ以降のマウスの動きがハンドルに渡されます。 そのハンドルのパラメータ値を変更することでジオメトリを移動させることができます。デフォルトはTrueです。
bindDrawableSelector(prompt, auto_start=True, toolbox=True, drawable_mask=[], hotkey="", name="")
Binds a drawable selector to a viewer state to select drawable components such as points, faces and lines. Drawable selectors are supported for the SOP, OBJ and LOP contexts. The selector selects components of drawables created by the viewer state, a mask can be used to make specific drawables selectable. Drawables created by the viewer state not in the mask are ignored by the selector.
A selection event is triggered whenever the selection changes, the onSelection
handler can be implemented by the viewer state plug-in to receive new
selections. The locate information is sent to the viewer state whenever the mouse is positioned over drawable components, the onLocateSelection
handler
can be implemented by the viewer state plug-in to receive new drawable locate information. The viewer state typically uses these handlers for drawing the
located and selected drawable components. See Binding a drawable selector for more details.
auto_start
True
(デフォルト)の場合、Viewer Stateがアクティブになった時にセレクターを開始します。
False
の場合、セレクターをアクティブにするためのhotkey
引数を指定しなければなりません。
toolbox
True
(デフォルト)の場合、セレクターがアクティブになった時にセレクターツールボックスが表示されます。
False
の場合、セレクターツールボックスが非表示になります。
hotkey
セレクターを開始/停止するスイッチとして作用するオプションのホットキー。デフォルトは空っぽの文字列です。
name
オプションのセレクターの名前ID(デフォルトはNone
)。このIDはViewer State内で固有にしてください。
この名前は、トリガーセレクターオペレーションで使用します。
drawable_mask
A list of drawable names representing selectable drawables. By default (empty list) all drawables created by a python state are selectable.
prompt
セレクターがアクティブになった時にビューポートに表示するプロンプト。このプロンプトは必須です。
bindMenu(menu)
このViewer Stateにコンテキストメニューを取り付けます。テンプレート毎に1個のコンテキストメニューのみバインドすることができます。
bindParameter(param_type, name=None, label=None, menu_as_button_strip=False, menu_items=[], num_components=1, default_value=None, min_limit=0, max_limit=1, align=False, toolbox=True)
Viewerステート用のパラメータテンプレートを作成します。 このテンプレートは、パラメータが保持する名前やデータなどの設定を持ったパラメータを表現します。 このパラメータの使い方の詳細は、ステートパラメータを参照してください。
align
Parameter Dialog
でのパラメータの配置方法を指定します。
Trueの場合、このパラメータは、次のバインドされたパラメータと水平に整列されます。
Falseの場合、このパラメータは、前のバインドされたパラメータより下に表示されます。
デフォルトはFalseです。
default_value
パラメータのデフォルト値。
これは、Houdiniがパラメータを初期化する際に使用する値です。
この値のタイプはparam_type
に一致するのが望ましいですが、Houdiniがそのタイプを適切にうまく変換します。
デフォルトはNoneです。
パラメータタイプ |
値のタイプ |
---|---|
この値は無視されます。 |
|
|
|
ブールまたはintとしてのトグルステート。 |
name
パラメータ文字列識別子。 この名前には、空っぽの文字列を指定することはできません。必ずステート内で固有にしてください。 そうしないと、例外が引き起こされます。
label
パラメータラベル。None
(デフォルト)に設定すると、このラベルがパラメータ名で設定されます。
min_limit
パラメータがUIダイアログ内で設定可能な最小値を設定します。デフォルトは0です。 以下のタイプと併用します:
max_limit
パラメータがUIダイアログ内で設定可能な最大値を設定します。デフォルトは1です。 以下のタイプと併用します:
num_components
パラメータテンプレート用に作成するコンポーネントの数を指定します。 デフォルトは1です。値が無効であれば、例外が引き起こされます。
num_components
> 1は以下のタイプで対応しています:
param_type
バインドするパラメータのタイプ。以下のタイプに対応しています:
他のタイプは例外を引き起こします。
toolbox
パラメータはParameter Dialog
内で常に表示されますが、このフラグを設定することで、Operation Toolbox
でもパラメータを表示することができます。
bindIcon(icon_name)
このViewerステートのアイコン画像を設定します。
icon_name
アイコンの名前。デフォルトはMISC_python
です。
アイコンの名前は、以下のように指定することができます:
-
単一名。
-
ディスク上の画像アイコンファイルのパス。ディスク上のアイコンファイルの置き場所に慣例はありません。例:
template.bindIcon("$HOUDINI_USER_PREF_DIR/config/Icons/myicon.pic")
-
Viewerステートを
Digital Asset
で実装した場合はopdef
パス。例:template.bindIcon("opdef:/Object/myop?myicon.pic")
bindSupportsSelectionChange(supports_change)
このステートがUSDプリミティブ選択の変更を処理できることをLOP Viewerペインに伝えます。
Edit LOPのステートが良い例です。
Scene Graph Tree内でプリミティブ選択を変更すると、このノードは、ハンドルを新しい選択の重心まで動かして、その新しく選択されたプリミティブの制御を開始します。
bindSupportsMoveTool(supports_movetool)
Indicates to the LOP Viewer pane that this state can provide a “move tool” for the currently selected primitives. The state for the Edit LOP is a good example of such a state.
bindGadget(drawable_type, gadget_name, gadget_label=None)
Gadget DrawableをViewerステートにバインドすることができます。 ガジェットは、マウス下のジオメトリをピック(選択)やロケート(マウス下の検索)することができる特別なジオメトリDrawableです。
Houdiniは、バインド情報を使用してGadget Drawableインスタンスを作成するので、このタイプのオブジェクトをあなた自身で作成する必要はありません。
ガジェットインスタンスは、辞書に格納され、state_gadgets
クラスアトリビュートを使ってアクセスすることができます。
ガジェット名を使用することで、特定のガジェットのself.state_gadgets
を照会することができます。
Note
self.state_gadgets
は__init__
クラスメソッドからアクセスすることができませんが、他のクラスメソッドからself.state_gadgets
を使用することはできます。
Houdiniにはピック(選択)とロケート(マウス下の検索)の機能が用意されているので、ガジェットコンポーネントをピックまたはロケートする機能を独自で実装する必要がありません。
hou.ViewerStateContextは、アクティブなガジェットのピックとロケートの情報を保存するためにHoudiniに使用され、
このコンテキストは、Houdiniによって作成され、state_context
クラスアトリビュートを使ってアクセスすることができます。
import viewerstate.utils as su def createViewerStateTemplate(): state_typename = "state gadgets" state_label = "State gadgets" state_cat = hou.sopNodeTypeCategory() template = hou.ViewerStateTemplate(state_typename, state_label, state_cat) template.bindFactory(State) template.bindIcon(kwargs["type"].icon()) template.bindGadget( hou.drawableGeometryType.Line, "line_gadget", label="Line" ) template.bindGadget( hou.drawableGeometryType.Face, "face_gadget", label="Face" ) template.bindGadget( hou.drawableGeometryType.Point, "point_gadget", label="Point" ) return template class State(object): def __init__(self, state_name, scene_viewer): self.state_name = state_name self.scene_viewer = scene_viewer self.cursor = su.CursorLabel(scene_viewer) def onEnter(self, kwargs): """Gadget Drawablesを初期化し、それらをクラスアトリビュートに割り当てます。 """ node = kwargs["node"] self.geometry = node.geometry() self.line_gadget = self.state_gadgets["line_gadget"] self.line_gadget.setGeometry(self.geometry) self.line_gadget.setParams({"draw_color":[.3,0,0,1], "locate_color":[1,0,0,1], "pick_color":[1,1,0,1], "line_width":2.0}) self.line_gadget.show(True) self.face_gadget = self.state_gadgets["face_gadget"] self.face_gadget.setGeometry(self.geometry) self.face_gadget.setParams({"draw_color":[0,.3,0,1], "locate_color":[1,0,0,1],"pick_color":[1,1,0,1]}) self.face_gadget.show(True) self.point_gadget = self.state_gadgets["point_gadget"] self.point_gadget.setGeometry(self.geometry) self.point_gadget.setParams({"draw_color":[0,0,.3,1], "locate_color":[0,0,1,1], "pick_color":[1,1,0,1], "radius":15.0}) self.point_gadget.show(True) def onMouseEvent(self, kwargs): """カーソルのテキスト位置とDrawableジオメトリを計算します。 """ # マウスのkwargsでカーソルを初期化します。 self.cursor.setParams(kwargs) # アクティブなガジェット情報を使用してカーソルのラベルを設定します。 gadget_name = self.state_context.gadget() if gadget_name in ["line_gadget", "face_gadget", "point_gadget"]: gadget = self.state_gadgets[gadget_name] label = self.state_context.gadgetLabel() c1 = self.state_context.component1() c2 = self.state_context.component2() self.cursor.setLabel("{} : {} {}".format(label, c1, c2 if c2 > -1 else "")) self.cursor.show(True) else: self.cursor.show(False) return True def onDraw( self, kwargs ): handle = kwargs["draw_handle"] self.line_gadget.draw(handle) self.face_gadget.draw(handle) self.point_gadget.draw(handle)
geometry_drawable_type
ガジェットのジオメトリタイプ。以下のタイプに対応しています:
gadget_name
ガジェット名の文字列識別子。
gadget_label
オプションの説明的名前。デフォルトはNoneです。
bindNodeChangeEvent(event_types)
Binds an event handler to the state for listening to a particular event that occurs on the state’s node instance. onNodeChangeEvent must be implemented by the state to respond to events.
Binding a node event is similar to hou.Node.addEventCallback, but there is no need to provide a callback or to remove it by yourself when the state exits, Houdini takes care of it for you.
event_types
A list of hou.nodeEventType enumeration values describing the event types to listen to.
An error is raised if the list is empty.
bindNodeParmChangeEvent(parm_names)
Binds an event handler to the state for listening to parm changes occuring on the state’s node. onNodeChangeEvent
must be implemented by the state to respond to parm events. This method is similar to hou.Node.addParmCallback, it’s
considered more efficient than bindNodeChangeEvent
as Houdini will trigger onNodeChangeEvent
only for the changes
that occurs for the parms you want to track.
parm_names
A list of node parm names used by Houdini for filtering out the parm changes that occur on the state’s
node. Only the changes that match the parms specified in parm_names
are sent to onNodeChangeEvent.
An error is raised if the list is empty.
bindPlaybackChangeEvent()
Binds an event handler to the state for listening to playbar events such as hou.playbarEvent.Started
and hou.playbarEvent.FrameChanged. The state must implement onPlaybackChangeEvent
to respond to playback events. bindPlaybackChangeEvent
is similar to hou.playbar.addEventCallback` but
you don’t need to provide a callback or to remove it when the state exits, Houdini takes care of it for you.