dimanche 21 octobre 2012

PyQt parent to main maya window


    Pour parenter sa fenetre pyqt a celle de maya pour pouvoir l'avoir en top et qu'elle se hide avec elle. Il faut récupérer le QMainWindow() et y parenter notre nouvelle fenêtre grasse au module SIP.
Exemple:



import maya.OpenMayaUI as OpenMayaUI
import sip
from PyQt4 import QtCore, QtGui
class window(QtGui.QMainWindow):
    def __init__ (self,        parent = sip.wrapinstance( long( OpenMayaUI.MQtUtil.mainWindow() ), QtCore.QObject )):
        super(window, self).__init__(parent)
        
d = window()
d.show()

lundi 15 octobre 2012

astuce python, compare two variables with set

        Petit astuce python fort pratique ! l'utilisation des variables de type "set". "set" permet de faire des opérations entre variables "set". Voici quelques exemples:


#union
a = set(['a','b','c','d'])
b = set(['d','d','d','d','e','f','g'])
a.union(b)

# Result: set(['a', 'c', 'b', 'e', 'd', 'g', 'f']) #
#remarques: 'd' est stocké qu'une fois dans le nouveau set; attention le set mélanges les valeurs

#différence
a = set(['a','b','c','d','e','f','g'])
b = set(['d','d','d','d','e','f','g'])
a.difference(b)
# Result: set(['a', 'c', 'b']) # 



Il existe beaucoup d'autres opérateurs, pour plus de détails:
 http://docs.python.org/library/sets.html

lundi 17 septembre 2012

PyQt right click button (QPushButton)


    Qt ne propose pas d'event 'right click', du genre mousePressRightEvent() et c'est bien dommage.  Donc c'est a nous de faire ce event, pas vraiment en créant un nouvelle fonction mais en modifiant la fonction mousePressEvent() classique. Pour cela nous devons dériver notre QPushButton a partir d'une nouvelle classe, exemple PushRightButton (le 'Q' étant réservé a Qt).


#
#


#import des modules Qt
from PyQt4.QtGui import *
from PyQt4.QtCore import *

#creation de la class, on precise qu'on derive la class QPushButton entre parentheses
class PushButtonRight (QPushButton):

    #creation du signal emetteur (emet rien pour le moment)
    rightClick = pyqtSignal()


    #creation de notre fontion __init__ avec un arg string pour le nom du futur bouton
    def __init__ (self, string):
        #on integre la classe QPushButton a notre class PushRightButton
        QPushButton.__init__(self, string)

    #modification de la fontion mousePressEvent
    def mousePressEvent (self, event):
        #on integre la fonction QPushButton.mousePressEvent(self, event) a notre fonction PushRightButton.mousePressEvent(self, event)
        QPushButton.mousePressEvent(self, event)

        #condition du click droit
        if event.button() == Qt.RightButton :
            #emittion du signal rightClick
            self.rightClick.emit()
            print ('right click')

#
#


Maintenant il suffit de creer un bouton grace a notre class PushRightButton et de faire la connection:

#
#


butRightClick = PushRightButton('hello')

butRightClick.rightClick.connect(laFuturFonction)

#
#



mardi 11 septembre 2012

MFnHikEffector

    Comment créer des jolies nodes de contrôles comme ceci (viewport en wireframe):





Grace a l'API maya et a MFnHikEffector:

import maya.OpenMayaAnim as OpenMayaAnim
node = OpenMayaAnim.MFnHikEffector()
node.create()

mercredi 29 août 2012

python mel delete history

    Petite astuce toute bête, comment faire un 'delete by type history' en mel ou python, et bien grâce a la fonction delete:

cmds.delete(ch = True)

mercredi 8 août 2012

convert string character into a variable

   Petite astuces python:
Comment convertir une chaine de caracteres en une variable et pouvoir recuperer sa valeur. Grace a la fonction locals().

sal = 12
d = 'sal'

v = locals()[d]

print v        

#Result: 12 

English version:

mardi 7 août 2012

UI function with arguments


    Comme vous avez deja pu le remarquer, Python maya accepte pas d'arguments pour les callback fonctions des UI, par exemple ce qui suit le 'command' d'un bouton...
Faire ceci n'est pas possible:

bt1 = cmds.button(l = 'test1', c = maFonction(monArgument))

La maniere la plus simple de contourner le probleme et de faire appel a la fonction functools.partial. Pour executer une fonction a l'aide de functools.partial:

functools.partial(maFonction, monArgument)

Un petit exemple concret:

import maya.cmds as cmds
from functools import partial




def selType(none = None, types = None):
    t = cmds.ls(type = types)
    cmds.select(t)
    


if cmds.window('partialEx', q= True, ex = True):
    cmds.deleteUI('partialEx')
win = cmds.window('partialEx')
lay = cmds.columnLayout()


bt1 = cmds.button(l = 'test1',p = lay, c = partial(selType, types = 'mesh'))
bt2 = cmds.button(l = 'test2',p = lay, c = partial(selType, types = 'nurbsSurface'))


cmds.showWindow(win)

Notez que functools.partial demande un argument supplementaire, ici j'ai ajouté none = None. Si la fonction est dans une class alors le self de la class fera l'affaire.