Houdini 19.0 Pythonスクリプト

Pythonで独自のビューアハンドルを記述する方法

ビューアハンドルは、インタラクティブにパラメータを変更することができる独自ハンドルです。

On this page

Pythonビューアハンドル

概要

Houdiniでは、拡張機能を使ってPythonでビューアハンドルを実装することで、Pythonステートのワークフローをカスタマイズすることができます:

  • Drawable Gadgetsを使用してハンドルコンポーネントを描画、ピック、ハイライトすることができます。

  • Handle Draggersを使用してマウス制御を拡張することができます。

  • Houdiniパラメータを使用してパラメータを定義し、特定のパラメータをPythonステートにエクスポートするように選択することができます。

  • Geometry Drawablesを使用してガイドジオメトリを作成することができます。

  • ローレベルでマウス、キーボード、タブレットのイベントに応答することができます。

Viewer Handle Code Generatorを使用することで、様々なサンプルソースからソースコードを作成することができます。 Pythonハンドルソースコードを配置してHoudiniに登録すると、Pythonステートは、ハンドルのバインドを介して一般的な方法でそれらのコードを使用することができます。

Houdiniにビューアハンドルをインストールする方法

Pythonハンドルは、Pythonファイルモジュールを使ってHoudiniにコードを読み込んだり、HDAに埋め込むことができます。 どちらの方法でも、Pythonステートの登録に登録コールバックを使用したのと同様に、登録コールバックを介してPythonハンドルをHoudiniにインストールする必要があります。

createViewerHandleTemplateという名前のコールバックでは、Pythonハンドルの内容(ハンドルのタイプ名、パラメータ、ガジェットなど)を記述します。 Houdiniは、PythonステートでPythonハンドルが必要になった時に、この情報を使用してそのPythonハンドルのインスタンスを生成します。 Pythonハンドルの内容を記述する方法の詳細は、hou.ViewerHandleTemplateを参照してください。

Use the Viewer Handle Code Generator to create the handle skeleton code along with the registration function. The code generator is available from the Viewer Handle Browser window or from the Handle script tab for viewer handles embedded in an HDA.

You can still create the code by yourself from scratch though, but the code generator will let you get your Python handle up and running in no time with no syntax errors.

この登録処理は、起動時またはhou.ui.registerViewerHandle()hou.ui.reloadViewerHandle()などの登録APIを使用した時に行なわれます。

典型的な登録コールバックは以下のようになります:

def createViewerHandleTemplate():
    """ このエントリーポイントは、ビューアハンドルをHoudiniに登録するのに必須です。
    """
    handle_type = 'viewer_handle_intro1'
    handle_label = 'Viewer Handle Intro1'
    handle_cat = [hou.sopNodeTypeCategory()]

    template = hou.ViewerHandleTemplate(handle_type, handle_label, handle_cat)
    template.bindFactory(Handle)

    # 他のバインドをここで実装します。
    return template

Note

PythonハンドルとPythonステートは、Houdini起動時にほぼ同時にインストールされますが、これら2つにおける登録の順番は重要ではありません。 Houdiniでは、PythonステートがPythonハンドルをバインドできるようにそのPythonハンドルが先にインストールされている必要はありません。 この登録の過程では、PythonハンドルパラメータとPythonステートノードパラメータ間のバインド情報のみが収集されます。 これらのバインドは、後でPythonステートが実行された時にHoudiniによって使用され、この登録の過程では、適切な検証が行なわれ、問題があればバインドエラーが起きます。

Embedding a handle in an asset

These instructions demonstrate how to create a SOP asset for embedding a Python viewer handle.

  1. At the Object level, use the ⇥ Tab menu to create a Geo object.

  2. Double-click the geo1 node to dive into the Geometry network inside.

  3. Use the ⇥ Tab menu to create a Subnetwork node.

  4. Right-click the subnet1 node and choose Create digital asset.

  5. Set the Operator name to handle_demo, the Operator Label to Handle Demo, and Save to library to Embedded.

    Setting the library location to Embedded saves the asset with the current scene file instead of in an asset library.

  6. Open the type properties window for the asset. (Right click an instance of the asset type and choose Type properties).

  7. Click the Interactive|Handle Script tab.

  8. Click the New… button to generate the handle code.

  9. Select the Rotate sample event handler and click Accept.

  10. Click the Apply button to register the new handle.

