Q100108: Katana 노드에 사용자 정의 컨텍스트 메뉴 항목을 추가하는 방법

요약

이 문서에서는 Katana 내 노드의 상황에 맞는 메뉴(마우스 오른쪽 버튼 클릭 메뉴)에 사용자 정의 메뉴 항목을 추가하는 방법을 설명합니다.

더 많은 정보

Katana 제공하는 NodeActionDelegate 모듈을 사용하면 노드의 컨텍스트 메뉴에 사용자 정의 메뉴 항목을 추가할 수 있습니다.
아래는 특정 노드의 컨텍스트 메뉴에 메뉴 동작을 등록하는 방법을 보여주는 예제입니다. 이 예제에서는 CameraCreate 노드의 컨텍스트 메뉴에 두 개의 사용자 지정 메뉴 명령을 추가합니다.
Katana 8.0
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(QtGui.QAction):

        def __init__(self, parent, node):
            QtGui.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(QtGui.QAction):

        def __init__(self, parent, node):
            QtGui.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())
Katana 7.5 이상
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())

추가 읽기

모든 유형의 노드의 상황에 맞는 메뉴에 동일한 메뉴 명령을 추가하려면 위 예제의 마지막 줄을 다음과 같이 바꾸면 됩니다.
myNodeActionDelegate = MyNodeActionDelegate()
for nodeTypeName in NodegraphAPI.GetNodeTypes():
    RegisterActionDelegate(nodeTypeName, myNodeActionDelegate)


다음 예에서 볼 수 있듯이 특정 노드 유형에 대해 동일한 노드 작업 대리자를 등록할 수도 있습니다.

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

첨부 파일

우리는 문제로 불편을 끼쳐 드려 죄송합니다

이유를 알려주세요