Utiliser PyQt dans Maya
Par Narann le samedi, 18 juillet 2009, 22:45 - Script et code - Lien permanent
Vous ne vous êtes jamais dis: "Arf! Le MEL c'est cool mais ça commence à être un peu has been...".
Personnellement, je me fait cette réflexion assez souvent... :hehe: Même si on arrive à avoir ses petites habitude de GUI (certaines sont des bijoux d'inventivité), il n'est pas inintéressant de se pencher sur ce qui ce fait de plus... Comment dire... Jeune...
Je vous invite donc à découvrir comment intégrer PyQt dans Maya.
Lors de mes nombreuses recherches d'informations sur l'API Python dans Maya, je suis tombé sur un post d'un utilisateur qui donnait un code d'exemple pour utiliser PyQt dans Maya. J'ai tous de suite été interpellé. J'avais eu l'occasion de faire du Qt, j'avais abandonné tellement ça m'avais donné des boutons à l'époque. Je débutait en C++ et j'avais déjà du mal à encaisser le coup. Et croyez moi, développer une GUI en C et C++, c'est pas du MEL... Mais j'avais été très impressionné par la doc, les exemples, et les possibilités offerte...
C'est donc avec une certaine curiosité que je me suis penché sur ce post.
QTCkoi?
C'est sur wikipedia! (Un peu de lecture pour vous = Grosse flegme pour moi! :marioCours: )
Pour faire cours, il s'agit d'un framework, un ensemble de lib livré en "pack" qui vous permet de faire quasiment tout...
Remarque
Avant de commencer, sachez que je n'ai testé opération uniquement sur un Maya 32bits, d'après la doc il semble qu'il soit possible de faire fonctionner le module sur un Maya x64 mais il faut faire deux trois choses que je n'ai même pas lu. La documentation "officiel" d'Autodesk est disponible dans:
C:\Program Files\Autodesk\Maya2009\devkit\other\PyQtScripts
On peut commencer.
Let's Go!
Pour que tout ça marche il faut dans un premier temps installer la même version de l'interpréteur Python que Maya, à savoir la "branche" 2.5.x:
http://www.python.org/download/releases/
Le troisième numéro étant le numéro des mises à jour critique, ça ne changera rien au fonctionnement.
Installez la version x86:
Note au utilisateurs de Python >2.5 il n'est pas nécessaire de cocher l'option "Register Extensions" pour que la manipulation fonctionne (désactiver cette option vous permet de continuer à avoir votre version de Python actuel par défaut).
PyQt
Le plus simple est fait. Maintenant il va falloir aller sur le site de PyQt afin de savoir quel version de Qt télécharger. En effet, PyQt ne s'occupe que de faire le lien entre Python et Qt. Il faudra donc installer Qt en premier puis PyQt ensuite. Mais avant nous devons savoir quel version de Qt la dernière version de PyQt supporte (on s'accroche!).
Allez donc sur le site de PyQt:
La dernière version pour Python 2.5 (la version utilisé par Maya) est donc la version 4.4.3. Téléchargez là mais ne l'installez pas.
Qt
Une fois que c'est fait, il nous faut aller sur le site de Qt, dans la section download. Mais ne téléchargez rien! En effet, par défaut, le site vous invite à télécharger la dernière version du framework (4.5.2 à l'heure ou j'écris ses lignes)... Tout comme Maya n'utilise pas la dernière version de Python (3.1) et que nous n'avons donc pas télécharger la dernière version de Python. Et bien nous allons devoir ruser un peu.
La méthode la plus simple (celle que j'ai appliqué) consiste à commencer le téléchargement:
Il ne suffit ensuite plus qu'a copier l'url.
Et avec un peut de jugeote, on peut le modifier suivant ce qu'on cherche, à savoir:
http://get.qtsoftware.com/qt/source/qt-win-opensource-4.5.2-mingw.exe
Devient:
http://get.qtsoftware.com/qt/source/qt-win-opensource-4.4.3-mingw.exe
Pas terrible la méthode...
Oui! Ça, c'était la méthode que j'ai trouvé la plus simple.
Qt propose une autre méthode qui consiste à aller "fouiller" dans le ftp du site... Franchement, c'est moyen mais si vous vous sentez l'ame d'un Indiana Johns, allons y.
Dans la page principal des download, en bas a droite:
(Petite musique d'Indiana Johns en fond) On fait moins le malin là! :mechantCrash:
Comme je suis gentil, je vous donne le chemin:
ftp://ftp.qtsoftware.com/qt/source/qt-win-opensource-4.4.3-mingw.exe
Maintenant que vous l'avez, c'est bon, installez le, vous avez le droit!!!
Petite subtilité au moment de l'install:
Cochez la case si vous n'avez pas MinGW (c'est un compilateur. A priori on n'en à pas besoin mais ça me semble plus "propre" de procéder ainsi).
Lancez l'installe:
A la fin, je vous invite à regardez les exemples histoire de voir ce qu'il est possible de faire. :sourit:
Petites Manips Importantes
Il faut "setter" les variables d'environnement. Normalement, ceci est fait automatiquement durant l'installation mais mon système étant en 64 bits (Vista x64), il me semble qu'elle n'ont pas été enregistrer. Heureusement, Trolltech à pensé à nous et il vous suffira de lancer:
C:\Qt\4.4.3\bin\qtvars.bat
Avec des droits administrateur pour faire tout ça à votre place.
Ensuite lancez l'installation de PyQt-Py2.5-gpl-4.4.3-1.exe et laissez toute les options par défaut (si Python 2.5 est bien installé tout devrait se passer sans problème).
Lancer les exemples (c'est un peu long à se lancer la première fois donc pas d'inquiétude).
Note: Pour les utilisateurs qui n'aurait pas "registré" Python à l'installe de Python 2.5, vous remarquerez que les exemples PyQt ne se lance pas... Bon, perso j'ai quand meme mis 10 minutes avant de comprendre que Windows essayait de les lancez avec la version actuellement enregistré sur mon OS, à savoir: Python 3.1... Pour lancer les exemples, la solution la plus simple semble être d'ouvrir un invite de commande et de lancer quelque chose comme:
C:\Python25>python.exe C:\Python25\Lib\site-packages\PyQt4\examples\tools\qtdemo\qtdemo.pyw
Bon, c'est cool mais pour vous rendre compte des "limitations" (comparé à Qt "normal"), essayez l'exemple Thread/Mandelbrot sur Qt et PyQt... Ça n'a juste rien à voir (En même temps on n'installe pas Qt pour faire des fractals sous Maya...).
Copie-Colle
Dernière étape, il nous faut copier quelques fichiers du répertoire Python 2.5 vers le répertoire Python de Maya.
Allez dans:
C:\Python25\Lib\site-packages
Sélectionnez PyQt4 et sip.pyd.
Copiez les dans:
C:\Program Files\Autodesk\Maya2009\Python\Lib\site-packages
Program Files (x86) si comme moi vous êtes sur un OS x64.
Takeoff!
Lancez Maya (32bits), ouvrez le Script Editor.
Faites un:
import PyQt4
Lancez:
Vous avez gagné!!!
Dernier exemple
Bon, ce billet avait juste pour vocation de vous montrer qu'on pouvait utiliser Qt dans Maya à l'aide de PyQt. Je ne compte pas faire de tutos sur PyQt mais je vous invite à faire vos scripts (envoyez les moi, je les publierai sur cette page) voir mieux, à faire des tutoriaux la dessus!
En attendant, je vous donne un script que j'ai trouvé sur un Google Groupe destiné à Python Dans Maya (ça ressemble un peu à Tkinter):
from __future__ import division import sys from math import * from PyQt4.QtCore import * from PyQt4.QtGui import * class Form(QDialog): def __init__(self, parent=None): super(Form, self).__init__(parent) self.browser = QTextBrowser() self.lineedit = QLineEdit("Type an expression and press Enter") self.lineedit.selectAll() #Select all texts layout = QVBoxLayout() #Main Layout layout.addWidget(self.browser) layout.addWidget(self.lineedit) self.setLayout(layout) self.lineedit.setFocus() self.connect(self.lineedit, SIGNAL("returnPressed()"), self.updateUi) self.setWindowTitle("Farsheed Calculater") def updateUi(self): try: text = unicode(self.lineedit.text()) self.browser.append("%s = <b>%s</b>" % (text, eval(text))) except: self.browser.append( "<font color=red>%s is invalid!</font>" % text) app = QApplication(sys.argv) form = Form() form.show() app.exec_()
Par monsieur Farsheed Ashouri, merci à lui :bravo:
Et en prod?
Nous y voila, la grande question. Et bien oui, maintenant qu'on s'est cassé le derrière à intégrer tout ça, pourquoi ne pas l'utiliser en prod?
Et bien en ce qui me concerne je pense que c'est une question "de confiance"... En effet, Il y a pas mal d'acteurs qui sont en jeux: Trolltech (Qt), River Bank Computing (PyQt) et Autodesk. Un peut trop celons moi. En effet, le gros problème quand on utilise un binding Python d'un autre projet (par exemple: wxWidget -> wxPython), c'est qu'on est dépendant du bon vouloir des développeurs du bind... Dans le cas de wxPython (voir un ancien billet), les développeurs ne semblait pas chaud à l'idée de passer le projet en Python 3.1 (River Bank Computing à franchis le pas mais c'est bien le seul que j'ai vu pour l'instant, il semble gagner de l'argent avec PyQt cela dis, ça doit surement aider).
Ajoutez à ça qu'il pourrait y avoir des bugs qui apparaissent typiquement en production (vous savez, quand on commence à "vraiment" utiliser un produit, rien ne marche)... Et ses bugs pourrait venir de Maya... Et a mon avis, là vous pouvez vous brosser pour qu'Autodesk résolve le truc... Vu qu'il s'agit aussi d'une ancienne version (Python 2.5 et donc Qt 4.4.3), il n'est pas dit que River Bank Computing soit réactif quand à la résolution des problèmes...
Bref, même si pour l'instant Maya 2009 est en Python 2.5, rien ne dit qu'il ne passera pas à Python 3.1 un jour... Et ce jour là, il faudra que les lib utilisés dans votre pipeline soit compatible au risque de ne pas pouvoir avancer dans les versions... En gros, ça fait un peu de monde à attendre et il est déjà assez dur comme ça d'évoluer un pip' à chaque version d'un logiciel sans s'ajouter des contraintes.
Un soft 3D à déjà un bon paquet de problèmes sans qu'on ait à s'ajouter des potentiels problèmes.
Je ne sais pas si c'est possible mais tant qu'à utiliser Qt (qui est un framework bien balèze à apprendre quand même), autant utiliser l'API Maya en C++. Ça me semble plus "logique": Ça permet de s'affranchir de PyQt et d'avoir des meilleurs perfs (a priori, si on prend Qt, c'est pour utiliser ses outils... Si c'est juste pour faire des boutons, autant utiliser le MEL).
En effet, je pense que quand on commence à intégrer un framework tel que Qt dans Maya (il faut déjà en avoir besoin...), c'est qu'on compte se lancer dans la durée et que les outils créés doivent (tant qu'a faire) être performant...
En ce qui me concerne, si j'avais un studio qui me posait cette question, la réponse serait quelque chose comme:
- Pourquoi Qt?
- Les besoins ne peuvent pas être comblé en MEL?
- Tu connait Qt? PyQt?
- Combien de temps veut tu que tes outils dure? Le temps d'une prod? Durant toute la durée de vie du studio?
A chacun de voir ;)
N'hésitez pas à donner votre avis sur la question (ou si vous avez eu des problèmes durant ce "tuto")
A bientôt!
Dorian
EDIT 2009 08 21: Dans la mesure ou les prochaines versions de Maya utiliseront pyQT pour les GUI (rien d'officiel mais c'est un secret de Polichinelle), cette conclusion est "deprecated", pire elle est complètement erroné. On peut donc sérieusement commencer à s'y intéresser. N'hésitez pas, si vous connaissez des liens vers des tutos pour pyQT spécifique à Maya! ;)
Commentaires
PyQt est de plus en plus utilisé en prod ( Duran Duboi, Nightshift en France par exemple ).
Faire une interface en Qt est bien plus rapide qu'en Mel et offre bien plus de possibilités.
Et pour information, les prochaines versions de Maya auront un GUI Qt donc le problème de savoir si çà vaut le coup ou non ne se posera plus :)
KS
En effet, quand j'ai fait ce billet, je n'avais pas encore testé Maya 2010. C'est en cherchant la raison du manque de nouveautés sur différents forums que j'ai lu des infos (non officiel) des développeurs de Maya qui disaient qu'ils allaient intégrer pyQT. Il semble même qu'il soit question d'une refonte complète de l'interface grâce à pyQT (et même d'une refonte du Core de Maya avec multithread et tout le tralala super modern)... Si c'est le cas, je veut bien attendre un ou deux ans. ^^
Dès lors que cette information se révèle vrai, on peu sérieusement se tourner vers pyQT et découvrir les joies des "modern GUI".
Cela dis, je n'ai jamais dis que pyQT était avare en possibilités. Au contraire, QT est un des plus gros framework open source. Cependant, je ne sais pas de quand cette information (refonte de l'interface Maya en pyQT) date mais je ne l'ai appris que récemment. Je vais donc revoir mon jugement sur ce billet qui aurait été tout autre si il eut été fait un chouilla plus tard.
Concernant l'utilisation pyQT dans les studios français, quand on connait le devenir de pyQT dans Maya, oui, la question ne se pose pas (plus). En revanche, si c'eut été autre chose, quand on fait un pipeline, on vise sur du long terme et la prudence semble de mise. Je pense notamment à pymel (et encore, pymel est fait par la communauté qui est réactive, ce n'est pas le cas de pyQT qui lui était une lib Python d'Autodesk non supporté dont on ne savait pas grand chose).
Concernant pymel, je pense sérieusement que c'est l'intégration foireuse de Python dans Maya qui lui a, indirectement, donné naissance... Si l'intégration avait été digne de ce nom pymel n'aurait surement jamais existé. Cependant, malgré toute ses qualités (c'est rare de voir des implémentations aussi "user-oriented"), tout le monde s'accorde à dire que son principal défaut tiens dans le fait qu'elle n'est pas supporté par Autodesk. Encore une fois, c'est une question de "confiance". Certe Dreamworks et tout un tas d'autres studios l'utilises (c'est rassurant quand à l'avenir) mais chacun d'eux c'est forcément concerté sur l'intégration d'un outil non supporté et les alternatives qu'il implique en cas de "panne". (Une conversation interessante sur pymel)
Je pense que c'est la démarche logique. On ne fonce pas tête baissé sur une nouvelle techno ou un outil parce qu'il "tue".
Ainsi, l'intégration d'un outil non supporté me semble risqué dès lors qu'il nous est impossible d'en assurer le support nous même (Justement, tous les studios ne s'appel pas Dreamworks).
Encore une fois, je ne médis pas de pymel (au contraire, j'aurai tendance à cracher sur Autodesk qui s'est quand même fait méchamment soufflé sur ce coup là ^^ ). Mais j'ai remarqué que ce qui détruit la stabilité d'un pipeline (et donc d'une structure), c'est l'ajout à outrance de nouvelles technologie pour le "projet en cours qui devait être terminé depuis la semaine dernière", sans aucune réflexion sur les impacts et que peuvent avoir ses outils à long terme...
Pour revenir à pyQT, ayant appris hier que c'est "Ze futur of Maya", je vais très sérieusement m'y tourner, c'est franchement une bonne nouvelle ça (enfin si ils refont un implémentation Python dont ils ont le secret et qu'on voit un pyQT4Maya débarqué, on ne sera pas plus avancé... Croisons les doigts ^^ ).
Quand tu dis que faire une interface pyQT (sans pymel hein...) est plus rapide qu'un interface MEL je suis très curieux (j'ai pas réussi... Rien que charger les modules et écrire les classe ça fait la taille d'une petite interface MEL...).
Si tu pouvais lâcher quelques code que je puisse faire quelques comparaisons je t'en serai très reconnaissant. :)
En effet pour avoir fait du MEL, Tkinter et QT (en C++), je trouve que c'est assez kiff kiff question écriture.
Hello :)
En terme de code, le fait que tu es Qt Designer c'est même pas comparable, tu ne codes plus l'interface, tu fait 80 / 90 % dans Qt Designer, tu surclasse ta classe de GUI et après tu rajoutes toute la logique Signal / Slots et tes méthodes toi même.
Et puis il y a des trucs qui sont tout simplement impossible à faire en mel et très simple en Qt / PyQt ( Spreadsheet, Custom Widgets, etc ).
D'autant plus que PyQt est quelque chose de bien établi et très utilisé, les mecs de chez Riverbanks sont super réactifs ( tout comme Trolltech d'ailleurs ) donc j'ai aucun souçi sur la perenité des 2 produits, surtout que honnetement c'est peut être ce qui de fait de mieux à l'heure actuelle en terme d'interface. Il n'y a qu'à voir juste le nombre de softs dans le domaine qui se basent dessus ( Maxwell, Lightwave Core, Nuke, Maya 2011 ou 2012, Mudbox, Image Modeler, etc... )
KS
Qt Designer... Faudrait vraiment que je m'y mette à celui là! Vu l'avenir de Maya, ça ne saurait tarder ^^.
Merci pour toute ses infos :)
Je sent que ça va être feux d'artifices quand il vont sortir 2011 ou 12 (sous réserve qu'ils tiennent leurs promesses et pas qu'il nous foute un bind foireux à la Python :D ).
Wait'n see.
Ouai c'est un peu çà qui m'inquiete aussi, c'est d'ailleurs pour çà que la nouvelle interface n'est pas dans la 2010 et qu' Autodesk nous a refait un 2009 + Goodies en guise de Maya 2010. Ils n'ont pas pu faire quelque chose de fonctionnel dans le cycle de dev imparti.
On verra bien ! :)
KS