The Handle script editor should display the code for a Python handle capable of rotating a geometry around an axis. The new handle should be listed under the Handle Demo node in the the Viewer Handle Browser tree.

To test the new handle, you need to create a viewer state to bind the handle.

  1. Click the Interactive|State Script tab.

  2. Click the New… button to generate the state code.

  3. Enter state_rotate_demo as the state’s name in the Name field.

  4. Select the Static Handle sample event handler and click Accept.

  5. Replace this line

    HANDLE_TYPENAME = "unknown"

    with

    HANDLE_TYPENAME = "handle_demo"

  6. Replace this line

    template.bindHandleStatic( HANDLE_TYPENAME, HANDLE_NAME, [] )

    with

    template.bindHandleStatic( HANDLE_TYPENAME, HANDLE_NAME, [("ry","ry")] )

  7. Add a float parameter in the asset called ry.

  8. Click Accept.

The new state state_rotate_demo should be listed in the Viewer State Browser window. You can see the new handle_demo entry by expanding the state browser’s node.

Now create a box geometry and add this channel ch("../subnet1/ry") to the box’s Rotate Y field.

Select the demo asset node in the network editor. Move the mouse into the scene viewer and press Enter. The handle should be drawn as a green ring, pick and drag the ring to rotate the box.

Houdiniパスからハンドルを読み込む方法

以下の手順では、Houdini起動時に自動的に登録されるPythonハンドルモジュールの作成方法について説明しています。

  1. New Pane Tab Type ▸ Inspectors ▸ Viewer Handle Browser メニューからViewer Handle Browserウィンドウを開きます。

  2. ブラウザのツールバーのリストメニューからSopカテゴリを選択します。

  3. File ▸ New Handle… メニューでViewer Handle Code Generatorを開きます。

  4. ハンドルの名前 として Name フィールドにhandle_demoと入力します。

  5. Samples オプションでGadgetを選択して、 Accept をクリックします。

サンプルコードを含んだ新しいPythonハンドルファイルが$HOUDINI_USER_PREF_DIR/viewer_handlers/handle_demo.pyとして保存され、Viewer Handle BrowserツリーHandle demoとしてリストされているはずです。

import hou
import resourceutils as ru
import viewerhandle.utils as hu

#使用方法: 何も処理をせずハンドルガジェットを描画するだけの単純なハンドル。

GADGET_PIVOT = "pivot"
SCALE = 250.0

class Handle(object):

    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

        # ハンドルのトランスフォーム操作をサポートするユーティリティクラス。
        self.xform_aid = hu.TransformAid(self,kwargs)

        # ここでは、ガジェットをクラスアトリビュートとして保存します。
        # ガジェットはself.handle_gadgets attributeを介していつでも利用可能なので、これは任意です。
        color_options = ru.ColorOptions(self.scene_viewer)
        self.pivot = self.handle_gadgets[GADGET_PIVOT]
        self.pivot.setParams({"draw_color":color_options.colorFromName("HandlePivotColor")})

        # ピボットガジェットにBoxジオメトリを割り当てます。
        sops = hou.sopNodeTypeCategory()
        verb = sops.nodeVerb("box")
        verb.setParms({"type":1, "scale":0.1, "divrate":(2,2,2)})
        pivot = hou.Geometry()
        verb.execute(pivot, [])
        self.pivot.setGeometry(pivot)
        self.pivot.show(True)

    def onDraw( self, kwargs ):
        draw_handle = kwargs["draw_handle"]

        # ピボットガジェットを描画します。
        self.pivot.draw(draw_handle)

    def onDrawSetup(self, kwargs):
        """ 描画、ピック、ロケート(マウス下の検索)の操作をする前にコールされます。"""

        # カメラ位置に関係なくスケール係数でピボットガジェットをスケールします。
        origin = hou.Vector3()
        scale = self.handle_context.scaleFactor(origin)*SCALE
        scales = [scale]*3

        xform = self.xform_aid.updateTransform(s=scales)
        self.pivot.setTransform(xform)

