[PYTHON] Afficher le menu contextuel du script dans l'éditeur de réseau

Cet article est l'article du 25ème jour du Calendrier de l'Avent Houdini 2019. Dernier jour! !!

en premier

Affichez votre propre menu avec Shift + Tab (modifiable) sur l'éditeur de réseau. houdini_network_editor.gif Les images de personnages ne sont qu'un passe-temps. Vous n'êtes pas obligé de l'éteindre.

Houdini lui-même a beaucoup de HDA, d'étagères, de préréglages et d'outils utiles, donc je n'ai pas vraiment besoin de faire de telles modifications, mais pour ceux qui aiment faire des modifications, Houdini est un logiciel amusant et compliqué. Je vais.

Si vous souhaitez mentionner les points que vous souhaitez faire valoir

Eh bien, les outils enregistrés sur l'étagère peuvent également être affichés dans le menu TAB normal ... L'inconvénient est qu'il est difficile à créer. S'il y a une faute de frappe dans le code, Houdini continuera à afficher des messages d'erreur à l'infini.

Si vous pensez que c'est amusant, faites-le. J'écrirai la méthode de création ci-dessous. Le Houdini que j'utilise est 18.0.287, qui est un environnement Windows.

La documentation officielle est ici. Le script de l'éditeur de réseau en cours de fonctionnement se trouve dans (destination de l'installation Houdini) / houdini / python2.7libs / nodegraph.py, donc si vous en avez, il est recommandé de s'y référer.

Accrocher les événements clés sur l'éditeur de réseau

