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.

dimanche 5 août 2012

maya python vector

    Salut salut.
Je cherchais comment avoir la distance entre deux vertex quand je me suis rendu compte que dans python on travail pas avec des vecteurs, on fait tout avec les listes et les tuples. Alors que en Mel on a bien des variables de types vector:
vector $vect1 = <<0,1,0>>;
vector $vect2 = <<1,3,0>>;
vector $vect3 = $vect1 + $vect2;
// Result: <<1, 4, 0>>  // 


Alors comment faire la même chose en python dans maya ? En utilisant l'API et la class MVector, au passage voici le script qui permet d'avoir le vecteur distance entre deux vertex:
import maya.cmds as m
import maya.OpenMaya as om

vX = m.pointPosition("pCube1.vtx[2]")
vX = m.pointPosition("pCube1.vtx[3]")

vXx = om.MVector(vX[0], vX[1], vX[2])
vYy = om.MVector(vY[0], vY[1], vY[2])

vZz =  vYy - vXx

print vZz.x
print vZz.y
print vZz.z


English version:

jeudi 2 août 2012

bake animation nParticle on locators


    Ici mon objectif est de faire une simulation avec nParticles et d'y instancier un petit rig de sphere, première étape: faire la simu avec des nParticles Ball de mm taille que les spheres finals, deuxième étapes: récupérer les position de chaque particule a chaque image, troisième étapes: réattribuer ces positions a des locators (aussi nombreux que les particles) et pour finir parenter les rigs (ou autre node non simulable), dupliqué en bon nombre, aux locators.

En image:


pph264 from colin laubry on Vimeo.

et voici le script que j'ai du écrire pour faire tout cela.

#recuperation de la derniere image
endFrame = cmds.playbackOptions(q = True, maxTime = True)

#recuperation de la premiere image
startFrame = cmds.playbackOptions(q = True, minTime = True)

#recuperation de la selection, dans l'ordre nParticle Instance de base
sel = cmds.ls(sl = True)
part = sel[0]
inst = sel[1]

#nom des futurs instances dupliques
new = ("newInstance_"+part+"_")

#alignement et freeze de l'instance de base
cmds.pointConstraint(part, inst, mo = False)
cmds.pointConstraint(part, inst, rm = True)
cmds.makeIdentity(inst, apply=True, t=1, r=1, s=1, n=0)

#pour chaque frame
for i in range(startFrame, endFrame):
    #deplacement du curseur de la timeline
    cmds.currentTime(i)
    #recuperation du nombre de particles
    nPart = cmds.nParticle(part, ct = True, q = True )
    print i
    #pour chaque particle
    for j in range(1, nPart+1):
        #test de l'existence pour pas dupliquer a chaque frame
        if cmds.objExists((new+str(j))) == 0:
            #duplication de linstance de base
            dup = cmds.duplicate(inst, n = (new+str(j)))
        #recuperation de la position de chaque particle
        posPP = cmds.nParticle(part, at = 'position', id = j, q = True )
        #Attribution de la position a linstance duplique
        cmds.setAttr((new+str(j)+".tx"), posPP[0])
        cmds.setAttr((new+str(j)+".ty"), posPP[1])
        cmds.setAttr((new+str(j)+".tz"), posPP[2])
        #creation de keyframe
        cmds.setKeyframe(new+str(j)+".tx")
        cmds.setKeyframe(new+str(j)+".ty")
        cmds.setKeyframe(new+str(j)+".tz")


English Version:

Pendant ce temps-lá chez FrameStudio ...



...ca tremble !



fr expression from colin laubry on Vimeo.

Pour faire ceci j'ai du me remettre en peu au mel et creer une expression noise sur chaque petit cube qui forme le gros cube. Qui de bien fou, juste une petit subtilité que j'ai découvert pour tester l'existence d'un object:

if ( `objExists $nomTest` ) {}

Voici l'expression en entiere:




//interrupteur attr
float $of = `getAttr "nurbsCircle1.onOff"`;
//boucle pour chaque petit cube
for ( $i=1; $i<99; ++$i ){
 //nom des petits cubes
 string $cu = "pCube" + $i;
 //test existence du nom
 if ( `objExists $cu` ) {
  //random value
  float $ra = `rand 1 3`;
    
     float $ran = 1+((noise(time)*$ra)/10)*$of;
    
  //application au scale
      scale -a $ran $ran $ran $cu;

  }

 else{
 //rien mm pas un string ca evite les ralentissements
 }
  
    
}





Pour le reste, j'ai ajouté trois wave deformer sur le gros cube pour avoir ce "flottement", Pour la spherification j'ai utilisé le sculpt deformer.