[PYTHON] Skript-Kontextmenü im Netzwerkeditor anzeigen

Dieser Artikel ist der Artikel zum 25. Tag von Houdini Adventskalender 2019. Letzter Tag! !!

zunaechst

Zeigen Sie Ihr eigenes Menü mit Umschalt + Tab (änderbar) im Netzwerkeditor an. houdini_network_editor.gif Charakterbilder sind nur ein Hobby. Sie müssen es nicht löschen.

Houdini selbst hat viele HDAs, Regale, Voreinstellungen und nützliche Tools, so dass ich solche Änderungen nicht wirklich vornehmen muss, aber für diejenigen, die Änderungen vornehmen möchten, ist Houdini eine unterhaltsame und unordentliche Software. Ich werde.

Wenn Sie die Punkte erwähnen möchten, für die Sie sich gut fühlen

Nun, die im Regal registrierten Werkzeuge können auch im normalen TAB-Menü angezeigt werden ... Der Nachteil ist, dass es schwierig zu erstellen ist. Wenn der Code einen Tippfehler enthält, gibt Houdini weiterhin endlos Fehlermeldungen aus.

Wenn Sie denken, dass es Spaß macht, tun Sie es bitte. Ich werde die Erstellungsmethode unten schreiben. Der von mir verwendete Houdini ist 18.0.287, eine Windows-Umgebung.

Die offizielle Dokumentation ist hier. Das eigentliche Skript für den funktionierenden Netzwerkeditor befindet sich in (Houdini-Installationsziel) / houdini / python2.7libs / nodegraph.py. Wenn Sie also eines haben, wird empfohlen, darauf zu verweisen.

Verknüpfen Sie wichtige Ereignisse mit dem Netzwerkeditor

Fügen Sie zunächst eine Skriptdatei hinzu. Für das Dokument $HOUDINI_USER_PREF_DIR/python2.7libs/nodegraphhooks.py Beispiel: C: \ Users \ (Benutzername) \ Documents \ houdini18.0 \ python2.7libs \ nodegraphhooks.py Ist geschrieben, um hinzuzufügen. Persönlich habe ich ein anderes Verzeichnis erstellt, um die Verwaltung des Skripts zu vereinfachen, und den Pfad in pythonrc.py angegeben.

pythonrc.py


import sys
sys.path.insert(0,'Skriptspeicherpfad')

Ich denke, es ist okay, wenn Sie eines von beiden mögen. Der Operationsprüfcode von nodegraphhooks.py lautet wie folgt.

nodegraphhooks.py


#coding:utf-8 
from canvaseventtypes import *

def createEventHandler(uievent, pending_actions):
    """Hook-Ereignisse aus dem Netzwerkeditor"""
    if isinstance(uievent, KeyboardEvent):
        if uievent.eventtype == 'keyhit' and uievent.key=='Shift+Tab':
            uievent.editor.flashMessage(None, 'nodegraphhook!!', 2.0)
    return None, False

Jetzt zeigt Umschalt + Tab die Nachricht im Netzwerkeditor an. nodegraphhook.gif Suchen Sie einfach die nicht verwendeten Hotkeys und schreiben Sie den entsprechenden Code, um den Editor zu erweitern. Wenn Sie häufig die Skriptverarbeitung verwendet haben, kann es hilfreich sein, diese hier hinzuzufügen.

Menü anzeigen

Hier wird hou.qt.Menu verwendet, um das Kontextmenü anzuzeigen. Um einen Prozess zu schreiben, der eine Weile andauert, scheint es eine gute Idee zu sein, eine Klasse zu erstellen, die nodegraphbase.EventHandler erbt, und sie mit einer Funktion namens handleEvent zu verarbeiten.

Das ursprüngliche QMenu von hou.qt.Menu wird häufig mit einer Funktion namens exec_ angezeigt. Wenn Sie diese Funktion jedoch verwenden, wird möglicherweise eine Warnung angezeigt. Zeigen Sie sie daher mit show an.

Hinzufügen der Datei custom_tabmenu_handler.py. Platzieren Sie es an einem Ort, der sich in Ihrem Python-Pfad befindet. Wenn Sie sich nicht sicher sind, können Sie dasselbe Verzeichnis wie nodegraphhooks.py verwenden.

nodegraphhooks.py


#coding:utf-8 
from canvaseventtypes import *
from custom_tabmenu_handler import CustomTabMenuHandler

def createEventHandler(uievent, pending_actions):
    """Hook-Ereignisse aus dem Netzwerkeditor"""
    if isinstance(uievent, KeyboardEvent):
        if uievent.eventtype == 'keyhit' and uievent.key=='Shift+Tab':
            #Gibt einen Ereignishandler für ein benutzerdefiniertes Registerkartenmenü zurück
            return CustomTabMenuHandler(uievent), True
    
    return None, False

custom_tabmenu_handler.py


#coding:utf-8 
import hou
import nodegraphbase as base
from hutil.Qt import QtGui
from hutil.Qt import QtWidgets

