Nettoyer sa scène, supprimer ses objets

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 :

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.

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)

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~~