def createViewerHandleTemplate():
    """ 登録するビューアハンドルテンプレートを作成して返すための必須エントリーポイント。"""

    handle_type = "handle_demo"
    handle_label = "Handle demo"
    handle_cat = [hou.sopNodeTypeCategory()]

    template = hou.ViewerHandleTemplate(handle_type, handle_label, handle_cat)
    template.bindFactory(Handle)
    template.bindIcon("MISC_python")

    # Drawable Gadgetをハンドルにバインドします。
    # このガジェットは、基本的にはビューポート内でインタラクティブに操作可能なハンドルコンポーネントを定義する際に使用されるGeometry Drawablesです。
    #
    # このガジェットは、マウス下の位置の特定やピックといった一般的なハンドル操作を実行する際にHoudiniで使用されます。
    #
    # ガジェットインスタンスは、Houdiniで生成され、このデータメンバーを介してHandleオブジェクトで利用可能にします:
    # self.handle_gadgets: 名前でキーを設定可能なガジェットの辞書。
    template.bindGadget( hou.drawableGeometryType.Face, GADGET_PIVOT )

    return template

このハンドルをテストするために、以下の手順に従います:

  1. Objectレベルで⇥ Tabメニューを使用してGeoオブジェクトを作成します。

  2. そのgeo1ノードをダブルクリックしてGeometryネットワークの中に入ります。

  3. ⇥ Tabメニューを使用してSubnetworkノードを作成します。

  4. そのsubnet1ノードを右クリックして Create Digital Asset を選択します。

  5. Operator Namestate_handle_demoOperator LabelState Handle DemoSave to LibraryEmbeddedに設定します。

    このライブラリの保存場所をEmbeddedに設定することで、アセットライブラリではなく現行シーンファイルにアセットが保存されます。

  6. このアセットのType Propertiesウィンドウが開きます(アセットタイプのインスタンスを右クリックして Type Properties を選択)。

  7. Interactive|State Script タブをクリックします。

  8. New… ボタンをクリックすると、Viewer State Code Generatorダイアログが開きます。

  9. Samples オプションで Static Handle を選択して Accept をクリックします。

  10. その新しいステートソースコードの中の HANDLE_TYPENAME に“handle_demo”に設定して Accept をクリックします。

  11. state handle demoノードを選択して、ビューア内でEnterキーを押します。

これでPythonハンドルデモがアクティブになり、原点にピボットガジェットが表示されているはずです。

ハンドルを実装する方法

このセクションでは、Pythonハンドルの実装に関する詳細について説明しています。 Pythonハンドルをゼロから実装するのはエラーが起こりがちで難易度が高いです。 ここでは、Pythonハンドルの作成にViewer Handle Code Generatorを使用することを想定します。 Viewer Handle Code Generatorには、様々なサンプルが用意されていて、それらのサンプルから選択することでPythonハンドルのスケルトンコードを生成することができます。

Pythonハンドルの作成は、Pythonクラスの実装で構成します。次のセクションでは、それに対応しているクラスメソッドの概要について説明しています。

Note

Houdiniには、viewerhandle.utilsというPythonモジュールが用意されています。 このモジュールには、ビューアハンドルのインストールをサポートしたり、独自のハンドルの実装に役立つドキュメント化された様々なユーティリティ関数/クラスが含まれています。 このモジュールは、$HH/python3.7libs/viewerhandleフォルダや$HH/python2.7libs/viewerhandleフォルダに配置されています。

特定の機能の実装に関する詳細は、以下のページを参照してください:

イニシャライザー

def __init__(self, **kwargs)

Pythonクラスの__init__メソッドは、Pythonハンドルクラスを初期化するのに必須です。 Houdiniでは、このメソッドがkwargs辞書を引数として受け取る必要があります。 このkwargs辞書には、事前に以下のキーエントリーが含まれています:

handle_name

登録時に設定されるビューアハンドルのタイプ名。

handle_label

登録時に設定されるPythonハンドルのラベル。

handle_instance_name

Pythonハンドルをhou.ViewerStateTemplate.bindHandle()またはhou.ViewerStateTemplate.bindHandleStatic()にバインドする時にPythonステートで指定するハンドルインスタンス名。

scene_viewer

Pythonハンドルが実行されているシーンビューアを表現したhou.SceneViewerのインスタンス。

handle_context

アクティブハンドルに関する様々なコンテキスト情報にアクセス可能なコンテキストオブジェクト

handle_gadgets

hou.ViewerHandleTemplate.bindGadget()で定義されているgadgetオブジェクトの辞書。 ガジェットの名前を辞書キーとして使用することで、そのガジェットオブジェクトを照会することができます。

handle_parms