class CustomTabMenuHandler(base.EventHandler):
    """ Shift+Benutzerdefinierte Tab-Menüverarbeitung, die von Tab geöffnet wird"""
    def __init__(self, uievent):
        """Initialisierungsprozess"""
        base.EventHandler.__init__(self, uievent)
        #Menü erstellen
        self.menu = hou.qt.Menu()
        #Aktionsregistrierung
        self.addAction(self.menu, 'test', self.testFunc1)
        self.addAction(self.menu, 'test2', self.testFunc2)
        self.menu.addSeparator()
        self.addAction(self.menu, 'test3', self.testFunc3)
        #Anzeige des Menüs
        cursor_pos = QtGui.QCursor.pos()
        self.menu.move(cursor_pos)
        self.menu.show()

    def handleEvent(self, uievent, pending_actions):
        """Ereignisverarbeitung"""
        #Gibt einen Ereignishandler zurück, um die Ereignisverarbeitung fortzusetzen
        if self.menu.isVisible():
            return self
        #Die Ereignisverarbeitung endet, wenn das Menü verschwindet
        return None

    def addAction(self, menu, name, func):
        """Hilfsfunktion für die Aktionsregistrierung"""
        act = QtWidgets.QAction(name, menu)
        act.triggered.connect(func)
        menu.addAction(act)

    def testFunc1(self):
        """Nachricht im Netzwerkeditor anzeigen"""
        #Das in der Initialisierung übergebene Ereignis ist self.start_Kann mit uievent erhalten werden
        self.start_uievent.editor.flashMessage(None, 'test1', 2.0)

    def testFunc2(self):
        self.start_uievent.editor.flashMessage(None, 'test2', 2.0)

    def testFunc3(self):
        self.start_uievent.editor.flashMessage(None, 'test3', 2.0)

Um eine Aktion hinzuzufügen, fügen Sie eine Mitgliedsfunktion hinzu und ordnen Sie sie addAction zu. nodegraphhook3.gif

Bild mit Menü anzeigen

Ich habe gerade ein Widget erstellt, das nur das Bild anzeigt, und es mit hou.qt.Menu angezeigt. Ich benutze so ein Widget.

class PopupImage(QtWidgets.QWidget):
    """Existenz, die nur Bilder für Lebendigkeit anzeigt"""

    image = None

    def __init__(self, parent=None):
        super(PopupImage, self).__init__(parent)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint | QtCore.Qt.NoDropShadowWindowHint)
        self.setAttribute(QtCore.Qt.WA_NoSystemBackground)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
        
        if PopupImage.image is None:
            #Bitte stellen Sie den Bildpfad auf ein gutes Gefühl ein.
            imagepath = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', 'images', 'popup_image.png'))
            PopupImage.image = QtGui.QImage()
            PopupImage.image.load(imagepath)

    def paintEvent(self, e):
        #Zeichenereignis
        painter = QtGui.QPainter(self)
        painter.drawImage(self.rect(), PopupImage.image, PopupImage.image.rect())

Ein etwas praktischeres Beispiel

Der Code ist auf GitHub aufgeführt. Weitere Informationen finden Sie hier. https://github.com/towazumi/HouNetworkEditorExtendSample

Fügen Sie einen Nullknoten mit dem Namen OUT hinzu, um ihn schwarz zu machen

Die ursprüngliche Geschichte ist Python beginnend mit Houdini. Ursprünglich haben wir den Namen und die Farbe des ausgewählten Knotens geändert, aber hier werden wir direkt Nullknoten hinzufügen. Beachten Sie, dass sich der Netzwerkeditor auf SOP-Ebene befindet und ob er im Menü angezeigt wird.

nodegraphhook5.gif

Fügen Sie dem ausgewählten Knoten einen Python-Textrahmen und eine Ausführungsschaltfläche hinzu

Die ursprüngliche Geschichte ist __2: Methode unter Verwendung des Strings von Read Wavefront.mtl-Datei per Rückruf. Nehmen Sie diese Einstellung in Python vor.

nodegraphhook6.gif

Speichern / Wiederherstellen des ausgewählten Knotens als Python-Code

Die ursprüngliche Geschichte ist [Houdini-Snippet] Knoten als Python-Code speichern. Ich mache es möglich, diese Informationen zu verwenden, wenn dem von asCode generierten Skript eine Verarbeitung hinzugefügt und wiederhergestellt wird.

nodegraphhook7.gif

Zusammenfassung

Es mag eine gefährliche Zeit sein, aus dem Weg zu gehen, da auch Python3 auftaucht, aber es macht Spaß, es nach Ihren Wünschen zu ändern. Ich hoffe, dass dieser Artikel für diejenigen nützlich ist, die auch interessiert sind. Bis zum Ende Danke fürs Lesen.

Recommended Posts

Skript-Kontextmenü im Netzwerkeditor anzeigen
Holen Sie sich den Skriptpfad in Python
Debuggen Sie das Skript mit Sakura Editor
Django ~ Lass es uns im Browser anzeigen ~
Zeigen Sie Python 3 im Browser mit MAMP an
Führen Sie den Python-Interpreter im Skript aus
Ich möchte den Fortschritt in Python anzeigen!
Greifen Sie über REPL auf die im Skript definierten Variablen zu
Zeigen Sie das 邊 an
Lesen Sie die CSV-Datei und zeigen Sie sie im Browser an
Zeigen Sie die Zeilennummer des VIM-Editors an (mit Standardeinstellungen).
Python Open CV hat versucht, das Bild im Text anzuzeigen.