Houdini 20.0 Pythonスクリプト

Pythonステート パラメータ

パラメータをステートにバインドして、そのステートをパラメータ変更に反応させる方法。

On this page

概要

ステートパラメータは、Viewerステートの挙動を制御する際に使用します。 例えば、ガイドジオメトリをスケールするためのfloatパラメータを使用したり、特定のスクリプトを発動させるためのボタンパラメータを定義することができます。 ステートにバインドされたパラメータは、Parameter Dialog内で変更することができ、オプションでビューポート内の上部にあるOperation Toolbox Dialogで変更することもできます。

パラメータをバインドさせる方法

ステートを登録する時に1個以上のパラメータを定義することができます。 hou.ViewerStateTemplate.bindParameterは、パラメータ名、パラメータを格納するデータタイプなどの設定を定義することで、ステートにパラメータテンプレートを追加することができます。 その結果のテンプレートは、ステートインスタンスが生成される時に実際のパラメータをインスタンス化する際に使用されます。

以下コードは、デモシーンのステート実装です:$HH/viewer_states/examples/state_parms_demo.hip。 このシーンは、パラメータによってビューポート内でテキストの描画を駆動させるOBJステートを埋め込んでいます。

Note

onParmChangeEventコールバックについては、ここで説明しています。 state_parm辞書については、ここで説明しています。

import hou
import viewerstate.utils as su

# パラメータダイアログにのみ表示される事前定義されたテキストサイズの値を使ってメニューパラメータを定義します。
menu_item_info = [
    ('text_size_05', '0.5', 'BUTTONS_calc'), 
    ('text_size_1', '1.0', 'BUTTONS_calc'), 
    ('text_size_2', '2.0', 'BUTTONS_calc'), 
    ('text_size_5', '5.0', 'BUTTONS_calc')]

class State(object):
    def __init__(self, state_name, scene_viewer):
        self.state_name = state_name
        self.scene_viewer = scene_viewer        
        self.text_scale = hou.Vector3()
        self.menu_item_dict = { menu_items[0]:float(menu_items[1]) for menu_items in menu_item_info}

        # ビューポート内にテキスト文字列を描画するためのDrawable。
        self.text_drawable = hou.TextDrawable(self.scene_viewer, 'text_drawable_name',
            params = {'margins': (10.0,10.0)} )
        self.text_drawable.show(True)

    def onEnter(self, kwargs):
        """
        ステートに入すると、いくつかのパラメータを無効にします。
        """
        node = kwargs['node']
        state_parms = kwargs['state_parms']

        # テキストスケールを設定します。
        size = state_parms['text_size']['value']
        self.text_scale = hou.Vector3(size,size,size)

        # テキストサイズのプリセットメニューを非表示にして、トグルボタンのチェックを外します。
        state_parms['text_size_menu']['visible'] = False
        state_parms['enable_text_size_menu']['value'] = False

    def onParmChangeEvent(self, kwargs):
        """
        パラメータの変更に反応させます。
        """
        parm_name = kwargs['parm_name']
        parm_value = kwargs['parm_value']
        state_parms = kwargs['state_parms']

        if parm_name == 'text_size':
            # テキストスケールを設定します。
            self.text_scale = hou.Vector3(parm_value,parm_value,parm_value)            
        elif parm_name == 'text_size_menu':
            # 選択したプリセットでテキストサイズを設定します。
            size = self.menu_item_dict[parm_value]
            self.text_scale = hou.Vector3(size,size,size)
            state_parms['text_size']['value'] = size
        elif parm_name == 'text_size_reset':
            # テキストサイズをリセットします。
            size = 1.0
            self.text_scale = hou.Vector3(size,size,size)
            state_parms['text_size']['value'] = size
        elif parm_name == 'enable_text_size_menu':
            # テキストサイズメニューを有効または無効にします。
            state_parms['text_size_menu']['visible'] = parm_value

        # テキストを強制的に再描画します。
        self.scene_viewer.curViewport().draw()

    def onDraw( self, kwargs ):
        # ビューポート内の左下(デフォルトの原点)にテキストを描画します。
        handle = kwargs['draw_handle']
        state_parms = kwargs['state_parms']

        params = {
            'text': state_parms['text']['value'],
            'scale' : self.text_scale }

        self.text_drawable.draw( handle, params )