Pythonハンドルのパタメータ値と設定値を含んだ辞書。 この辞書には、hou.ViewerHandleTemplate.bindParametershou.ViewerHandleTemplate.bindSettingsで与えられた情報から収集されます。 パラメータ名または設定名を使用することで、その辞書の値を照会することができます。

Note

kwargsの内容はアトリビュートとして__init__内のクラスに格納することができます。 これによって、kwargsを照会することなく、コード内で直接これらのエントリーにアクセスすることができます。

def __init__(self, **kwargs)
    self.__dict__.update(kwargs)
    ...

def onActivate(self, kwargs):
    self.log("Handle parameters", self.handle_parms)

イベントハンドラー

Pythonハンドルイベントに反応できるようにいくつかのハンドルがサポートされています。 これらのイベントハンドラーはどれも、そのイベント関連の特定の値を含んだ単一辞書引数(kwargs)を使ってコールされます。

すべてのハンドラーに共通するkwargsエントリーを以下に載せています:

handle_context

アクティブハンドルに関する様々な情報にアクセス可能なコンテキストオブジェクト。 このキャッシュは、クラスアトリビュートとしても利用可能です。

handle_parms

Pythonハンドルにバインドされたパラメータと設定を表現した名前を含んだ書き込み可能な辞書。

以下のテーブルでは、すべてのイベントハンドラーを(あれば)特定のkwargsと併せてカテゴリ別に載せています。

UI

すべてのUIイベントハンドラーに共通するkwargsエントリーを以下に載せています:

ui_event

イベントに関する情報(例えばマウスイベントの場合、現行マウス座標やボタンがクリックされたかどうか)を持ったhou.ViewerEventインスタンスを含んでいます。

メソッド名

説明

onMouseEvent

Pythonハンドルガジェットがロケートまたはピックされてドラッグされた時にコールされます。 マウスのハンドリングを参照してください。

onMouseIndirectEvent

ビューポート内の任意の場所からでマウスがドラッグされた時にコールされます。 間接的なマウスの制御を参照してください。

onMouseWheelEvent

マウススクロールが発生した時にコールされます。 hou.UIEventDevice.mouseWheel()は、スクロール方向に応じて-1または1を返します。 マウスホイールのハンドリングを参照してください。

onKeyEvent

キーが押された時にコールされます。 詳細は、キーボードデバイスの読み込みを参照してください。

onKeyTransitEvent

キートランジションイベントが発生した時にコールされます。 詳細は、キーボードデバイスの読み込みを参照してください。

onMenuAction

ユーザがコンテキストメニュー項目を選択した時にコールされます。 コンテキストメニューのハンドリングに関しては、Pythonステートのコンテキストメニューを参照してください。

menu_item: 選択されたメニュー項目名を含んでいます。

Note

このハンドラーは、kwargs内のui_eventエントリーを取得しません。

onMenuPreOpen

コンテキストメニューが開かれる前にコールされます。 コンテキストメニューの更新を参照してください。

menu_states: ルートメニューまたはサブメニューの状態値。

menu_item_states: 開こうとするメニューのすべてのメニュー項目の状態値。

onParmChangeEvent

ハンドルのパラメータまたは設定が変更された時にコールされます。 ハンドルパラメータのハンドリングを参照してください。

parm_name: 変更されたパラメータ名または設定名。

parm_value: 新しいパラメータ値または設定値。複数コンポーネントのパラメータに関しては、parm_valueにはリストを設定します。

描画

メソッド名

説明

以下のメソッドは、描画イベントが生成された時にコールされます。 ハンドルの描画を参照してください。

onDraw

HoudiniがPythonハンドルの再描画を必要とした時にコールされます。このメソッドは以下の時にコールされます:

  • ユーザがマウス移動やマウスクリックなどのインタラクティブなイベントを引き起こした時。

  • Houdiniが現行ビューポートの再描画を強制された時。

onDrawSetup

onDrawの前にコールされます。典型的には、ハンドルジオメトリコンポーネントを描画する前にそれをスケールするのに使用します。

ライフサイクル

メソッド名

説明

onActivate

ハンドルがアクティブに設定された時にコールされます。これは以下の時に起こります:

  • ハンドルが作成された時。

  • ビューポートにフォーカスされた時。

  • カメラツールを使用した後。

onDeactivate

