Classe de fenêtres QT pour la conception d'outils à compatible entre plusieurs programmes VFX.
L'objectif principal de la classe est de s'intégrer dans l'interface utilisateur du programme, mais il contient également des fonctionnalités utiles telles que la gestion des rappels en toute sécurité et l'enregistrement automatique de la position de la fenêtre.
L'utilisation prévue est de rendre votre classe Windows hériter VFXWindow - qui est une instance de QMainWindow . En appelant cls.show() , il lancera le type de fenêtre correct en fonction du programme chargé et des paramètres précédemment enregistrés.
C'est parfaitement stable, mais il y a encore beaucoup de choses qui doivent être améliorées. Toute aide à l'extension de la prise en charge des applications existante ou à l'ajout de nouvelles applications est très appréciée.
pip install vfxwindow
from Qt import QtWidgets
from vfxwindow import VFXWindow
class MyWindow ( VFXWindow ):
"""Test window to show off some features."""
WindowID = 'vfx.window.test'
WindowName = 'My Window'
WindowDockable = True
def __init__ ( self , parent = None , ** kwargs ):
super ( MyWindow , self ). __init__ ( parent , ** kwargs )
# Setup widgets/build UI here as you normally would
self . setCentralWidget ( QtWidgets . QWidget ())
# Setup callbacks
self . callbacks . add ( 'file.new' , self . afterSceneChange )
self . callbacks . add ( 'file.load' , self . afterSceneChange )
if self . application == 'Maya' : # Maya supports before/after callbacks
self . callbacks . add ( 'file.new.before' , self . beforeSceneChange )
self . callbacks . add ( 'file.load.before' , self . beforeSceneChange )
elif self . application in ( 'Nuke' , 'Substance' ): # Nuke and Painter/Designer support close
self . callbacks . add ( 'file.close' , self . beforeSceneChange )
# Wait until the program is ready before triggering the new scene method
self . deferred ( self . afterSceneChange )
def afterSceneChange ( self , * args ):
"""Create the scene specific callbacks.
These are being created in a callback "group".
Subgroups are also supported.
Even though the callback is the same, the signatures can differ.
See '/vfxwindow/<app>/callbacks.py' for the relevant signatures.
"""
if self . application == 'Maya' :
self . callbacks [ 'scene' ]. add ( 'node.add' , self . mayaNodeAdded , nodeType = 'dependNode' )
if self . application == 'Nuke' :
self . callbacks [ 'scene' ]. add ( 'node.add' , self . nukeNodeAdded )
def beforeSceneChange ( self , * args ):
"""Delete the scene specific callbacks."""
self . callbacks [ 'scene' ]. delete ()
def mayaNodeAdded ( self , node , clientData ):
"""Print out the node that was added in Maya."""
import maya . api . OpenMaya as om2
print ( 'Node was added: {}' . format ( om2 . MFnDependencyNode ( node ). name ()))
def nukeNodeAdded ( self ):
"""Print out the node that was added in Nuke."""
import nuke
node = nuke . thisNode ()
print ( 'Node was added: {}' . format ( node . name () or 'Root' ))
def checkForChanges ( self ):
"""Update the UI if it is has been in a "paused" state.
This is needed for Nuke and Substance Designer/Painter, because
there's no way to detect if the window is closed or just hidden.
For safety all callbacks will get paused, and upon unpausing,
this method will be run to allow the window to correctly update.
"""
self . beforeSceneChange ()
self . afterSceneChange ()
if __name__ == '__main__' :
MyWindow . show ()✔️ travaillant / ❔ non testé / ne fonctionne pas
| Fenêtre standard | Fenêtre amarrée | Rappels | Versions testées | Linux | Fenêtre | Macos | |
|---|---|---|---|---|---|---|---|
| Maya | ✔️ | ✔️ | ✔️ | 2011-2016, 2017+ | ✔️ | ✔️ | ❔ |
| Maya (autonome) | ✔️ | ✔️ | ❔ | ✔️ | ❔ | ||
| Nouée | ✔️ | ✔️ | ✔️ | 9-14 | ❔ | ✔️ | ❔ |
| Nuke (terminal) | ✔️ | ✔️ | ❔ | ✔️ | ❔ | ||
| Houdini | ✔️ | 16-19 | ✔️ | ✔️ | ❔ | ||
| Irréel | ✔️ | 4.19-4.23, 5.0-5.3 | ✔️ | ❔ | |||
| Mixer | ✔️ | ✔️ | 2.8-4.2 | ❔ | ✔️ | ❔ | |
| Blender (arrière-plan) | ✔️ | ❔ | 3.1-4.2 | ❔ | ✔️ | ❔ | |
| Katana | ✔️ | 7 | ❔ | ✔️ | ❔ | ||
| 3ds max | ✔️ | 2018-2020 | ❔ | ✔️ | ❔ | ||
| Toxicomane | ✔️ | ✔️ | ✔️ | 8.3 | ✔️ | ✔️ | ❔ |
| Concepteur de substances | ✔️ | ✔️ | ✔️ | 2019.3, 7.1, 12.3 | ✔️ | ✔️ | ❔ |
| Fusion blackmagique | ✔️ | 9 | ❔ | ✔️ | ❔ | ||
| Sandbox cryEngine | ✔️ | 5.7 | ❔ | ✔️ | ❔ | ||
| Python autonome | ✔️ | 2.7 (QT4), 3,7-3,9 (QT5) | ❔ | ✔️ | ❔ | ||
| Natron | ✔️ | 2.5 | ❔ | ✔️ | ❔ | ||
| Renderdoc | ✔️ | 1.33 | ❔ | ✔️ | ❔ |
* Survolez les champs soulignés pour voir des détails / problèmes supplémentaires.
Certaines applications Windows ont une interface COM basée sur Dispatch, qui permettra un lien entre Python et l'application. Voir Photoshop-Scripting-Python pour un exemple sur la façon de se connecter à une application.
Actuellement, il n'y a aucun moyen de lancer VFXWindow de l'intérieur de ces applications.