Nettoyer sa scène, supprimer ses objets
Il est très utile de nettoyer ce que notre script a produit la fois précédente quand on le relance. La question est donc : comment supprimer tout ce que j'ai rajouté dans ma scène?
Pour cela plusieurs méthodes :
Méthode bourrin
On supprime tout, et on recommence :
cmds.file(newFile=True, force=True) # cree une nouvelle scene, reset complet
C'est très bien pour un script à la c*n… car simple et efficace, mais totalement à éviter pour un vrai script.
Méthode minutieuse
Si l'on connait les objets que l'on produit, et qu'il n'y en a pas 36.000, la méthode la plus efficace est de supprimer les objets nom par nom.
cmds.delete('objet1','monObjet3','tomate0')
A noter que cette technique peut tout a fait marcher, en la complexifiant, avec un grand nombre d'objets :
objList=[] # initialisation tableau for i in range(20) objName='monObjet'+str(i) cmds.polyCube(n=objName) objList.append(objName) #on ajoute son nom au tableau # on peut ensuite supprimer chaque objet en balançant directement le tableau cmds.delete(objList)
Méthode organisée
Bon, sans vouloir influencer, c'est ça qu'il faut utiliser. D'abord car cela oblige a organiser un minimum sa scène, ensuite car c'est simple et efficace.
Filtrer les noms
Lorsque vous créez un objet (cube, lumière…), faites précéder son nom d'un préfixe reconnaissable :
cmds.polyCube(n='tomate_polyCube') cmds.areaLight(n='tomate_maLumiere1')
Ensuite, au moment de supprimer tout ça, il ne nous reste plus qu'à filtrer les objets existants selon leur nom, et supprimer :
list = cmds.ls('tomate_*') # liste de tous les objets dont le nom commence par "tomate_" cmds.delete(list) # suppression de tous les objets de la liste
Pas la peine de faire une boucle “for ob in list”, la fonction delete comprends très bien si on lui envoie une liste.
Toutefois cette technique, en l'état, peut amener à des erreurs (suppression objet/shape).
Grouper
L'autre manière de faire est de placer tous ses objets (précédés de 'tomate_'… ou autre préfixe) dans un groupe. La suppression de ce groupe assure un nettoyage en règle.
Pour grouper ses objets, on n'a qu'à donner la liste préalablement construite à la fonction group :
cmds.group(list, name='tomateGroup')
Ainsi, au moment de supprimer, il ne reste qu'à supprimer le groupe :
cmds.delete('tomateGroup')
Exemple de nettoyage
Voila un code mettant en œuvre ce que l'on a vu au-dessus :
import maya.cmds as cmds # vérifie existence du groupe existe = cmds.objExists('tomateGroup') # si il existe on le supprime if existe : cmds.delete('tomateGroup') # creation des objets for i in range(30) : cmds.polyCube(name = 'tomate_cube') # creation de cubes cmds.move(0,i*2,0) # on les empile cmds.spotLight(name = 'tomate_spot') # creation de spots lights cmds.move(0,i*2,-2) # on les place en face des cubes # liste de tous mes objets liste = cmds.ls('tomate_*') # groupement de tous mes objets cmds.group(liste, name = 'tomateGroup')
Ainsi à la première exécution du code les objets sont placés dans un groupe. Aux exécutions suivantes le groupe est supprimé (avec tous les objets qu'il contient), et un nouveau est créé.
Exemple poussé : fonction de nettoyage
Ce que l'on a mis en œuvre précédemment pourrait tout à fait nous servir pour un bouton “Supprimer les objets” par exemple. Transformer notre bloc d'instruction nettoyant la scène en fonction permet de s'en servir à cet effet.
{go} Voir explication des fonctions
On met notre bloc d'instructions précédent dans une fonction, avec un argument pour le nom du groupe a supprimer :
def deleteGroup(name) : '''Supprime un groupe''' if cmds.objExists(name) : cmds.delete(name)
(Le code a été condensé, faire une variable pour la réutiliser seulement une ligne plus tard est inutile si l'on comprend ce que cela fait)
On crée une fenêtre avec un bouton appelant notre fonction, avec le nom du groupe à supprimer :
cmds.window() cmds.columnLayout() cmds.button(label = 'Supprimer les objets', command = 'deleteGroup(name = "tomateGroup")') cmds.showWindow()
L'ensemble du script :
import maya.cmds as cmds def deleteGroup(name) : '''Supprime un groupe''' if cmds.objExists(name) : cmds.delete(name) #suppression du groupe au lancement du script deleteGroup('tomateGroup') # creation des objets for i in range(10) : cmds.polyCube(name = 'tomate_cube') # creation de cubes cmds.move(0,i*2,0) # on les empile cmds.spotLight(name = 'tomate_spot') # creation de spots lights cmds.move(0,i*2,4) # on les place en face des cubes # liste de tous mes objets liste = cmds.ls('tomate_*') # groupement de tous mes objets cmds.group(liste, name = 'tomateGroup') # creation de la fenetre cmds.window() cmds.columnLayout() cmds.button(label = 'Supprimer les objets', command = 'deleteGroup(name = "tomateGroup")') cmds.showWindow()
De la même manière on peut mettre le bloc d'instruction listant les objets dans une fonction, la création de la fenêtre dans une fonction, etc…
Si vous avez des questions, des remarques, des suggestions, n'hésitez pas à m'en faire part.
~~DISCUSSION~~