ハンドルが非アクティブに設定された時にコールされます。これは以下の時に起こります:

  • 異なるステートが選択された時、または、ユーザがHoudiniを終了した時。

  • ユーザがカメラツールまたはVolatileセレクターの使用を開始した時。

  • ビューポートからフォーカスが外れた時。

Undo対応

Houdiniは、ハンドルやノードパラメータが変更された時に自動的にUndoスタック上にアイテムを生成します。 とはいえ、独自にUndo対応が必要な場合、hou.undosモジュールとhou.SceneViewerのUndoメソッドを使用することで、 Undo可能なオペレーションをUndoスタック上に1個のエントリーにまとめることができます。 詳細は、ステートのUndo対応を参照してください。

ユーティリティ

Houdiniには、Pythonハンドルの実装に役立つ様々なユーティリティクラスが用意されています。 例えば、ColorOptionshou.SceneViewer.hudInfoといったユーティリティは、Houdiniの標準と整合性が合うように設計されており、 これらのユーティリティティを使用することを強く推奨します。 これらのユーティリティの使い方のサンプルは、Pythonハンドルのデモを参照してください。

  • viewerhandle.utils.TransformAid:

    TransformAidは、Pythonハンドルのトランスフォーム操作を制御します。 updateTransformtoScreenといったメソッドは、ビューポートがワールド空間に設定された時にハンドルのオブジェクトトランスフォームを補完します。

  • viewerhandle.utils.DebugAid:

    Pythonハンドルのデバッグに役立つユーティリティクラス。

  • resourceutils.ColorOptions:

    Houdiniカラーオプションにアクセスできるユーティリティクラス。 詳細は、Gadget Drawablesを参照してください。

  • resourceutils.DisplayGroup:

    このクラスは、Drawablesをビューポート内にグループとして表示することができます。 例えば、HoudiniトランスフォームモードキーのYと同様に循環形式でハンドルガジェットのグループの表示を切り替えたい場合にこれが役立ちます。

  • resourceutils.CursorLabel:

    カーソル周辺に何かしらのテキストラベルを表示したい時にこのクラスを使用します。 これはPythonハンドルで非常に役立ち、このクラスの使い方の詳細はmove_tool_demoのハンドルを参照してください。

  • resourceutils.DebugMenu:

    Pythonハンドルコンテキストメニューにデバッグメニューエントリーを作成する際にHoudiniで使用されます。 実際にViewer Handle Code Generatorは、これを使用してハンドルのコンテキストメニューを作成しています。

サンプル

Viewer Handle Code Generatorのサンプルだけでなく、サンプルシーンを使用してPythonハンドルを実験することができます。 以下のシーンは、viewer_handle_demoパッケージと一緒に$HFS/package/viewer_handle_demo/scenes下に配布されています。 以下のシーンを使用する前に、Viewer Handle BrowserFile|Load Examples メニューをクリックしてそのパッケージをHoudiniに読み込んでください。

Demo Viewer Handle シェルフツールまたはメインメニューバー内の File|Open… メニューからサンプルシーンを読み込むことができます。

viewer_handle_intro.hipシーンでは、Pythonハンドルの実装について紹介されており、そのシーンからPythonハンドルの基本機能を学ぶことができます。

move_tool_demo.hipシーンでは、ジオメトリを移動/回転/スケールさせるPythonハンドルのもっと完璧で複雑な実装のサンプルが用意されています。

このPythonハンドルのサンプルは、 Viewer Handle Browser で利用可能なので、そこで調べてみてください。

ビューアハンドルの使い方

Pythonハンドルとビルトインハンドルの制御で使用するワークフローの違いはほとんどありません。 例えば、ビルトインハンドルだろうとPythonハンドルだろうとどちらを使用しても以下のUI機能をユーザは使用できるはずです:

  • Pythonハンドルを表示するボタン。

  • パラメータと設定にアクセスすることができるHandle Parameterダイアログ。

  • Pythonハンドルを持続型として有効化することができるPersistent Handle Editor。

  • Draggersのスナップオプションを設定するダイアログ。

  • Pythonハンドルのスケールを調整するカメラズーム

  • キーフレームによるPythonハンドルパラメータのアニメーション。

Note

ただし、Handle Preferenceダイアログは、Houdiniビルトインハンドルの設定を制御するように設計されているので、Pythonハンドル向けに意図されていません。 これらの設定の一部は、良いタイミングで将来Pythonハンドル向けに露出される予定です。

ビューアハンドルを検査する方法

