Home           
Les procédures en MEL
 

<< Les structure de contrôle en MEL   Premier tutorial sur les UI : les fenêtres >>

Ce tutorial va introduire les notions de procédures,de sauvagarder dans des fichiers.

Avant de commencer

Avant de pouvoir créer des fichiers ".mel", il faut mettre une variable d'environnement à jour dans Windows. C'est la variable : MAYA_SCRIPT_PATH. Il faut indiquer le chemin du répertoire où vont être stockés les scripts MEL.

Ma première procédure

Nous allons nous servir ici du script développé par disciplus (de mayalounge : je ne remercierai jamais assez ce forum et les gens qui y participent!!).
Je rappelle ce script ici :

int $pos_X = 0;
int $pos_Z = 0;
string $nom_sphere;
int $num_sphere=0;

polySphere -name "boule_0";

setAttr boule_0.translateY 10;

//boucle pour les colonnes
for($col = 0; $col< 5; $col++)
{
   //position en Z des sphères
   $pos_Z = $col * 3;

   //boucles pour les lignes
   for($ligne = 0; $ligne <5; $ligne++)
   {
      //on va dupliquer la sphere
      duplicate -rr -un;

      $num_sphere++;

      //position de la ligne
      $pos_X = $ligne * 3;

      //on stocke le nom de la sphere qu'on vient de créer
      $nom_sphere = "boule_" + $num_sphere;

      //si la sphere a bien été créée
      if(objExists($nom_sphere))
      {
         setAttr ($nom_sphere+".translateX") $pos_X;
         setAttr ($nom_sphere+".translateZ") $pos_Z;
      }
   }
}

delete boule_0;

Et voici ce que l'on obtient avec ce script :

Ce script est bien mais le problème, c'est que quand on veut l'exécuter, il faut le retaper...
Nous allons voir maintenant comment faire pour ne taper qu'une seule fois ce script. Nous allons créer notre première procédure.

Avant de passer à l'écriture de ce script, passez dans une nouvelle scène.

Pour ce faire, nous allons utilser les mots clés : global proc.

  • global : indique que ce qui suit est visible de tout le monde ;
  • proc : indique que c'est une procédure.

Nous allons écrire la procédure : tutDisciplus dont voici le code :

global proc tutdisciplus()
{

int $pos_X = 0;
int $pos_Z = 0;
string $nom_sphere;
int $num_sphere=0;

polySphere -name "boule_0";

setAttr boule_0.translateY 10;

//boucle pour les colonnes
for($col = 0; $col< 5; $col++)
{
   //position en Z des sphères
   $pos_Z = $col * 3;

   //boucles pour les lignes
   for($ligne = 0; $ligne <5; $ligne++)
   {
      //on va dupliquer la sphere
      duplicate -rr -un;

      $num_sphere++;

      //position de la ligne
      $pos_X = $ligne * 3;

      //on stocke le nom de la sphere qu'on vient de créer
      $nom_sphere = "boule_" + $num_sphere;

      //si la sphere a bien été créée
      if(objExists($nom_sphere))
      {
         setAttr ($nom_sphere+".translateX") $pos_X;
         setAttr ($nom_sphere+".translateZ") $pos_Z;
      }
   }
}

delete boule_0;
}

Il suffit de taper exactement ça dans l'éditeur de script. Une fois ceci tapé il ne se passe rien.
Maintenant, tapons tutdisciplus. Et voilà les boules apparaissent.

Nous avons écrit notre première procédure.

Premier fichier ".mel"

Nous allons voir maintenant comment faire pour sauvegarder notre procédure dans un fichier pour qu'elle puisse être appelée ultérieument sans avoir besoin de la retaper.

Prenez un éditeur de texte tel que UltraEdit ou encore mieux, utilisez MELANIE.

Tapez le script que nous avons vu précédemment. Enregistrer-le sous tutdisciplus.mel dans le répertoire que vous avez indiqué dans la variable d'environnement que vous avez changée au début.

ATTENTION le nom du fichier est très important. En effet, Maya se sert du nom de la procédure pour retrouver le nom du fichier.

Arrêtez Maya et relancez le. Maintenant taper tutdisciplus. Et magie : un réseau de sphères appara&icric;t.

Amélioration du script

Le scipt de disciplus est bien mais il faudrait qu'on puisse changer le nombre de lignes et de colonnes. Nous allons voir comment faire pour ajouter des paramètres à une procédure. Il auffit en fait d'indiquer le nom des paramètres.

