Cet article est l'article du 25ème jour du Calendrier de l'Avent Houdini 2019. Dernier jour! !!
Affichez votre propre menu avec Shift + Tab (modifiable) sur l'éditeur de réseau. 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.
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. 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.
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.
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())
Le code est répertorié sur GitHub, alors vérifiez ici pour plus de détails. https://github.com/towazumi/HouNetworkEditorExtendSample
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.
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.
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.
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