QT Window Class для проектирования инструментов для совместимости между несколькими программами VFX.
Основная цель класса - интегрироваться в пользовательский интерфейс программы, но он также содержит полезные функции, такие как безопасная работа с обратными вызовами и автоматическое сохранение позиции окна.
Предполагаемое использование состоит в том, чтобы сделать ваш класс окна унаследовать VFXWindow - который является экземпляром QMainWindow . Позвонив cls.show() , он запустит правильный тип окна на основе того, какая загруженная программа и какие настройки были ранее сохранены.
Это совершенно стабильно, но все еще есть много, что требует улучшения. Любая помощь в расширении существующей поддержки приложений или добавлении новых приложений очень ценится.
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 ()✔ Работает / ❔ непроверенный / не работающий
| Стандартное окно | Пристыкованное окно | Обратные вызовы | Протестированные версии | Linux | Окна | MacOS | |
|---|---|---|---|---|---|---|---|
| Майя | ✔ | ✔ | ✔ | 2011-2016, 2017+ | ✔ | ✔ | ❔ |
| Майя (автономная) | ✔ | ✔ | ❔ | ✔ | ❔ | ||
| Нук | ✔ | ✔ | ✔ | 9-14 | ❔ | ✔ | ❔ |
| Nuke (терминал) | ✔ | ✔ | ❔ | ✔ | ❔ | ||
| Гудини | ✔ | 16-19 | ✔ | ✔ | ❔ | ||
| Нереальный двигатель | ✔ | 4.19-4.23, 5,0-5,3 | ✔ | ❔ | |||
| Блендер | ✔ | ✔ | 2.8-4.2 | ❔ | ✔ | ❔ | |
| Блендер (фон) | ✔ | ❔ | 3.1-4.2 | ❔ | ✔ | ❔ | |
| Катана | ✔ | 7 | ❔ | ✔ | ❔ | ||
| 3ds max | ✔ | 2018-2020 | ❔ | ✔ | ❔ | ||
| Существенный художник | ✔ | ✔ | ✔ | 8.3 | ✔ | ✔ | ❔ |
| Дизайнер вещества | ✔ | ✔ | ✔ | 2019.3, 7.1, 12.3 | ✔ | ✔ | ❔ |
| Blackmagic Fusion | ✔ | 9 | ❔ | ✔ | ❔ | ||
| Песочница Crygine | ✔ | 5.7 | ❔ | ✔ | ❔ | ||
| Автономный питон | ✔ | 2.7 (QT4), 3,7-3,9 (QT5) | ❔ | ✔ | ❔ | ||
| Натрон | ✔ | 2.5 | ❔ | ✔ | ❔ | ||
| Renderdoc | ✔ | 1.33 | ❔ | ✔ | ❔ |
* Нависнуть над подчеркнутыми полями, чтобы увидеть какие -либо дополнительные детали/проблемы.
Определенные приложения Windows имеют интерфейс COM на основе диспетчеризации, который позволит связь между Python и приложением. См. Photoshop-Scripting-Python для примера того, как подключиться к приложению.
В настоящее время невозможно запустить VFXWindow изнутри этих приложений.