Q100108: 独自のカスタム タブを作成して Katana のユーザー インターフェイスを変更する方法

フォローする

まとめ

この記事では、 Katana内のノードのコンテキスト メニュー (右クリック メニュー) にカスタム メニュー項目を追加する方法について説明します。

詳しくは

Katanaが提供するNodeActionDelegateモジュールを使用して、カスタム メニュー項目をノードのコンテキスト メニューに追加できます。
以下は、ノードを選択および選択解除するために、特定のノードのコンテキスト メニューのメニュー アクションを登録する方法を示す例です。

from Katana import UI4, NodegraphAPI
from UI4.FormMaster.NodeActionDelegate import (BaseNodeActionDelegate, RegisterActionDelegate)
from UI4.Manifest import QtCore, QtGui, QtWidgets


class MyNodeActionDelegate(BaseNodeActionDelegate.BaseNodeActionDelegate):
    class _SelectNodeAction(QtWidgets.QAction):

        def __init__(self, parent, node):
            QtWidgets.QAction.__init__(self, 'Select "%s"' % node.getName(), parent)

            self.__node = node
            if node:
                self.triggered.connect(self.__triggered)
            self.setEnabled(self.__node is not None
                            and not self.__node.isLocked(True))

        def __triggered(self, checked):
            NodegraphAPI.SetNodeSelected(self.__node, True)

    class _DeselectNodeAction(QtWidgets.QAction):

        def __init__(self, parent, node):
            QtWidgets.QAction.__init__(self, 'Deselect "%s"' % node.getName(), parent)

            self.__node = node
            if node:
                self.triggered.connect(self.__triggered)
            self.setEnabled(self.__node is not None
                            and not self.__node.isLocked(True))

        def __triggered(self, checked):
            NodegraphAPI.SetNodeSelected(self.__node, False)

    def addToContextMenu(self, menu, node):
        menu.addAction(self._SelectNodeAction(menu, node))
        menu.addAction(self._DeselectNodeAction(menu, node))
    
    def addToWrenchMenu(self, menu, node, hints=None):
        pass


RegisterActionDelegate("CameraCreate", MyNodeActionDelegate())

これにより、「CameraCreate」行ヘッダーの下の CameraCreate ノードのコンテキスト メニューに 2 つのカスタム メニュー コマンドが追加されます。
すべてのタイプのノードのコンテキスト メニューに同じメニュー コマンドを追加したい場合は、次のようなものを使用できます。
myNodeActionDelegate = MyNodeActionDelegate()
for nodeTypeName in NodegraphAPI.GetNodeTypes():
    RegisterActionDelegate(nodeTypeName, myNodeActionDelegate)

次の例に示すように、特定のノード タイプに対して同じノード アクション デリゲートを登録することもできます。

myNodeActionDelegate = MyNodeActionDelegate()
for nodeTypeName in ['AttributeSet', 'CameraCreate', 'OpScript']:
    RegisterActionDelegate(nodeTypeName, myNodeActionDelegate)

私たちはそれを聞いて申し訳ございません

理由をお聞かせください