فئة نافذة QT لتصميم الأدوات لتكون متوافقة بين برامج 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 | النوافذ | ماكوس | |
|---|---|---|---|---|---|---|---|
| مايا | ✔ | ✔ | ✔ | 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 كحد أقصى | ✔ | 2018-2020 | ❔ | ✔ | ❔ | ||
| رسام المادة | ✔ | ✔ | ✔ | 8.3 | ✔ | ✔ | ❔ |
| مصمم المواد | ✔ | ✔ | ✔ | 2019.3 ، 7.1 ، 12.3 | ✔ | ✔ | ❔ |
| الانصهار الأسود | ✔ | 9 | ❔ | ✔ | ❔ | ||
| صندوق الرمل | ✔ | 5.7 | ❔ | ✔ | ❔ | ||
| بايثون المستقل | ✔ | 2.7 (QT4) ، 3.7-3.9 (QT5) | ❔ | ✔ | ❔ | ||
| ناترون | ✔ | 2.5 | ❔ | ✔ | ❔ | ||
| Renderdoc | ✔ | 1.33 | ❔ | ✔ | ❔ |
* تحوم على الحقول التي تحتها خط لمعرفة أي تفاصيل/مشكلات إضافية.
تحتوي بعض تطبيقات Windows على واجهة COM القائمة على الإرسال ، والتي ستتيح رابطًا بين Python والتطبيق. انظر Photoshop-scripting-python للحصول على مثال على كيفية الاتصال بالتطبيق.
حاليًا لا توجد طريقة لإطلاق VFXWindow من داخل هذه التطبيقات.