Clase de ventana QT para diseñar herramientas para ser compatibles entre múltiples programas VFX.
El objetivo principal de la clase es integrarse en la interfaz de usuario del programa, pero también contiene características útiles, como tratar de forma segura con devoluciones de llamada y guardar automáticamente la posición de la ventana.
El uso previsto es hacer que su clase de ventana herede VFXWindow , que es una instancia de QMainWindow . Al llamar cls.show() , iniciará el tipo de ventana correcto en función de qué programa se carga y qué configuraciones se guardaron previamente.
Esto es perfectamente estable, pero todavía hay mucho que necesita mejorar. Se agradece mucho cualquier ayuda para extender el soporte de aplicaciones existente o agregar nuevas aplicaciones.
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 ()✔️ Trabajo / ❔ no probado / No funciona
| Ventana estándar | Ventana atracada | Devoluciones de llamada | Versiones probadas | Linux | Windows | Macosa | |
|---|---|---|---|---|---|---|---|
| maya | ✔️ | ✔️ | ✔️ | 2011-2016, 2017+ | ✔️ | ✔️ | ❔ |
| Maya (independiente) | ✔️ | ✔️ | ❔ | ✔️ | ❔ | ||
| Nuclear | ✔️ | ✔️ | ✔️ | 9-14 | ❔ | ✔️ | ❔ |
| Nuke (terminal) | ✔️ | ✔️ | ❔ | ✔️ | ❔ | ||
| Houdini | ✔️ | 16-19 | ✔️ | ✔️ | ❔ | ||
| Motor irreal | ✔️ | 4.19-4.23, 5.0-5.3 | ✔️ | ❔ | |||
| Licuadora | ✔️ | ✔️ | 2.8-4.2 | ❔ | ✔️ | ❔ | |
| Licuadora (fondo) | ✔️ | ❔ | 3.1-4.2 | ❔ | ✔️ | ❔ | |
| Katana | ✔️ | 7 | ❔ | ✔️ | ❔ | ||
| 3ds max | ✔️ | 2018-2020 | ❔ | ✔️ | ❔ | ||
| Pintor de sustancias | ✔️ | ✔️ | ✔️ | 8.3 | ✔️ | ✔️ | ❔ |
| Diseñador de sustancias | ✔️ | ✔️ | ✔️ | 2019.3, 7.1, 12.3 | ✔️ | ✔️ | ❔ |
| Fusión blackmágica | ✔️ | 9 | ❔ | ✔️ | ❔ | ||
| Sandbox de criina | ✔️ | 5.7 | ❔ | ✔️ | ❔ | ||
| Pitón independiente | ✔️ | 2.7 (QT4), 3.7-3.9 (QT5) | ❔ | ✔️ | ❔ | ||
| Soda | ✔️ | 2.5 | ❔ | ✔️ | ❔ | ||
| Renderdoc | ✔️ | 1.33 | ❔ | ✔️ | ❔ |
* Pasee sobre campos subrayados para ver cualquier detalle/problema adicional.
Ciertas aplicaciones de Windows tienen una interfaz COM basada en el envío, que permitirá un enlace entre Python y la aplicación. Consulte Photoshop-Scripting-Python para obtener un ejemplo sobre cómo conectarse a una aplicación.
Actualmente no hay forma de lanzar VFXWindow desde el interior de estas aplicaciones.