Récupérer le nom d’un attribut caché dans Maya
Par Narann le mardi, 14 août 2018, 22:09 - Script et code - Lien permanent
Il n’est pas rare, quand on script, de devoir récupérer le nom d’un attribut en vu de l’utiliser, plus tard, dans ses scripts. D’une manière générale, il suffit de modifier l’attribut, d’aller dans le Script Editor puis de trouver la ligne qui fait le setAttr sur l’attribut qui nous intéresse. :petrus:
Vous remarquerez toutefois que cette méthode ne fonctionne pas avec certains attributs. Il arrive, en effet, que la commande setAttr correspondante ne soit pas affichée dans le Script Editor. Je vous propose ici la méthode que j’utilise pour aller trouver les attributs « timides ». :sourit:
Avant de commencer, sachez qu’on ne peut pas parler de méthode à proprement parler tant il s’agit plutôt d’un bricolage. :perplex:
Première chose, trouvons un attribut qui n’affiche pas de commande setAttr dans le Script Editor. C’est le cas de l’attribut Smooth Mesh Preview des nœuds de type mesh.
Essayez de le modifier, rien ne s’affiche. Vous pouvez activer Echo All Commands, l’attribut apparaît une seule fois sur les 257 lignes qui s’affichent. Difficile de le trouver. :pasClasse:
Le truc c’est qu’un attribut affiché par l’Attribute Editor de Maya n’a pas forcément une relation 1:1 avec l’attribut du nœud qu’il est censé représenter. En effet, l’Attribute Editor permet d’afficher des interfaces qui ont leur propre logique. Dans le mon exemple, l’interface de l’Attribut Editor exécute un script « sous le capot » et c’est ce script qui, suivant la combinaison des paramètres sélectionnés dans l’interface, set l’attribut à une valeur donnée (0, 1 ou 2). Comme ce n’est pas Maya qui s’occupe de modifier l’attribut mais un script, la commande de setAttr n’apparaît pas dans le Script Editor. :dtcFuckSmile:
Ce n’est donc pas la bonne méthode. Voici la mienne :
Le principe consiste à sauver deux fois la scène, une fois avec l’attribut dans un état, et l’autre fois avec l’attribut dans un autre état et de faire une différence ligne à ligne via un logiciel spécialisé. Allons-y ! :grenadelauncher:
Laissez l’attribut non modifié puis sauvez la scène en ASCII :
Contrairement au binaire, ce mode permet de sauver sa scène sous forme d’un gros script lisible pas tout bon éditeur de texte (ouvrez la scène sauvegardée avec votre éditeur de texte favoris puis jugez) .
N’oubliez pas de cocher l’option Use full names for attributes on nodes. Comme vous le devinez, cette option affiche les noms complets des attributs. :siffle:
Sauvez une scène avec l’attribut Smooth Mesh Preview désactivé et une autre avec l’attribut activé.
Ensuite, ouvrez votre outil de visualisation de différence de fichier (diff ou Meld sous Linux, WinMerge sous Windows, FileMerge sous Mac).
En version ligne de commande, sous Linux, cela donne :
$ diff /home/narann/test.ma /home/narann/test2.ma
2,3c2,3
< //Name: test.ma
< //Last modified: Fri, Jul 09, 2017 21:13:45 PM
---
> //Name: test2.ma
> //Last modified: Fri, Jul 09, 2017 21:13:57 PM
75a76
> setAttr ".displaySmoothMesh" 2;
188c189
< // End of test.ma
---
> // End of test2.ma
Si on enlève les dates en début de fichier et la dernière ligne, on obtient :
> setAttr ".displaySmoothMesh" 2;
L’attribut s’appelle donc « displaySmoothMesh » et n’est pas un booléen mais un entier. :reflechi:
On ne va quand même pas s’arrêter ici vous ne croyez pas ? Vous n’avez pas envi de connaitre les valeurs possibles de cet attribut ? :dentcasse:
Vérifions son type :
import maya.cmds as mc
print mc.getAttr("pSphereShape1.displaySmoothMesh", type=True)
# enum
Donc c’est un enum. Pour récupérer la liste des valeurs possibles via un enum il faut utiliser la commande attributeQuery avec l’argument listEnum :
print mc.attributeQuery("displaySmoothMesh", node="pSphereShape1", listEnum=True)
# [u'Base Mesh Only:Base and Smooth Mesh:Smooth Mesh Only']
On a donc :
- Base Mesh Only (index 0)
- Base and Smooth Mesh (index 1)
- Smooth Mesh Only (index 2)
Bon, ça c’était cadeau, histoire de pousser le truc un peu plus loin mais l’idée de base, c’est de faire une différence entre les fichiers. :slow_clap: