Dorian Fevrier's blog - Mot-clé - pyqtJe m’appelle FEVRIER Dorian, je suis infographiste 3D passionné par mon métier, l’informatique en général, l’internet, la programmation et l’évolution de tout ce petit monde. Vous trouverez sur ce blog des tutoriaux, mes coups de cœurs, avis, etc.2024-01-02T23:48:05+01:00FEVRIER Dorianurn:md5:695d9c73474c33ce3dab043823509c4bDotclearCréer une interface rapidement pour Maya 2011 via loadUIurn:md5:cff106445dce70d154e727c3359ed66f2011-03-23T00:44:00+01:002013-07-26T18:11:18+02:00NarannScript et codefrguiinterfacemayamelpyqtpythonqtscript<p><img src="https://www.fevrierdorian.com/blog/public/logos/QtPython_logo001.png" alt="QtPython_logo001.png" style="float:left; margin: 0 1em 1em 0;" title="QtPython_logo001.png, juil. 2009" height="150" width="150" />Aujourd'hui je vous propose un petit tuto sur une nouvelle méthode, depuis dans Maya 2011, pour faire des interfaces avec Qt Designer (via la commande loadUI).</p>
<p>Je vous montrerai le principe, et on attaquera avec un exemple concret. Nous verrons donc les avantages et inconvénients de cette technique.</p>
<p>Vous allez voir que la vérité autour de cette nouvelle <em>feature</em> n'est pas aussi jolie qu'elle le laisse croire.</p>
<p>J'espère que vous apprécierez! :sourit:</p> <ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#la_base">La base</a>
<ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#precision_qt">Précisions importantes concernant Qt</a>
<ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#framework_qt">Le framework Qt</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#qt_dans_maya">Le "Qt dans Maya"</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#pyqt">PyQt</a></li>
</ul></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#conclusion">Conclusion</a></li>
</ul></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#la_pratique">La pratique</a>
<ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#qt_designer">Qt Designer</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#le_script">Le script</a>
<ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#charger_interface_dans_maya">Charger son interface dans maya</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#la_hierarchie">La hierarchie</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#executer_du_code_python">Exécuter du code python</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#note_concernant_noms_widgets">Note concernant les noms des widgets</a></li>
</ul></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#cas_divers">Cas divers</a>
<ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#interagir_avec_interface">Interagir avec l'interface</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#integrer_widget_mel">Intégrer un widget MEL dans un .ui</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#un_mot_sur_les_layouts">Un mot sur les layouts</a></li>
</ul></li>
</ul></li>
</ul>
<h3>La base <a name="la_base"></a></h3>
<p>Si Maya a tiré son épingle du jeu dans le milieu des années 90, c'est en grande partie grâce à l'ouverture qu'il offrait. Le <a href="http://fr.wikipedia.org/wiki/Mel_%28langage%29">MEL</a> était un avantage indéniable sur la concurrence.</p>
<p>Mais c'est surtout la possibilité de scripter des interfaces assez évoluées, sans avoir de compétences en programmation, qui l'a rendu indispensable aux graphistes un peu techniques.</p>
<p>Cela dit, si coder une interface en script en 95 était une révolution, on peut dire qu'en 2011 c'est un peu dépassé, même pour un "vrai" développeur.</p>
<p>En effet, les frameworks d'interface (sortes de grosses librairies de code) ont énormément évolués, gagnant en flexibilité, et avec toujours le même objectif: "Code less, create more".</p>
<p>C'est dans ce contexte qu'est "née" (notez que j'utilise les guillemets) la commande <a href="http://download.autodesk.com/us/maya/2011help/CommandsPython/loadUI.html">loadUI</a>.</p>
<h4>Précisions importantes concernant Qt <a name="precision_qt"></a></h4>
<p>Comme vous le savez sûrement, depuis Maya 2011, le framework utilisé pour l'interface (et sûrement, à l'avenir beaucoup d'autres choses) est Qt (prononcez à l'anglaise: "Quioute").</p>
<p>Je ne vais pas m'étaler sur ce framework mais je vous encourage à lire <a href="http://www.siteduzero.com/tutoriel-3-11240-introduction-a-qt.html">cette très bonne présentation</a> du "Site du zéro" (Et je vous encourage à y rester et fouiller un peu :sourit: ).</p>
<p>En revanche je vais passer plus de temps sur un point qui me semble important car j'ai entendu énormément de graphistes se planter en parlant de "Qt dans Maya", et pour cause, c'est assez subtil. Vous allez voir. :sourit:</p>
<p>Il faut distinguer deux choses (voir trois):</p>
<ul>
<li>Le framework Qt.</li>
<li>Le "Qt dans Maya".</li>
<li>PyQt (pour ceux qui travaillent dans des studios qui l'utilisent).</li>
</ul>
<h5>Le framework Qt <a name="framework_qt"></a></h5>
<p>Ça, c'est la librairie multiplateforme C++ dont je parle plus haut, le framework, le vrai.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/logos/Qt_logo002.png" alt="Qt_logo002.png" style="display:block; margin:0 auto;" title="Qt_logo002.png, juil. 2009" height="217" width="217" /></p>
<p>C'est "ce" Qt qu'utilise les <del>branquignoles</del> développeurs de chez Autodesk quand ils compilent Maya (là, je viens de pourrir ma carrière à l’international avec ma blague minable/facile/pas drôle :baffed: ). Le viewport 2.0 est sûrement le fruit de l'utilisation de ce framework, comme pleins de petites features qui sont apparues avec Maya 2011.</p>
<p>Celle là, vous n'y avez pas accès "simplement"! Vous ne pouvez pas scripter des threads, ouvrir un contexte OpenGL, afficher des SVG, accéder à une base de données SQL, gérer des certificats SSL, créer vos propres widget, etc...</p>
<p>L'API de Maya permet de passer par une classe (<a href="http://download.autodesk.com/us/maya/2011help/API/class_m_qt_util.html">MQtUtil</a>) pour accéder de manière plus poussé aux "controls" (interface). Mais de ce que j'en lis, il n'y a rien de bien folichon. Pas d'accès direct à Qt. :nervous:</p>
<h5>Le "Qt dans Maya" <a name="qt_dans_maya"></a></h5>
<p>Je ne compte plus le nombre de fois ou j'ai pu entendre: "On peut faire du Qt dans Maya 2011!" (à chantonner sur un ton guilleret et jovial parce que c'est <em>new</em> et que ça <em>a l'air bien</em> :marioCours: ).</p>
<p><img src="https://www.fevrierdorian.com/blog/public/logos/maya_logo_bigcrop_w590_1_.jpg" alt="maya_logo_bigcrop_w590_1_.jpg" style="display:block; margin:0 auto;" title="maya_logo_bigcrop_w590_1_.jpg, janv. 2009" height="286" width="590" /></p>
<p>La vérité, c'est qu'on peut faire du Qt (PyQt pour être exact) <a href="https://www.fevrierdorian.com/blog/post/2009/07/01/Utiliser-PyQt4-dans-Maya">depuis Maya 2008</a>. Depuis qu'on peut faire du Python dans Maya en fait... J'y reviendrai.</p>
<p>- "Mais pourtant si! Regarde, le mec sur internet, il utilise Qt Designer pour faire son interface, il clique et là... Oaaaaah! Il la charge dans Maya!"</p>
<p>Et nous y voila!</p>
<p>Si la définition de "faire du Qt" veut dire utiliser Qt Designer pour faire son interface et la charger, alors oui, on peut faire du Qt dans Maya.</p>
<p>Mais comme vous l'avez lu plus haut dans ce billet, Qt c'est beaucoup plus que ça (en fait ce n'est même pas ça).</p>
<p>- "Mais alors il fait quoi de ce fichier Qt Designer?"</p>
<p>Il le converti en MEL (ou en Python de Maya).</p>
<p>- "Wait! Wft! o_O"</p>
<p>Et oui, ce n'est pas super sexy mais c'est pourtant la vérité. Et pour vous le prouver, voici une citation <a href="http://download.autodesk.com/us/maya/2011help/files/WS73099cc142f48755527cc80126d167ffa2-7170.htm">de la doc</a>:</p>
<blockquote><p>The loadUI command creates the widgets specified in the file by executing their corresponding Maya commands.</p></blockquote>
<p>Ok, sauf que si le widget en question n'a pas d'équivalent en MEL, il fait quoi? Et bien il ne le créé pas!</p>
<blockquote><p>If the loadUI command encounters a Qt widget for which there is no equivalent Maya control, the Qt widget is still created, but you cannot access it from MEL or Python scripts.</p></blockquote>
<center><i>Mange!</i></center>
<p>Et ça va même plus loin! :injures:</p>
<p>Démonstration:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_16_03_interface_Maya2011_loadUI/interface_Maya2011_loadUI_001.png" alt="interface_Maya2011_loadUI_001.png" style="display:block; margin:0 auto;" title="interface_Maya2011_loadUI_001.png, mar. 2011" height="173" width="589" /></p>
<center><i>Dans Qt Designer.</i></center>
<p>Notez l'utilisation d'un <em>QStakedWidget</em> (les deux petites flèches noires en haut à droite)</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_16_03_interface_Maya2011_loadUI/interface_Maya2011_loadUI_002.png" alt="interface_Maya2011_loadUI_002.png" style="display:block; margin:0 auto;" title="interface_Maya2011_loadUI_002.png, mar. 2011" height="186" width="593" /></p>
<center><i>Dans Maya.</i></center>
<p>Les deux flèches ont disparu!</p>
<p>Bon, on s'en fout de ce widget (De toute façon personne ne l'utilise :baffed: ) mais l'idée est surtout de montrer qu'un QWidget qui n'existe pas dans Maya (pas d'équivalences MEL) est soit créé mais il est impossible d'y accéder, soit n'est pas être créé du tout!</p>
<p>Le log est aussi assez explicite:</p>
<pre>
# Creating a QStackedWidget named "stackedWidget". #
# Creating a QWidget named "page_3". #
# Creating a QGroupBox named "groupBox". #
# Creating a QmayaCheckBox named "checkBox_2". #
# Creating a QmayaCheckBox named "checkBox_3". #
# Creating a QWidget named "page_4". #
# Creating a QPushButton named "pushButton". #
# Creating a QmayaCheckBox named "checkBox". #
# There is no Maya command for objects of type QVBoxLayout. #
# There is no Maya command for objects of type QVBoxLayout. #
# There is no Maya command for objects of type QStackedLayout. #
# There is no Maya command for objects of type QVBoxLayout. #
# There is no Maya command for objects of type QVBoxLayout. #
</pre>
<center>Tiens donc! Des <i>QmayaCheckBox</i>... :siffle: </center>
<p>Bref, vous l'aurez compris, "Qt dans Maya" ça veut bien dire ce que ça veut dire: C'est Qt encastré dans Maya. Et c'est Maya qui décide comment on l'utilise. Autrement dit, c'est du MEL...</p>
<h5>PyQt <a name="pyqt"></a></h5>
<p>Et voici le dernier le la liste. Qui c'est quoi qu'est-ce?</p>
<p><img src="https://www.fevrierdorian.com/blog/public/logos/RiverBanklogo.png" alt="RiverBanklogo.png" style="display:block; margin:0 auto;" title="RiverBanklogo.png, juil. 2009" height="100" width="100" /></p>
<p><a href="http://www.riverbankcomputing.co.uk/software/pyqt">PyQt</a> est le binding Python de Qt (enfin un des bindings, vu que Nokia a décidé, <a href="http://linuxfr.org/news/pyside-python-et-qt-par-nokia">pour des raisons de licence</a>, de faire le sien, qui de toute façon, a peine fini, <a href="http://www.developpez.net/forums/d1124055/autres-langages/python-zope/gui/pyside-pyqt/projet-pyside-danger/" hreflang="fr">n'a plus d'avenir</a>).</p>
<p>Pour résumer, ça permet de faire du <em>vrai</em> Qt avec la syntaxe Python. Et comme on peut intégrer, dans Maya, n'importe quelle lib Python du moment qu'elle utilise la même version, on peut faire du PyQt dans Maya.</p>
<p>C'est particulièrement puissant pour les TDs (pas de connaissances en C++ requises). Toute les classes de la lib d'origine sont disponibles.</p>
<p>Et quand un graphiste arrive dans un studio qui utilise PyQt, il y a 90% de chance qu'il fasse un amalgame entre PyQt et le "Qt de Maya".</p>
<center>:reflechi:</center>
<h4>Conclusion <a name="conclusion"></a></h4>
<p><strong>Le fait que Maya utilise Qt ne veut pas dire qu'on peut faire du Qt dans Maya!</strong></p>
<p>C'est Maya qui "fait du Qt" et vous qui utilisez Maya.</p>
<h3>La pratique <a name="la_pratique"></a></h3>
<p>Bon assez de blabla, passons à la pratique! :gniarkgniark:</p>
<h4>Qt Designer <a name="qt_designer"></a></h4>
<p>Pour faire une zolie n'interface, il faut utiliser Qt Designer. Malgré son apparente simplicité, il nécessite un certains temps d'adaptation avant de pouvoir sortir des UI convenables.</p>
<p>Vous devez être à l'aise avec les notions de "layout" notamment.</p>
<p>Une fois de plus, je vous invite à lire <a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#http://www.siteduzero.com/tutoriel-3-11360-modeliser-ses-fenetres-avec-qt-designer.html">le tuto</a> du "site du zéro" qui fait une très bonne présentation.</p>
<p>N'hésitez pas à vous chercher un peu sur le net, il y a beaucoup de tuto/sujets sur Qt Designer (Hop! <a href="http://www.programmez.com/tutoriels.php?titre=Dessiner-un-widget-avec-Qt-Designer-4&tutoriel=53">Encore un</a>!)</p>
<p>Voici une vidéo très bien faite (anglais):</p>
<iframe title="YouTube video player" width="640" height="390" src="http://www.youtube.com/embed/LYF0spYkXUs?hd=1" frameborder="0" allowfullscreen></iframe>
<p>Glissez quelques widgets dans votre interface, faites Ctrl+R pour faire quelques tests puis sauvegardez votre fichier ".ui".</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_16_03_interface_Maya2011_loadUI/interface_Maya2011_loadUI_003.png" alt="interface_Maya2011_loadUI_003.png" style="display:block; margin:0 auto;" title="interface_Maya2011_loadUI_003.png, mar. 2011" height="411" width="545" /></p>
<h4>Le script <a name="le_script"></a></h4>
<p>C'est maintenant qu'on attaque Maya! :gniarkgniark:</p>
<h5>Charger son interface dans maya <a name="charger_interface_dans_maya"></a></h5>
<p>Pour lancer notre fenêtre faite avec Qt Designer, il faut lancer la nouvelle commande de Maya 2011: <a href="http://download.autodesk.com/us/maya/2011help/CommandsPython/loadUI.html">loadUI</a>.</p>
<p>Pour cela, rien de plus simple:</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">import</span> maya.<span style="color: #dc143c;">cmds</span> <span style="color: #ff7700;font-weight:bold;">as</span> <span style="color: #dc143c;">cmds</span>
mainWin = <span style="color: #dc143c;">cmds</span>.<span style="color: black;">loadUI</span><span style="color: black;">(</span> uiFile=<span style="color: #483d8b;">"monFichier.ui"</span> <span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">showWindow</span><span style="color: black;">(</span> mainWin <span style="color: black;">)</span></pre>
<p>Et voici notre fenêtre:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_16_03_interface_Maya2011_loadUI/interface_Maya2011_loadUI_004.png" alt="interface_Maya2011_loadUI_004.png" style="display:block; margin:0 auto;" title="interface_Maya2011_loadUI_004.png, mar. 2011" height="309" width="342" /></p>
<p>Maintenant que vous savez comment charger votre interface dans Maya, voyons comment demander à un bouton d'exécuter une commande.</p>
<p>Mais juste avant on va structurer un peu nos fichiers. :nannan:</p>
<h5>La hierarchie <a name="la_hierarchie"></a></h5>
<p>Pour organiser notre code, on va faire simple. Dans votre:</p>
<pre class="bash bash">C:\Users\userName\Documents\maya\scripts</pre>
<p>Placez les deux fichiers suivants:</p>
<ul>
<li>myScript.ui contient le fichier Qt Designer.</li>
<li>myScript.py contient les éléments qui appellent l'interface ainsi que les scripts appelés par l'interface elle même.</li>
</ul>
<p>Dans myScript.py, il est fortement conseillé de séparé la classe de l'ui + lib:</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">import</span> maya.<span style="color: #dc143c;">cmds</span> <span style="color: #ff7700;font-weight:bold;">as</span> <span style="color: #dc143c;">cmds</span>
uiFilePath = <span style="color: #483d8b;">"C:/Users/userName/Documents/maya/scripts/myScript.ui"</span> <span style="color: #808080; font-style: italic;"># le fichier ui</span>
<span style="color: #ff7700;font-weight:bold;">class</span> ui<span style="color: black;">(</span><span style="color: black;">)</span> :
<span style="color: #483d8b;">"""Classe principale de l'interface"""</span>
<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">(</span> <span style="color: #008000;">self</span> <span style="color: black;">)</span> :
<span style="color: #483d8b;">"""Initialise l'interface"""</span>
<span style="color: #008000;">self</span>.<span style="color: black;">lib</span> = lib<span style="color: black;">(</span><span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">mainWin</span> = <span style="color: #dc143c;">cmds</span>.<span style="color: black;">loadUI</span><span style="color: black;">(</span> uiFile=uiFilePath <span style="color: black;">)</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">showWindow</span><span style="color: black;">(</span> <span style="color: #008000;">self</span>.<span style="color: black;">mainWin</span> <span style="color: black;">)</span>
<span style="color: #ff7700;font-weight:bold;">def</span> toto<span style="color: black;">(</span> <span style="color: #008000;">self</span>, <span style="color: #66cc66;">*</span>arg <span style="color: black;">)</span> :
<span style="color: #483d8b;">"""Fonction d'exemple qui utilise la lib"""</span>
<span style="color: #008000;">self</span>.<span style="color: black;">lib</span>.<span style="color: black;">doSomething</span><span style="color: black;">(</span><span style="color: black;">)</span>
<span style="color: #ff7700;font-weight:bold;">class</span> lib<span style="color: black;">(</span><span style="color: black;">)</span> :
<span style="color: #483d8b;">"""Classe principale de le lib"""</span>
<span style="color: #ff7700;font-weight:bold;">def</span> doSomething<span style="color: black;">(</span> <span style="color: #008000;">self</span> <span style="color: black;">)</span> :
<span style="color: #483d8b;">"""Fonction simple qui print quelque chose"""</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">"toto"</span></pre>
<p>Le tout s'exécute dans Maya:</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">import</span> myScript
<span style="color: #008000;">reload</span><span style="color: black;">(</span>myScript<span style="color: black;">)</span>
myScript.<span style="color: black;">ui</span><span style="color: black;">(</span><span style="color: black;">)</span></pre>
<p>Cette méthode permet de bien séparer le comportement de l'interface de celui de Maya:</p>
<ul>
<li>L'UI communique avec la lib.</li>
<li>La lib communique avec Maya.</li>
</ul>
<p>La lib ne doit jamais agir sur l'interface. C'est l'interface qui se modifie suivant ce que lui dit la lib. (<a href="http://www.chucknorrisfacts.fr/index.php?p=detail_fact&fact=66">Ça me rappelle</a> un Chuck Norris fact tiens :seSentCon: )</p>
<h5>Exécuter du code python <a name="executer_du_code_python"></a></h5>
<p>Vous pouvez définir des appels à des fonctions MEL ou Python directement depuis Qt Designer:</p>
<p>Comme <a href="http://download.autodesk.com/us/maya/2011help/files/WS73099cc142f48755527cc80126d167ffa2-7170.htm">indiqué dans la doc</a>, il faut ajouter un attribut dynamique.</p>
<p>Sélectionnez un boutton et faites:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_16_03_interface_Maya2011_loadUI/interface_Maya2011_loadUI_005.png" alt="interface_Maya2011_loadUI_005.png" style="display:block; margin:0 auto;" title="interface_Maya2011_loadUI_005.png, mar. 2011" height="174" width="536" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_16_03_interface_Maya2011_loadUI/interface_Maya2011_loadUI_006.png" alt="interface_Maya2011_loadUI_006.png" style="display:block; margin:0 auto;" title="interface_Maya2011_loadUI_006.png, mar. 2011" height="185" width="382" /></p>
<center><i>Notez l'utilisation du "+" pour préciser que l'argument qu'on va lui donner sera un argument Python.</i></center>
<p>Si dans le cas du MEL (qui n'est pas un langage objet) le fait d'entrer le nom complet de la commande à exécuter ne pose pas de soucis (c'est même comme ça qu'il faut faire), en Python, le fait de ne pas pouvoir passer un <em>objet</em> (au sens <em>programmation</em>) à son interface est assez problématique.</p>
<p>En effet, si vous passez <em>self.toto</em> vous aurez une jolie erreur lors du lancement:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_16_03_interface_Maya2011_loadUI/interface_Maya2011_loadUI_007.png" alt="interface_Maya2011_loadUI_007.png" style="display:block; margin:0 auto;" title="interface_Maya2011_loadUI_007.png, mar. 2011" height="82" width="281" /></p>
<pre class="python python"><span style="color: #808080; font-style: italic;"># Error: name 'self' is not defined</span>
<span style="color: #808080; font-style: italic;"># Traceback (most recent call last):</span>
<span style="color: #808080; font-style: italic;"># File "<maya console>", line 1, in <module></span>
<span style="color: #808080; font-style: italic;"># NameError: name 'self' is not defined #</span></pre>
<p>Le soucis c'est que l'interface n'a pas d'accès à la classe. Donc impossible d'utiliser <em>self.toto</em> facilement.</p>
<p>Vous pouvez toujours ne pas utiliser les <em>objets</em> avec Python. Vous pourrez donc ne donner que le nom de la fonction à lancer. Mais c'est très dommage de ne pas utiliser la puissance des classes. :redface:</p>
<p>Mais alors, comment lancer une commande tel que <em>self.toto</em> avec cette méthode?</p>
<p>Et bien on <em>édite</em> le bouton (ou le widget à modifier) dans le code. On "repasse" dessus une fois qu'il est créé.</p>
<p>En effet, <em>loadUI</em> conserve les noms des widgets donné dans le <em>.ui</em>. Vous pouvez donc les appeler et les modifier dans votre code une fois le loadUI fait:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_16_03_interface_Maya2011_loadUI/interface_Maya2011_loadUI_008.png" alt="interface_Maya2011_loadUI_008.png" style="display:block; margin:0 auto;" title="interface_Maya2011_loadUI_008.png, mar. 2011" height="162" width="304" /></p>
<blockquote><p>Note: N'oubliez pas de supprimer l'attribut dynamique que nous avons créé plus haut (+command). En effet, il est impossible de redéclarer un attribut si il est déjà setté dans le fichier .ui.</p></blockquote>
<pre class="python python"><span style="color: #008000;">self</span>.<span style="color: black;">mainWin</span> = <span style="color: #dc143c;">cmds</span>.<span style="color: black;">loadUI</span><span style="color: black;">(</span> uiFile=uiFilePath <span style="color: black;">)</span>
<span style="color: #808080; font-style: italic;"># add callbacks</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">button</span><span style="color: black;">(</span> <span style="color: #483d8b;">"totoPushButton"</span>, edit=<span style="color: #008000;">True</span>, command=<span style="color: #008000;">self</span>.<span style="color: black;">toto</span> <span style="color: black;">)</span> <span style="color: #808080; font-style: italic;"># on modifie le button "totoPushButton" cree dans Qt Designer</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">showWindow</span><span style="color: black;">(</span> <span style="color: #008000;">self</span>.<span style="color: black;">mainWin</span> <span style="color: black;">)</span></pre>
<p>Et oui... C'est assez assez <del>con</del> subtil vous en conviendrez mais il semble qu'on ait pas le choix... :nousfesonslemal:</p>
<p>Cliquez sur le bouton, vous devriez voir "toto" s'écrire dans le script editor.</p>
<h5>Note concernant les noms des widgets <a name="note_concernant_noms_widgets"></a></h5>
<p>Il est important de connaitre les limites concernant l'utilisation des noms des widgets des fichiers .ui dans Maya.</p>
<p>En effet, si Maya s'apprète à créer un widget qui a le nom qu'un widget déja présent dans votre session, Maya le renommera (souvent en ajoutant un chiffre derrière).</p>
<p>Il faut donc être rigoureux sur la gestion de ses widgets dans Maya. La meilleure solution consistant à supprimer la fenetre principale avant d'en recharger une nouvelle.</p>
<p>L'idée étant qu'aucun nom ne rentre en collision avec un autre. :reflechi:</p>
<p>Je n'ai pas essayé de construire des fenêtres "à la volée" (l'interface génère ses propres fenètres) via loadUI mais aux vues du fonctionnement, on ne peut utiliser qu'une seule instance.</p>
<h4>Cas divers <a name="cas_divers"></a></h4>
<p><a href="https://www.fevrierdorian.com/blog/public/billets/2011_16_03_interface_Maya2011_loadUI/caddies_vert_crop_small.jpg" title="caddies_vert_crop_small.jpg"><img src="https://www.fevrierdorian.com/blog/public/billets/2011_16_03_interface_Maya2011_loadUI/.caddies_vert_crop_small_m.jpg" alt="caddies_vert_crop_small.jpg" style="display:block; margin:0 auto;" title="caddies_vert_crop_small.jpg, mar. 2011" height="420" width="560" /></a></p>
<center><small><i><a href="http://www.flickr.com/photos/piaser/4515886094/">Photo</a> par <a href="http://www.flickr.com/photos/piaser/">gwenflickr</a> sous licence Créative <a href="http://creativecommons.org/licenses/by-nc-sa/2.0/deed.fr">by-nc-sa</a>. Merci à lui! :sourit:</i></small></center>
<p>Ici, je vous propose des solutions rapides à la plupart des cas particuliers qu'on rencontre.</p>
<h5>Interagir avec l'interface <a name="interagir_avec_interface"></a></h5>
<p>Comme les noms restent valides, on peut aussi s'en servir pour modifier un widget.</p>
<pre class="python python"><span style="color: #808080; font-style: italic;"># change l'etat d'une checkBox</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">checkBox</span><span style="color: black;">(</span> <span style="color: #483d8b;">"myCheckBox"</span>, edit=<span style="color: #008000;">True</span>, value=<span style="color: #ff4500;">0</span> <span style="color: black;">)</span></pre>
<pre class="python python"><span style="color: #808080; font-style: italic;"># ajoute un element a la liste</span>
<span style="color: #dc143c;">cmds</span>.<span style="color: black;">textScrollList</span><span style="color: black;">(</span> <span style="color: #483d8b;">"myTextScrollList"</span>, edit=<span style="color: #008000;">True</span>, append=<span style="color: #483d8b;">"un element"</span> <span style="color: black;">)</span></pre>
<h5>Intégrer un widget MEL dans un .ui <a name="integrer_widget_mel"></a></h5>
<p>Si un widget qui existe dans Maya n'est pas dispo dans Qt Designer (et il y en a un paquet), le plus simple est de faire une interface avec des layouts "vides" et de les intégrer une fois le loadUI fait via le flag <em>parent</em>:</p>
<pre class="python python"><span style="color: #dc143c;">cmds</span>.<span style="color: black;">intFieldGrp</span><span style="color: black;">(</span> parent=<span style="color: #483d8b;">"myParentLayout"</span> <span style="color: black;">)</span></pre>
<h5>Un mot sur les layouts <a name="un_mot_sur_les_layouts"></a></h5>
<p>Sachez que les différents types de layouts de Qt Designer ne sont pas gérés. Ou plutôt si:</p>
<blockquote><p>Any layouts in the file are created as generic layouts and are only accessible within Maya using the layout command, not the commands for specific types of layouts such as formLayout, columnLayout, and so forth.</p></blockquote>
<p>En gros, quel que soit le type de layout créé (vertical, horizontal, etc...) il n'y a qu'un seul équivalent MEL: <a href="http://download.autodesk.com/us/maya/2011help/CommandsPython/layout.html">La commande layout</a>.</p>
<p>Vous n'avez donc aucun contrôle dessus depuis le MEL, la commande layout ne permettant de faire quasiment rien.</p>
<h3>Conclusion</h3>
<p>Bon, maintenant il est temps de dire ce que je pense de ce système. :gniarkgniark:</p>
<p>Sur le fond je trouve que se faire des UI en se passant du script est une très bonne idée. Je l'ai fais en utilisant PyQt au boulot et c'est vraiment sympa et "pas prise de tête" de bosser comme ça (<a href="http://www.programmez.com/tutoriels.php?titre=Dessiner-un-widget-avec-Qt-Designer-4&tutoriel=53">MELANIE proposait déja</a> cette approche à l'époque mais n'était pas une réelle alternative).</p>
<p>Cela dit, Qt Designer ne permet pas d'<a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#integrer_widget_mel">intégrer directement</a> des widgets Maya ce qui est, à la longue, assez chiant quand on créer ses fenetres (ce que vous voyez dans Qt Designer n'est pas ce que vous avez dans Maya). On est obligé de le faire "à la volé" une fois le loadUI fait.</p>
<p>De plus l'inverse est aussi vrai: Il est impossible d'utiliser des widgets de Qt Designer qui n'ont pas d'équivalents dans Maya. Et un widget aussi simple que spinBox n'est pas utilisable dans Maya.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_16_03_interface_Maya2011_loadUI/interface_Maya2011_loadUI_011.png" alt="interface_Maya2011_loadUI_011.png" style="display:block; margin:0 auto;" title="interface_Maya2011_loadUI_011.png, mar. 2011" height="303" width="292" /></p>
<center><i>Il est joli le widget? Ouai! Ben vous ne pouvez rien faire avec...</i></center>
<p>On peut imaginer des choses completement absurdes avec Qt Designer: La spinBox envoit un signal <em>valueChanged</em> avec sa valeur à un widget caché dont on n'est pas capable de récupérer la valeur en MEL... Mais ça serait tellement minable que je n'en parle même pas. :pasClasse:</p>
<p>Voici la liste des widgets Qt Designer et leur équivalents Maya (honteusement pompée sur <a href="http://www.creativecrash.com/maya/tutorials/scripting/mel/c/using-qt-designer-for-mel-interfaces">le très bon tuto</a> de <a href="http://www.creativecrash.com/users/css_maya">css_maya</a>).</p>
<pre class="bash bash"><span style="color: #000000;">1</span>-push Button <span style="color: #7a0874; font-weight: bold;">(</span>under Buttons group<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">-------------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> button
<span style="color: #000000;">2</span>-radio button <span style="color: #7a0874; font-weight: bold;">(</span>under Buttons group<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">------------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> radioButton
<span style="color: #000000;">3</span>-check box<span style="color: #7a0874; font-weight: bold;">(</span>under Buttons group<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">---------------------</span> Maya <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> checkBox
<span style="color: #000000;">4</span>-combo box <span style="color: #7a0874; font-weight: bold;">(</span>under containers group<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">------------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> optionMenu
<span style="color: #000000;">5</span>-line edit <span style="color: #7a0874; font-weight: bold;">(</span>under input widgets group<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">---------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> textField
<span style="color: #000000;">6</span>-spin box <span style="color: #7a0874; font-weight: bold;">(</span>under input widgets group<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">----------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> NONE
<span style="color: #000000;">7</span>-double spine box <span style="color: #7a0874; font-weight: bold;">(</span>under input widgets group<span style="color: #7a0874; font-weight: bold;">)</span>---------Maya <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> NONE
<span style="color: #000000;">8</span>-dial <span style="color: #7a0874; font-weight: bold;">(</span>under input widgets group<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">--------------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> NONE
<span style="color: #000000;">9</span>-list view <span style="color: #7a0874; font-weight: bold;">(</span>under item views model based<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> textScrollList
<span style="color: #000000;">10</span>-horizontal slider <span style="color: #7a0874; font-weight: bold;">(</span>under input widgets<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> intSlider
<span style="color: #000000;">11</span>-label <span style="color: #7a0874; font-weight: bold;">(</span>under display widgets group<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">----------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> NONE
<span style="color: #000000;">12</span>-progress bar <span style="color: #7a0874; font-weight: bold;">(</span>under display widgets group<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">---------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> progressBar
<span style="color: #000000;">13</span>-vertical slider <span style="color: #7a0874; font-weight: bold;">(</span>under input widgets<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">--------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> intSlider
<span style="color: #000000;">14</span>-horizontal line <span style="color: #7a0874; font-weight: bold;">(</span>under input widgets<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">--------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> NONE
<span style="color: #000000;">15</span>-vertical line <span style="color: #7a0874; font-weight: bold;">(</span>under input widgets<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">----------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> NONE
<span style="color: #000000;">16</span>-group box <span style="color: #7a0874; font-weight: bold;">(</span>under containers group<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">-----------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> NONE
<span style="color: #000000;">17</span>-tab widget <span style="color: #7a0874; font-weight: bold;">(</span>under container group<span style="color: #7a0874; font-weight: bold;">)</span> <span style="color: #660033;">-----------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> tabLayout
<span style="color: #000000;">18</span>-main window <span style="color: #660033;">----------------------------------------Maya</span> <span style="color: #7a0874; font-weight: bold;">command</span> to access------------<span style="color: #000000; font-weight: bold;">></span> window</pre>
<p>Au final, ça fait peu de widgets Maya supportés (une dizaine) comparé à ce qu'il propose en standard.</p>
<p>Malgrès le fait que cette intégration à du être couteuse en temps, aux vues des solutions possibles, je ne suis pas sûr que la situation évolue énormément. Il est cependant fort probable qu'Autodesk ajoute les widgets standards de Qt dans Maya mais l'inverse me semble compromis.</p>
<p>Maya 2012 arrivant et ne voyant pas de modifications sur ce point, je soupçonne que loadUI était plus une <a href="https://www.fevrierdorian.com/blog/post/2011/03/23/Creer-une-interface-rapidement-pour-Maya-2011-via-loadUI#qt_dans_maya">fonction marketing</a> qui pourrira au fil du temps jusqu'à ce qu'ils s'y remettent à fond, dans 5 ans... :lanceUnePierre:</p>
<p>Si le principe est sympa pour faire des bouttons et des checkBoxs, les limitations et bricolages que ça impose pour le reste des widgets me font prendre un peu de recule vis-à-vis de cette "solution miracle".</p>
<p>Je vais continuer à essayer de tirer le maximum de cette méthode et voir jusqu'ou ça peut aller mais si je me retrouve à ajouter, dans mon script, tout ce qui manque à l'interface, il n'est pas exclu que je retourne sur une approche 100% Maya Commands.</p>
<p>En esperant que ce billet vous aura aidé à y voir plus clair.</p>
<p>Si je suis resté un peu flou par endroit, n'hésitez pas à me le signaler! ;)</p>
<p>A bientôt!</p>
<p>Dorian</p>
<center>:marioCours:</center>
Utiliser PyQt dans Mayaurn:md5:0b9e83f1e4e9b7fdb060331a26353b7b2009-07-18T22:45:00+02:002013-07-26T22:40:12+02:00NarannScript et code32bits64bitsfrmayamelpyqtpythonqtwxpython<p><img src="https://www.fevrierdorian.com/blog/public/logos/QtPython_logo001.png" alt="QtPython_logo001.png" style="float:left; margin: 0 1em 1em 0;" title="QtPython_logo001.png, juil. 2009" height="150" width="150" />Vous ne vous êtes jamais dis: "Arf! Le MEL c'est cool mais ça commence à être un peu has been...".</p>
<p>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...</p>
<p>Je vous invite donc à découvrir comment intégrer PyQt dans Maya.</p> <p>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...</p>
<p>C'est donc avec une certaine curiosité que je me suis penché sur ce post.</p>
<h5>QTCkoi?</h5>
<p><a href="http://fr.wikipedia.org/wiki/Qt" hreflang="fr">C'est sur wikipedia</a>! (Un peu de lecture pour vous = Grosse flegme pour moi! :marioCours: )</p>
<p>Pour faire cours, il s'agit d'un <a href="http://fr.wikipedia.org/wiki/Framework" hreflang="fr">framework</a>, un ensemble de lib livré en "pack" qui vous permet de faire quasiment tout...</p>
<h5>Remarque</h5>
<p>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:</p>
<pre>
C:\Program Files\Autodesk\Maya2009\devkit\other\PyQtScripts</pre>
<p>On peut commencer.</p>
<h5>Let's Go!</h5>
<p><img src="https://www.fevrierdorian.com/blog/public/logos/4947-frenetik-Pythoncrystal.png" alt="4947-frenetik-Pythoncrystal.png" style="display:block; margin:0 auto;" title="4947-frenetik-Pythoncrystal.png, juil. 2009" height="256" width="256" />
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:</p>
<p><a href="http://www.python.org/download/releases/" hreflang="en">http://www.python.org/download/releases/</a></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_001.png" alt="PyQt_install_001.png" style="display:block; margin:0 auto;" title="PyQt_install_001.png, juil. 2009" height="228" width="319" /></p>
<p>Le troisième numéro étant le numéro des mises à jour critique, ça ne changera rien au fonctionnement.</p>
<p>Installez la version x86:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_002.png" alt="PyQt_install_002.png" style="display:block; margin:0 auto;" title="PyQt_install_002.png, juil. 2009" height="251" width="429" /></p>
<p>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).</p>
<h5>PyQt</h5>
<p><img src="https://www.fevrierdorian.com/blog/public/logos/RiverBanklogo.png" alt="RiverBanklogo.png" style="display:block; margin:0 auto;" title="RiverBanklogo.png, juil. 2009" height="100" width="100" /></p>
<p>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!).</p>
<p>Allez donc sur <a href="http://www.riverbankcomputing.co.uk/software/pyqt/intro" hreflang="en">le site de PyQt</a>:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_006.png" alt="PyQt_install_006.png" style="display:block; margin:0 auto;" title="PyQt_install_006.png, juil. 2009" height="146" width="379" /></p>
<p>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.</p>
<h5>Qt</h5>
<p><img src="https://www.fevrierdorian.com/blog/public/logos/Qt_logo002.png" alt="Qt_logo002.png" style="display:block; margin:0 auto;" title="Qt_logo002.png, juil. 2009" height="217" width="217" />
Une fois que c'est fait, il nous faut aller sur le <a href="http://www.qtsoftware.com/" hreflang="en">site de Qt</a>, dans la section <a href="http://www.qtsoftware.com/downloads/" hreflang="en">download</a>. 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.</p>
<p>La méthode la plus simple (celle que j'ai appliqué) consiste à commencer le téléchargement:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_003.png" alt="PyQt_install_003.png" style="display:block; margin:0 auto;" title="PyQt_install_003.png, juil. 2009" height="303" width="320" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_004.png" alt="PyQt_install_004.png" style="display:block; margin:0 auto;" title="PyQt_install_004.png, juil. 2009" height="299" width="498" /></p>
<p>Il ne suffit ensuite plus qu'a copier l'url.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_005.png" alt="PyQt_install_005.png" style="display:block; margin:0 auto;" title="PyQt_install_005.png, juil. 2009" height="107" width="555" /></p>
<p>Et avec un peut de jugeote, on peut le modifier suivant ce qu'on cherche, à savoir:</p>
<pre>
http://get.qtsoftware.com/qt/source/qt-win-opensource-4.5.2-mingw.exe</pre>
<p>Devient:</p>
<pre>
http://get.qtsoftware.com/qt/source/qt-win-opensource-4.4.3-mingw.exe</pre>
<h5>Pas terrible la méthode...</h5>
<p>Oui! Ça, c'était la méthode que j'ai trouvé la plus simple.</p>
<p>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.</p>
<p>Dans la page principal des download, en bas a droite:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_007.png" alt="PyQt_install_007.png" style="display:block; margin:0 auto;" title="PyQt_install_007.png, juil. 2009" height="347" width="334" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_008.png" alt="PyQt_install_008.png" style="display:block; margin:0 auto;" title="PyQt_install_008.png, juil. 2009" height="380" width="303" /></p>
<p>(Petite musique d'Indiana Johns en fond) On fait moins le malin là! :mechantCrash:</p>
<p>Comme je suis gentil, je vous donne le chemin:</p>
<pre>
ftp://ftp.qtsoftware.com/qt/source/qt-win-opensource-4.4.3-mingw.exe</pre>
<p>Maintenant que vous l'avez, c'est bon, installez le, vous avez le droit!!!</p>
<p>Petite subtilité au moment de l'install:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_009.png" alt="PyQt_install_009.png" style="display:block; margin:0 auto;" title="PyQt_install_009.png, juil. 2009" height="47" width="394" /></p>
<p>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).</p>
<p>Lancez l'installe:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_009b.png" alt="PyQt_install_009b.png" style="display:block; margin:0 auto;" title="PyQt_install_009b.png, juil. 2009" height="386" width="503" /></p>
<p>A la fin, je vous invite à regardez les exemples histoire de voir ce qu'il est possible de faire. :sourit:</p>
<h5>Petites Manips Importantes</h5>
<p>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:</p>
<pre>
C:\Qt\4.4.3\bin\qtvars.bat</pre>
<p>Avec des droits administrateur pour faire tout ça à votre place.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_011.png" alt="PyQt_install_011.png" style="display:block; margin:0 auto;" title="PyQt_install_011.png, juil. 2009" height="173" width="392" /></p>
<p>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).</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_010.png" alt="PyQt_install_010.png" style="display:block; margin:0 auto;" title="PyQt_install_010.png, juil. 2009" height="216" width="247" /></p>
<p>Lancer les exemples (c'est un peu long à se lancer la première fois donc pas d'inquiétude).</p>
<p>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:</p>
<pre>
C:\Python25>python.exe C:\Python25\Lib\site-packages\PyQt4\examples\tools\qtdemo\qtdemo.pyw</pre>
<p>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...).</p>
<h5>Copie-Colle</h5>
<p>Dernière étape, il nous faut copier quelques fichiers du répertoire Python 2.5 vers le répertoire Python de Maya.</p>
<p>Allez dans:</p>
<pre>
C:\Python25\Lib\site-packages</pre>
<p>Sélectionnez PyQt4 et sip.pyd.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_012.png" alt="PyQt_install_012.png" style="display:block; margin:0 auto;" title="PyQt_install_012.png, juil. 2009" height="163" width="295" /></p>
<p>Copiez les dans:</p>
<pre>
C:\Program Files\Autodesk\Maya2009\Python\Lib\site-packages</pre>
<p>Program Files (x86) si comme moi vous êtes sur un OS x64.</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_013.png" alt="PyQt_install_013.png" style="display:block; margin:0 auto;" title="PyQt_install_013.png, juil. 2009" height="207" width="323" /></p>
<h5>Takeoff!</h5>
<p>Lancez Maya (32bits), ouvrez le Script Editor.</p>
<p>Faites un:</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">import</span> PyQt4</pre>
<p>Lancez:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_014.png" alt="PyQt_install_014.png" style="display:block; margin:0 auto;" title="PyQt_install_014.png, juil. 2009" height="419" width="224" /></p>
<p>Vous avez gagné!!!</p>
<h5>Dernier exemple</h5>
<p>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!</p>
<p>En attendant, je vous donne un script que j'ai trouvé sur un Google Groupe destiné à Python Dans Maya (ça ressemble un peu à Tkinter):</p>
<pre class="python python"><span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">__future__</span> <span style="color: #ff7700;font-weight:bold;">import</span> division
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">math</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">from</span> PyQt4.<span style="color: black;">QtCore</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">from</span> PyQt4.<span style="color: black;">QtGui</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">class</span> Form<span style="color: black;">(</span>QDialog<span style="color: black;">)</span>:
<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">(</span><span style="color: #008000;">self</span>, parent=<span style="color: #008000;">None</span><span style="color: black;">)</span>:
<span style="color: #008000;">super</span><span style="color: black;">(</span>Form, <span style="color: #008000;">self</span><span style="color: black;">)</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">(</span>parent<span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">browser</span> = QTextBrowser<span style="color: black;">(</span><span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">lineedit</span> = QLineEdit<span style="color: black;">(</span><span style="color: #483d8b;">"Type an expression and press Enter"</span><span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">lineedit</span>.<span style="color: black;">selectAll</span><span style="color: black;">(</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;">#Select all texts </span>
layout = QVBoxLayout<span style="color: black;">(</span><span style="color: black;">)</span> <span style="color: #808080; font-style: italic;">#Main Layout</span>
layout.<span style="color: black;">addWidget</span><span style="color: black;">(</span><span style="color: #008000;">self</span>.<span style="color: black;">browser</span><span style="color: black;">)</span>
layout.<span style="color: black;">addWidget</span><span style="color: black;">(</span><span style="color: #008000;">self</span>.<span style="color: black;">lineedit</span><span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">setLayout</span><span style="color: black;">(</span>layout<span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">lineedit</span>.<span style="color: black;">setFocus</span><span style="color: black;">(</span><span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">connect</span><span style="color: black;">(</span><span style="color: #008000;">self</span>.<span style="color: black;">lineedit</span>, SIGNAL<span style="color: black;">(</span><span style="color: #483d8b;">"returnPressed()"</span><span style="color: black;">)</span>,
<span style="color: #008000;">self</span>.<span style="color: black;">updateUi</span><span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">setWindowTitle</span><span style="color: black;">(</span><span style="color: #483d8b;">"Farsheed Calculater"</span><span style="color: black;">)</span>
<span style="color: #ff7700;font-weight:bold;">def</span> updateUi<span style="color: black;">(</span><span style="color: #008000;">self</span><span style="color: black;">)</span>:
<span style="color: #ff7700;font-weight:bold;">try</span>:
text = <span style="color: #008000;">unicode</span><span style="color: black;">(</span><span style="color: #008000;">self</span>.<span style="color: black;">lineedit</span>.<span style="color: black;">text</span><span style="color: black;">(</span><span style="color: black;">)</span><span style="color: black;">)</span>
<span style="color: #008000;">self</span>.<span style="color: black;">browser</span>.<span style="color: black;">append</span><span style="color: black;">(</span><span style="color: #483d8b;">"%s = <b>%s</b>"</span> <span style="color: #66cc66;">%</span> <span style="color: black;">(</span>text, <span style="color: #008000;">eval</span><span style="color: black;">(</span>text<span style="color: black;">)</span><span style="color: black;">)</span><span style="color: black;">)</span>
<span style="color: #ff7700;font-weight:bold;">except</span>:
<span style="color: #008000;">self</span>.<span style="color: black;">browser</span>.<span style="color: black;">append</span><span style="color: black;">(</span>
<span style="color: #483d8b;">"<font color=red>%s is invalid!</font>"</span> <span style="color: #66cc66;">%</span> text<span style="color: black;">)</span>
app = QApplication<span style="color: black;">(</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">)</span>
form = Form<span style="color: black;">(</span><span style="color: black;">)</span>
form.<span style="color: black;">show</span><span style="color: black;">(</span><span style="color: black;">)</span>
app.<span style="color: black;">exec_</span><span style="color: black;">(</span><span style="color: black;">)</span></pre>
<p>Par monsieur Farsheed Ashouri, merci à lui :bravo:</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/PyQt_install/PyQt_install_015.png" alt="PyQt_install_015.png" style="display:block; margin:0 auto;" title="PyQt_install_015.png, juil. 2009" height="413" width="450" /></p>
<h5>Et en prod?</h5>
<p>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?</p>
<p>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 <a href="https://www.fevrierdorian.com/blog/index.php?post/2009/03/10/Tkinter%2C-vous-aussi%2C-faites-des-GUI-en-Python...-Ouai%2C-mes-fesses-ouai...#Toujours_plus">un ancien billet</a>), 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).</p>
<p>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...</p>
<p>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.</p>
<p>Un soft 3D à déjà un bon paquet de problèmes sans qu'on ait à s'ajouter des potentiels problèmes.</p>
<p>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).</p>
<p>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...</p>
<p>En ce qui me concerne, si j'avais un studio qui me posait cette question, la réponse serait quelque chose comme:</p>
<ul>
<li>Pourquoi Qt?</li>
<li>Les besoins ne peuvent pas être comblé en MEL?</li>
<li>Tu connait Qt? PyQt?</li>
<li>Combien de temps veut tu que tes outils dure? Le temps d'une prod? Durant toute la durée de vie du studio?</li>
</ul>
<p>A chacun de voir ;)</p>
<p>N'hésitez pas à donner votre avis sur la question (ou si vous avez eu des problèmes durant ce "tuto")</p>
<p>A bientôt!</p>
<p>Dorian</p>
<p>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! ;)</p>