On this page |
概要 ¶
Python Panelエディタウィンドウでは、Python Panelペインに表示できるPySide2またはPyQt5インターフェースを作成、編集、削除することができます。 また、このエディタにより、HoudiniペインタブメニューのエントリーだけでなくPython Panelのインターフェースメニューのエントリも管理することができます。
要件 ¶
PySide2インターフェースを構築する場合の要件はありません。 Houdiniは、PySide2モジュールを搭載しており、追加設定は不要です。
PyQt5を使ったインターフェースを構築する予定の場合は、システムにPyQt5モジュールをインストールする必要があります。 Houdiniは、最善を尽くしてそのPyQt5モジュールを自動的に検索します。 それでもPyQt5モジュールが見つからなかった場合、そのインストールした場所をPythonサーチパスに追加してください。
例えば、PyQt5が/path/to/site-packages/PyQt5
にインストールされた場合、Houdiniを開始する前に、お使いの環境でPYTHONPATH=/path/to/site-packages
を設定してください。もしくは、/path/to/site-packages
をPythonコードで下記のようにサーチパスに追加してください:
# 検索パスを修正します。 import sys sys.path.append("/path/to/site-packages") # 今では、PyQt5をインポートすることができます。 from PyQt5 import QtWidgets
Houdini 17.0の変更点 ¶
-
Houdini 17.0は、PySide2またはPyQt5でビルドされたPython Panelのみに対応しています。PySideとPyQt4はもはや対応していません。
-
新しいPaneTabTypeMenu.xmlファイルを使用することで、ペインタブタイプメニュー内のあなたのインターフェースの配置場所を指定することができます。詳細は、ペインタブタイプメニューセクションを参照してください。
インターフェースの作成/編集 ¶
-
Windowsメニュー、またはPython PanelペインタブのツールバーボタンからPython Panelエディタを開きます。
-
新しいインターフェースの定義を作成するには、 Interfaces タブを選び New Interface ボタンをクリックします。 インターフェースがエディタにロードされ、メニューリストに追加されます。
-
既存のインターフェースを編集するには、 Interfaces タブのドロップダウンメニューからインターフェースを選びます。
-
インターフェースエディタで、名前、ラベル、アイコンを編集します。
-
インターフェースを構築するスクリプトテキスト領域でPythonコードを書きます。 インターフェースのルートウィジェットを返す
onCreateInterface()
関数を定義する必要があります。 返されたルートウィジェットはPython Panelに組み込まれます。 -
AcceptまたはApplyボタンを押して変更を保存します。
インターフェースメニューの編集 ¶
-
Windowsメニュー、またはPython PanelペインタブのツールバーボタンからPython Panelエディタを開きます。
-
エディタの Edit Menu タブを選びます。
-
左側のリストから使用できるインターフェース定義を右側のメニューリストへドラッグ&ドロップします。 メニューリストのエントリもドラッグ&ドロップを使って再オーダーできます。 もしくは、ボタンを使って、エントリをメニューに追加したり、ボタンでエントリを削除できます。 複数のエントリは同時に移動できます。
Note
ペインタブタイプメニューを編集する時、PaneTabTypeMenu.xmlで既に指定されたどのインターフェースもPython Panelメニュー定義から無視されることに注意してください。詳細は、ペインタブタイプメニューセクションを参照してください。
インターフェースの削除 ¶
-
Windowsメニュー、またはPython PanelペインタブのツールバーボタンからPython Panelエディタを開きます。
-
ダイアログで、リストから削除するインターフェースを選択します。選択中に⌃ Ctrlキーを押したままにすると複数のインターフェースを選択できます。
-
Delete ボタンを押して、選択したエントリを削除します。エントリが削除される前に確認ダイアログが表示されます。
Warning
インターフェース定義もディスクから削除されるため、削除プロセスの取り消しはできません。 定義を削除せずにインターフェースメニューからエントリを削除するには、上記の「インターフェースメニューを編集する」のセクションを参照してください。
インターフェースタブ ¶
インターフェースタブにより、Pythonインターフェースの作成や編集を行ないます。 上部のドロップダウンメニューにより、編集するインターフェースを選択できます。 NewInterface により新しいインターフェースが作成され、エディタへロードされます。 Delete Interface により削除できるすべてのインターフェースを一覧にしたダイアログが表示されます。
Save To
インターフェース定義が保存されるファイルパスです。 変更を正確に保存するために、ファイルは、Houdiniにより書き込みができるようにする必要があります。 パスが書き込み可能でない場合は、インターフェースに変更を適用しようとするとエラーメッセージが表示されます。 ファイルパスは手動で入力できます。または、フィールドの右側にあるファイルブラウザにより選択できます。
Name
インターフェースの固有の名前です。 これは、ロードされたすべてのPythonインターフェースにわたって一意である必要があります。 つまり、最大でも1つのインターフェースが指定された固有の名前でロードされます。 名前は文字から始まる必要があり、文字、数字および/または下線を使用することができます。
Label
人間が判読できるインターフェースの名前です。 ラベルは、Python Panelペインタブおよびインターフェースメニューで使用されます。 複数のインターフェースは同じラベルを共有できます。
Icon
インターフェースに使用するアイコンの固有名、ファイルパスまたはURLです。
フィールドの右端にある選択ボタンをクリックしてファイルを選択します。
なお、デジタルアセットに含まれるファイルを選択できます(ファイル選択の左側にあるopdef:
をクリックします)。
絶対パスやURLを指定しない場合、Houdiniは、$HOUDINI_UI_ICON_PATH 環境変数のパスを使用してアイコンを探します。
SVGファイルやHoudiniがサポートしている画像フォーマット(PNGや.pic
)を使用できます。アイコン画像は四角形になります。
Houdiniには、多数のストックSVGアイコンが搭載されています。$HFS/houdini/help/icons/large
でこれらのアイコンのビットマップ画像を確認できます。
ストックアイコンを指定するには、dirname_filename
のフォームを使用します。ここで、
-
dirnameは
$HFS/houdini/help/icons/large
内のディレクトリ名で、OBJ
、SHELF
、MISC
などです。 -
filenameはアイコンのファイル名から拡張子を除いたものです。例えば、
OBJ_sticky
はStickyオブジェクトの標準アイコンを指定します。
Parameters Pane Hints
Show in Parameters Pane
このオプションにチェックを付けると、Parametersペイン内にインターフェースが表示されます。 このインターフェースは、通常のパラメータダイアログの場所を専有します。
For Operators
ノードオペレータタイプをカンマで区切ったリスト。 このインターフェースは、オペレータタイプがそのリスト内のどれかのタイプに合致したノードのParametersペイン内に表示されます。
オペレータタイプのパターンを指定することができ、ワイルドカードを使用すれば、複数のオペレータタイプに合致させることができます。
例:
-
Sop/null
は、Null SOPノードに合致します。 -
Sop/*
は、すべてのSOPノードに合致します。 -
Sop/*, Object/null
は、すべてのSOPノードとNull OBJノードに合致します。
ネームスペースとバージョンタグをオペレータタイプのパターンに指定することもできます。
例:
-
namespaceX::Sop/null::2.0
は、“namespaceX”ネームスペース内で定義されているバージョン2.0のカスタムNull SOPに合致します。
Note
Network Viewペインに埋め込まれたParametersダイアログもParameters Pane Hintsパラメータからの影響を受けます。
Script
Pythonインターフェースのスクリプト定義。
ここは、インターフェースを構築するためにPySide2やPyQt5のコードを書き込む場所です。
インターフェースがPython Panelにロードされると、スクリプトが実行され、onCreateInterface()
関数により返されたルートウィジェットがパネルに組み込まれます。
Python Panelsは、特定のイベントが発生した時に以下の関数を認識して実行します:
-
onCreateInterface()
→PySide2.QWidget or PyQt5.QWidget
Python PanelがQtインターフェースを作成した時に実行されます。 この関数は、インターフェースのルートQtウィジェットを返さなければなりません。
-
onDestroyInterface()
Python PanelがQtインターフェースを破棄しようとした時に実行されます。 これは、Python Panelペインタブを閉じたり、インターフェースを再読み込みした時に実行することができます。
-
onActivateInterface()
インターフェースがアクティブで可視になった時に実行されます。
-
onDeactivateInterface()
インターフェースが非アクティブで不可視になった時に実行されます。
-
onHipFileBeforeClear()
hipファイルのクリア処理が実施される前に実行されます。
-
onHipFileAfterClear()
hipファイルのクリア処理が実施された後に実行されます。
-
onHipFileBeforeLoad()
hipファイルの読み込み処理が実施される前に実行されます。
-
onHipFileAfterLoad()
hipファイルの読み込み処理が実施された後に実行されます。
-
onHipFileBeforeMerge()
hipファイルの結合処理が実施される前に実行されます。
-
onHipFileAfterMerge()
hipファイルの結合処理が実施された後に実行されます。
-
onHipFileBeforeSave()
hipファイルの保存処理が実施される前に実行されます。
-
onHipFileAfterSave()
hipファイルの保存処理が実施された後に実行されます。
-
onNodePathChanged(node)
Houdiniが現行ノードを変更した時に実行されます。 この関数フックは、Python PanelインターフェースをHoudiniノードネットワークの行き来に追従させたい時に役立ちます。
node
は現行ノードで、hou.OpNodeオブジェクトです。 現行ノードがない場合は、node
はNone
に設定されます。Python Panelインターフェースが最初に読み込まれると、この関数フックもコールされることに注意してください。
onCreateInterface()
関数のみがインターフェースで必須です。
他の関数は任意です。
Note
古いバージョンのHoudiniでは、createInterface()
関数が必須でした。
現在では、この関数は廃止され、onCreateInterface()
に置換されました。
Note
インターフェーススクリプトでは、kwargs辞書が利用可能です。この辞書には、以下のエントリーが含まれています:
-
paneTab - インターフェースを含んだペインタブ(hou.PaneTab)。 hou.PaneTabオブジェクトが後で無効になる可能性があるので、
kwargs["paneTab"]
の結果を持続変数に格納しないことを推奨します。例えば、他のペインタブに切り替えてからPython Panelに戻ると、古いペインタブオブジェクトが削除されて、新しいペインタブオブジェクトが作成されてしまいます。ペインタブにアクセスする必要がある時は、代わりに常にkwargs["paneTab"]
をコールしてください。
これは、スクリプト内でkwargsを使用した例です:
from PySide2 import QtWidgets def onCreateInterface(): panetab = kwargs["paneTab"] label = QtWidgets.QLabel() label.setText("Running in pane tab '%s'" % panetab.name()) return label
メニュータブ ¶
メニュータブにより、インターフェースのドロップダウンメニューのエントリを再オーダーしたり、エントリ間のセパレータを追加したりできます。 Python Panel内からインターフェースを選択する場合、メニューにあるエントリだけが表示されます。
メニュータブの左側には、現在Houdiniにロードされているすべてのインターフェースのリストがあります。 右側のリストは、Python Panelメニューの現在の状態を表示します。 エントリは、ドラッグ&ドロップを使用して、またはリスト間の矢印をクリックして、Menu Entriesリストに追加したり、そこから削除したりできます。
インターフェースの単一のコピーだけが指定された時間でメニュー内に存在できるため、Available Interfacesエントリは、いったんメニューに追加されると無効になります。 セパレータは無制限にMenu Entriesリストに追加できます。
Save To フィールドは、メニューが保存されるファイルを示します。ファイルは、Houdiniにより書き込みができるようにする必要があります。
ペインタブタイプメニュー ¶
メニューヒントの利用またはPython Panelメニュー定義の作成とは別に、メニューのXML定義ファイルであるPaneTabTypeMenu.xml
を使って、Python Panelインターフェースをペインタブタイプメニューに挿入することができます。
そのXML定義ファイルを使用するメリットがいくつかあります:
-
あなたのインターフェースをメニューの下部だけでなく、ペインタブタイプメニューのどこにでも挿入することができます。
-
あなたのインターフェースをサブメニュー内に配置することができます。
-
エクスプレッションフィルターを追加することで、特定の条件が満たされた時にのみインターフェースをメニュー内に表示させることができます。
XMLを使ってインターフェースをペインタブタイプメニューに挿入する:
-
$HFS/houdini/PaneTabTypeMenu.xml
をコピーします。 -
そのコピーをHoudiniユーザプリファレンスディレクトリ(LinuxとWindowsなら
$HOME/houdiniX.Y
、MacOSなら$HOME/Library/Preferences/houdini/X.Y
)にペーストします。 -
そのペーストしたファイルを開いて、新しく
<actionItem>
エレメントをそのXMLに挿入し、id
プロパティを“pythonpanel::<interface_name>”に設定します。例えば、Python Panelインターフェースの名前が“myInterface”と仮定すると、その新しいactionItemは以下のようになります
<actionItem id="pythonpanel::myInterface"> <label>Label for My Interface</label> </actionItem>
他の方法としては、メニューの再整理で説明されているinsertBefore
またはinsertAfter
のエレメントを使用することで、PaneTabTypeMenu.xmlファイルを完全コピーすることなく、インターフェースをメニューに挿入することができます。
Houdiniでメニューをカスタマイズする方法に関しては、メニューのカスタマイズを参照してください。
Python Panelファイル ¶
Python Panelメニューおよびインターフェース定義は、ディスクの.pypanel
ファイルに保存されます。
Houdiniが起動すると、デフォルトで、$HFS/houdini/python_panels
内の.pypanel
ファイルを探し、その後、$HOUDINI_USER_PREF_DIR/python_panels
内の.pypanel
ファイルを探して、これらのファイルに保存された定義をロードします。
$HOUDINI_PATH
が設定されている場合は、$HOUDINI_PATH
に表示されている各パスのpython_panels
サブディレクトリでファイルを探します。
$HOUDINI_PYTHON_PANEL_PATH
を設定すると、サーチパスを上書きできます。
Note
Houdiniは、$HOUDINI_PYTHON_PANEL_PATH
により指定されたディレクトリの順番で、続いてファイル名のアルファベット順で.pypanel
ファイルをロードします。
同じ固有名を持つ複数のPython Panelインターフェースがディスクで見つかった場合、Houdiniは最後にロードしたインターフェース定義を使用します。
同様に、最後にロードしたインターフェースメニューを使用します。
サンプル ¶
サンプルの名前 | |
---|---|
Linked Parameters | Load |
この例は、PySide2パラメータウィジェット(つまりテキストフィールドとスライダ)とHoudiniノードパラメータがお互いどのようにリンクしているかを検証します。 |
|
Drag and Drop | Load |
この例は、Houdiniからのドラッグ&ドロップイベントに対応する方法について検証します。 |
|
Custom Graphics Scene | Load |
この例は、Python PanelでカスタムGraphicsSceneサブクラスを使用してOpenGLコールする方法について検証します。 |
|
Qt Events | Load |
この例は、Python Panelでウィジェットイベンドをハンドルする方法について検証します。 |
|
Qt Designer | Load |
この例は、 Qt Designer により作成されたインターフェースをロードする方法について検証します。 |
|
Viewport Color Editor | Load |
この例は、ビューポートカラーを編集するためにPySide2インターフェースを提供します。 |
See also |