def createViewerStateTemplate():
    """登録するViewerステートテンプレートを作成して返すための必須エントリーポイント。"""

    state_typename = kwargs["type"].definition().sections()["DefaultState"].contents()
    state_label = "State parms demo"
    state_cat = hou.objNodeTypeCategory()

    template = hou.ViewerStateTemplate(state_typename, state_label, state_cat)
    template.bindFactory(State)
    template.bindIcon('$HFS/houdini/pic/minimizedicon.pic')

    # 描画するテキストを格納するための文字列パラメータを定義します。
    template.bindParameter( hou.parmTemplateType.String, name="text", label="Text",
        default_value="Lorem ipsum dolor sit amet." )

    # 最小/最大範囲を持ったテキストサイズ浮動小数点パラメータを定義します。
    template.bindParameter( hou.parmTemplateType.Float, name="text_size", 
        label="Text Size", min_limit=0.5, max_limit=5, 
        default_value=0.75 )

    # ファクトリー値でテキストサイズをリセットするためのボタンパラメータを定義します。
    template.bindParameter( hou.parmTemplateType.Button, name="text_size_reset", 
        label="Reset Text Size" )

    # テキストサイズのプリセットメニューを表示/非表示するためのトグルパラメータを定義します。
    template.bindParameter( hou.parmTemplateType.Toggle, name="enable_text_size_menu", 
        label="Enable Text Size Menu", default_value=True, align=True )

    # カーソルサイズのプリセット値でメニューパラメータを定義します。
    template.bindParameter( hou.parmTemplateType.Menu, name="text_size_menu", 
        label="Text Size Presets", default_value='text_size_1', 
        menu_items=menu_item_info, toolbox=False )

    return template

パラメータの変更に反応させる方法

onParmChangeEventコールバックは、パラメータの変更に反応させる際に使用します。 Houdiniは、パラメータダイアログでパラメータが変更された後で、以下の関数(が定義されていれば)をコールします。

onParmChangeEvent( self, kwargs )

このコールバックは、以下の項目を含んだ辞書引数(kwargs)を受け取ります:

parm_name

変更されたパラメータの名前。

parm_value

そのパラメータの新しい値。 hou.parmTemplateType.Menuパラメータに関しては、parm_valueは新しく選択されたメニュー項目で、 hou.parmTemplateType.Buttonパラメータに関しては、値は何も意味がありません。

複数のコンポーネントで定義されたパラメータに関しては、parm_valueはコンポーネント値すべてを含んだリストです。 パラメータをバインドした時に使用されるnum_components引数を参照してください。

ステートのサンプルonParmChangeEvent実装を確認してください。

パラメータUIを更新する方法

Viewerステートパラメータには、UIステートを変更するために修正可能なプロパティ(またはステート)があります。 これらのパラメータを動的に変更すると、インターフェースがもっと効率的でもっと使いやすくなります。 例えば、パラメータを無効にすることでパラメータダイアログ内でそのパラメータをグレーアウトしたり、Visibilityプロパティを変更することでそのパラメータを完全に非表示することができます。

コールバックのkwargs引数を介してstate_parms辞書からパラメータプロパティにアクセスすることができます。 このstate_parms辞書は、エントリーと各ステートパラメータ名をマップします。 これらのエントリーそれぞれが、パラメータプロパティ値とそれらのキーをマップした辞書を含んでいます:

  • enable: パラメータを有効または無効にするブール値。

  • value: パラメータ値。

  • visibility: パラメータを表示または非表示するブール値。

パラメータ更新の使い方は、onParmChangeEventコールバックを参照してください。

更新が可能なコールバック

たいていのコールバックは、state_parmsにアクセスすることができ、Operation toolboxParameter Dialogの両方で1つ以上のパラメータのプロパティを更新することができます。

ただし、以下のコールバックは、読み込み専用のアクセスに制限されています:

  • onMouseEvent

  • onDraw

  • onDrawInterrupt

Note

これらのコールバックからパラメータプロパティを変更することは可能ですが、変更してもパラメータUIステートは更新されません。

Pythonスクリプト

はじめよう

次のステップ

リファレンス

  • hou

    Houdiniにアクセスできるサブモジュール、クラス、ファンクションを含んだモジュール。

導師レベル

Python Viewerステート

Pythonビューアハンドル

プラグインタイプ