Voici donc la nouvelle procédure : global proc grille(int $num_ligne, int $num_col) . Nous allons donc sauvegarder ce script sous grille.mel.

global proc grille(int $num_ligne, int $num_col)
{

int $pos_X = 0;
int $pos_Z = 0;
string $nom_sphere;
int $num_sphere=0;

polySphere -name "boule_0";

setAttr boule_0.translateY 10;

//boucle pour les colonnes
for($col = 0; $col< $num_col; $col++)
{
   //position en Z des sphères
   $pos_Z = $col * 3;

   //boucles pour les lignes
   for($ligne = 0; $ligne < $num_ligne; $ligne++)
   {
      //on va dupliquer la sphere
      duplicate -rr -un;

      $num_sphere++;

      //position de la ligne
      $pos_X = $ligne * 3;

      //on stocke le nom de la sphere qu'on vient de créer
      $nom_sphere = "boule_" + $num_sphere;

      //si la sphere a bien été créée
      if(objExists($nom_sphere))
      {
         setAttr ($nom_sphere+".translateX") $pos_X;
         setAttr ($nom_sphere+".translateZ") $pos_Z;
      }
   }
}

delete boule_0;
}

Une fois ceci enregistré, il faut relancer Maya... Je n'ai pas encore trouvé comment faire pour qu'il prenne en compte directement le script.

Maintenant tapez grille(4,3);

Et voici le résultat :

Découpons le travail

Je vais ajouter une autre procédure qui sera locale au script, c'est à dire que seul ce script la verra.

Nous allons travailler sur la procédure grille2.
Voici cette nouvelle procédure.

proc testAttr(string $nom_objet,int $pos_X, int $pos_Z)
{
   //si la sphere a bien été créée
   if(objExists($nom_objet))
   {
      setAttr ($nom_objet+".translateX") $pos_X;
      setAttr ($nom_objet+".translateZ") $pos_Z;
   }
}

Et maintenant voici la définition de la procédure grille2.

global proc grille2(int $num_ligne, int $num_col)
{

int $pos_X = 0;
int $pos_Z = 0;
string $nom_sphere;
int $num_sphere=0;

polySphere -name "boule_0";

setAttr boule_0.translateY 10;

//boucle pour les colonnes
for($col = 0; $col< $num_col; $col++)
{
   //position en Z des sphères
   $pos_Z = $col * 3;

   //boucles pour les lignes
   for($ligne = 0; $ligne < $num_ligne; $ligne++)
   {
      //on va dupliquer la sphere
      duplicate -rr -un;

      $num_sphere++;

      //position de la ligne
      $pos_X = $ligne * 3;

      //on stocke le nom de la sphere qu'on vient de créer
      $nom_sphere = "boule_" + $num_sphere;

      //on va déplacer la nouvelle sphère
      testAttr($nom_sphere,$pos_X,$pos_Z);    }
}

delete boule_0;
}

grille2 a le même but que grille mais cette fois le déplacement se fait dans une procédure locale. Si vous tapez grille2(3,4); dans Maya, voici le résultat:

Maintenant vous savez votre code en plusieurs procédures.

Petit bonus

Il est possible de stocker plusieurs procédures globales dans un même fichier ".mel". En effet, si Maya ne connait pas la procédure appelée, il va chercher dans tous les endroits indiqués par les variables d'environnement. Ainsi dès qu'il a trouvé le bon fichier il le charge. Il va donc charger la procédure si trouvant et tout ce qui se trouve avant cette procédure. Ainsi les procédures globales si trouvant seront aussi chargées.

J'ai ajouté la procédure globale avant grille2 :

global proc hello2()
{
   print "Bonjour la lounge!";
}

Si la procédure grille2 n'a pas été appelée avant, hello2 ne pourra fonctionner. Par contre, si grille2 a été appelée, voici le résultat :

 

Valeur de retour

Nous allons voir maintenant comment faire pour avoir une valeur de retour dans nos procédures. Nous allons créer la procédure carre qui élève un nombre au carré.

global proc int carre(int $a)
{
   return $a * $a;
};

Voilà maintenant vous savez presque tout sur les procédures!

 

<< Les structure de contrôle en MEL   Premier tutorial sur les UI : les fenêtres >>
  eXTReMe Tracker