メインコンテンツまでスキップ

PyPanel でHDAのUIを作る

Image from Gyazo

Panel を作るときは、まず Windows > Python PanelEditor を開く。

Image from Gyazo

そして、「New Interface」を選んで枠を作成します。 作成したファイルは、 proj/python_panels 下に XXXX.pypanel という拡張子で保存される。

Image from Gyazo

追加したあと、使えるようにするには ToolBarMenu のタブに移動して 作成したパネルを Toolbar Menu Entries に移動します。

Image from Gyazo

移動すると、Tab の Misc > Python Panel から表示するビューを開き

Image from Gyazo

一覧から、作成したパネルを選ぶと表示できます。

Image from Gyazo

ただ、それだと HDA の UI にならないので、パネルの Parameters Pane Hints に そのパネルを表示したい HDA を入れます。

名前は、 Namespace::Sop/###### のように入力します。
サンプルのように、名前やバージョンが入っている場合は、途中にコンテキスト名を入れる必要があるので
それだけ注意です。
アスタリスクを入れると、ワイルドカード扱いになるので すべてのバージョンだったりすべての SOP ノード
のように合致する HDA に対してパネルを適応できます。

from PySide6 import QtWidgets, QtGui, QtCore
import sys, os

class IconGridView(QtWidgets.QWidget):
def __init__(self, parent=None):
super(IconGridView, self).__init__(parent)

layout = QtWidgets.QVBoxLayout(self)

# QListWidgetを用意
self.listWidget = QtWidgets.QListWidget()
layout.addWidget(self.listWidget)


for name in ["A","B","C"]:
item = QtWidgets.QListWidgetItem(name)
self.listWidget.addItem(item)

self.listWidget.clicked.connect(self.clicked)

def clicked(self,index):
value = index.data()
panel = hou.ui.paneTabOfType(hou.paneTabType.Parm)
if panel:
node = panel.currentNode()
node.parm('sample').set(value)



def onCreateInterface():
widget = IconGridView()
return widget

パネルの実装は PySide で実装します。

onCreateInterface() の return で PySide の Widget を返すようにします。
それ以外は、基本的には PySide の UI を作るのと同じ感じで UI を作成できます。

現在表示されている HDA のノードを取得する場合は、

panel = hou.ui.paneTabOfType(hou.paneTabType.Parm)
if panel:
node = panel.currentNode()

パネルから、currentNode を取得すれば OK です。

Image from Gyazo

結果、このように PySide のリストを HDA のパラメーター編集 UI として表示できました。

Image from Gyazo

作成したパネルは、このアイコンを表示すると非表示にできます。