Houdiniは、登録済みのすべてのPythonハンドルをViewer Handle Browserウィンドウで表示することができます。 このブラウザはViewer State Browserと同様で、ほぼ同じ機能が用意されています:

  • 登録済みのハンドルをブラウズするツリー。

  • メッセージをログに出すコンソール。

  • アクティブハンドルのクラスアトリビュートをダンプする様々なオペレーション。

  • Viewer Handle Code Generator。

  • Pythonハンドルの編集と読み込みに対応。

デバッグに関するTips

Pythonハンドルで利用可能なデバッグ機能は、Pythonステートで利用可能なデバッグ機能とほぼ同じです。 これらの機能について学習したいのであれば、Pythonステートのデバッグに関するTipsの章を参照してください。

DebugAid

ユーティリティクラスのviewerhandle.utils.DebugAidには、Pythonハンドルのデバッグサポートが用意されています。 このユーティリティは、Pythonハンドルブラウザでメッセージをログに出すのに便利ですが、さらにPythonハンドルブラウザで現在利用可能なすべてのログ機能をメソッドとして用意しています:

  • アクティブなPythonハンドルを検査します。

  • コンソールにマーカーを追加します。

  • デバッグトレースを有効化します。

  • ロギングコンソールを有効化します。

  • 実行中のPythonハンドルをリロードします。

import traceback
from viewerhandle.utils import DebugAid

class Handle(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
        self.dbg = DebugAid(self)

    def onEnter(self, kwargs):
        # ハンドルを検査します。
        self.dbg.marker()
        self.dbg.inspect()

        # トレースを開始します。
        self.dbg.trace()

    def onMouseEvent(self, kwargs):
        # マウス位置をログに出します。
        ui_event = kwargs["ui_event"]
        device = ui_event.device()

        self.dbg.marker()
        self.dbg.log("Mouse position x=", device.mouseX(), "y=", device.mouseY())

        # 現在のPythonコールスタックをログに出します。
        self.dbg.log(''.join(traceback.format_stack()))

ハンドルをリロードする方法

HoudiniからPythonハンドルモジュールをリロードできれば、Pythonハンドルの開発サイクルが向上します。 Pythonハンドルをリロードする方法がいくつか用意されています:

  • ソースコードがHoudiniのViewer Handle Editorで開かれていれば、Acceptボタンをクリックします。

  • Viewer Handle BrowserペインのFileメニューまたはブラウザツリー内からReloadコンテキストメニューを選択します。

  • hou.ui.reloadViewerHandle()

  • viewerhandle.utils.DebugAid.reload

  • ハンドルがHDAに埋め込まれている場合は、Python Handleエディタからリロードします。

Note

Pythonハンドルをリロードすると、そのハンドルのインスタンスが使用中であれば、実行中のPythonステートが自動的に抜けます。

デバッグコンテキストメニュー

Pythonハンドルにデバッグ機能を追加する別の方法は、デバッグコンテキストメニューを使用することです。 Viewer Handle Code Generatorには、以下のViewer Handle Browserデバッグ機能にアクセス可能なデバッグメニューを生成するオプションが備わっています:

  • Logging

    コンソールのロギングを有効または無効にします。 有効にすると、self.logまたはDebugAidユーティリティによってログに出されたメッセージがコンソールに送信されます。

  • Clear

    ロギングコンソールをクリアします。

  • Inspect

    大元のPythonハンドルの内容をコンソールにダンプします。

  • Trace

    デバッグトレースを有効または無効にします。有効にすると、アクティブなPythonハンドルのトレースのログがコンソールに出されます。

  • Marker

    メッセージを区別できるようにマーカーをコンソールに追加します。

生成されるコードには、サブメニューとしてデバッグメニューが追加されます。 このデバッグメニューを平坦なメニューとして追加したいのであれば、以下のようにcreateViewerHandleTemplate内のコードを修正します:

menu = hou.ViewerStateMenu(handle_type + "_menu", handle_label)
...

# これを ...
menu.addMenu(hu.createDebugMenu(handle_type))

# ... このコードに置換します。
hu.addDebugEntriesToMenu(handle_type, menu)

...

HOM API

Pythonビューアハンドル

Pythonスクリプト

はじめよう

次のステップ

リファレンス

  • hou

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

導師レベル

Python Viewerステート

Pythonビューアハンドル

プラグインタイプ