Tout d'abord, ajoutez un fichier de script. Pour le document $HOUDINI_USER_PREF_DIR/python2.7libs/nodegraphhooks.py ʻExemple: C: \ Users \ (nom d'utilisateur) \ Documents \ houdini18.0 \ python2.7libs \ nodegraphhooks.py` Est écrit pour ajouter. Personnellement, j'ai créé un autre répertoire pour faciliter la gestion du script et spécifié le chemin dans pythonrc.py.

pythonrc.py


import sys
sys.path.insert(0,'Chemin de stockage du script')

Je pense que ce n'est pas grave si vous aimez l'un ou l'autre. Le code de contrôle d'opération de nodegraphhooks.py est le suivant.

nodegraphhooks.py


#coding:utf-8 
from canvaseventtypes import *

def createEventHandler(uievent, pending_actions):
    """Accrocher les événements de l'éditeur de réseau"""
    if isinstance(uievent, KeyboardEvent):
        if uievent.eventtype == 'keyhit' and uievent.key=='Shift+Tab':
            uievent.editor.flashMessage(None, 'nodegraphhook!!', 2.0)
    return None, False

Maintenant Shift + Tab affichera le message dans l'éditeur de réseau. nodegraphhook.gif Trouvez simplement les raccourcis clavier inutilisés et écrivez le code correspondant pour étendre l'éditeur. Si vous avez fréquemment utilisé le traitement de scripts, vous trouverez peut-être utile de l'ajouter ici.

Afficher le menu

Ici, hou.qt.Menu est utilisé pour afficher le menu contextuel. Pour écrire un processus qui continuera pendant un certain temps, il semble être une bonne idée de créer une classe qui hérite de nodegraphbase.EventHandler et de la traiter avec une fonction appelée handleEvent.

Le QMenu original de hou.qt.Menu est souvent affiché à l'aide d'une fonction appelée exec_, mais si vous utilisez cette fonction, un avertissement peut être affiché, alors affichez-le avec show.

Ajout du fichier custom_tabmenu_handler.py. Placez-le dans un emplacement qui se trouve dans votre chemin python. Si vous n'êtes pas particulier à ce sujet, vous pouvez utiliser le même répertoire que nodegraphhooks.py.

nodegraphhooks.py


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

def createEventHandler(uievent, pending_actions):
    """Accrocher les événements de l'éditeur de réseau"""
    if isinstance(uievent, KeyboardEvent):
        if uievent.eventtype == 'keyhit' and uievent.key=='Shift+Tab':
            #Renvoie un gestionnaire d'événements pour un menu d'onglets personnalisé
            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+Traitement du menu de l'onglet personnalisé ouvert par l'onglet"""
    def __init__(self, uievent):
        """Processus d'initialisation"""
        base.EventHandler.__init__(self, uievent)
        #Créer un menu
        self.menu = hou.qt.Menu()
        #Enregistrement des actions
        self.addAction(self.menu, 'test', self.testFunc1)
        self.addAction(self.menu, 'test2', self.testFunc2)
        self.menu.addSeparator()
        self.addAction(self.menu, 'test3', self.testFunc3)
        #Affichage du menu
        cursor_pos = QtGui.QCursor.pos()
        self.menu.move(cursor_pos)
        self.menu.show()

    def handleEvent(self, uievent, pending_actions):
        """Traitement des événements"""
        #Renvoie un gestionnaire d'événements pour continuer le traitement des événements
        if self.menu.isVisible():
            return self
        #Le traitement des événements se termine lorsque le menu disparaît
        return None

    def addAction(self, menu, name, func):
        """Fonction d'assistance pour l'enregistrement des actions"""
        act = QtWidgets.QAction(name, menu)
        act.triggered.connect(func)
        menu.addAction(act)

    def testFunc1(self):
        """Afficher le message dans l'éditeur de réseau"""
        #L'événement passé lors de l'initialisation est self.start_Peut être obtenu avec uievent
        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)

Pour ajouter une action, ajoutez une fonction membre et associez-la à addAction. nodegraphhook3.gif

Afficher l'image avec le menu

Je viens de créer un widget qui n'affiche que l'image et l'affiche avec hou.qt.Menu. J'utilise un tel widget.

class PopupImage(QtWidgets.QWidget):
    """Existence qui n'affiche que des images pour la vivacité"""

    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:
            #Veuillez ajuster le chemin de l'image pour une bonne sensation.
            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):
        #Événement de dessin
        painter = QtGui.QPainter(self)
        painter.drawImage(self.rect(), PopupImage.image, PopupImage.image.rect())

Un échantillon un peu plus pratique

Le code est répertorié sur GitHub, alors vérifiez ici pour plus de détails. https://github.com/towazumi/HouNetworkEditorExtendSample

Ajoutez un nœud Null nommé OUT pour le rendre noir

L'histoire originale est Python commençant par Houdini. À l'origine, nous avons changé le nom et la couleur du nœud sélectionné, mais ici nous ajouterons directement des nœuds Null. Une chose à garder à l'esprit est de s'assurer que l'éditeur de réseau est au niveau SOP et de vérifier s'il apparaît dans le menu.

nodegraphhook5.gif

Ajouter un cadre de texte Python et exécuter un bouton au nœud sélectionné

L'histoire originale est __2: Méthode utilisant la chaîne de Lire le fichier Wavefront.mtl par rappel. Faites ce paramètre à partir de Python.

nodegraphhook6.gif

Enregistrer / restaurer le nœud sélectionné en tant que code Python

L'histoire originale est [Houdini Snippet] Save Node as Python Code. Je rend possible l'utilisation de ces informations lors de l'ajout du traitement au script généré par asCode et de sa restauration.

nodegraphhook7.gif

Résumé

Le moment est peut-être dangereux de se retirer car Python3 arrive également, mais il est amusant de le modifier à votre guise. J'espère que cet article sera utile à ceux qui sont également intéressés. Jusqu'à la fin Merci d'avoir lu.

Recommended Posts

Afficher le menu contextuel du script dans l'éditeur de réseau
Obtenez le chemin du script en Python
Déboguer le script avec l'éditeur Sakura
Django ~ Affichons-le sur le navigateur ~
Afficher Python 3 dans le navigateur avec MAMP
Exécuter l'interpréteur Python dans le script
Je veux afficher la progression en Python!
Accédez aux variables définies dans le script depuis REPL
Afficher le 邊
Lisez le fichier csv et affichez-le dans le navigateur
Afficher le numéro de ligne de l'éditeur vim (avec les paramètres par défaut)
Python Open CV a essayé d'afficher l'image sous forme de texte.