Différences

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Dernière révision Les deux révisions suivantes
articles:mel-python:nettoyage [2010/05/02 16:43]
nico Links to travaux:processing changed to travaux:processing_boids
articles:mel-python:nettoyage [2010/05/05 19:17]
nico Links to scriptspython changed to admin:scriptspython
Ligne 1: Ligne 1:
 +======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 :
 +<code python>
 +cmds.file(newFile=True,​ force=True) # cree une nouvelle scene, reset complet
 +</​code>​
 +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.
 +<code python>
 +cmds.delete('​objet1','​monObjet3','​tomate0'​)
 +</​code>​
 +
 +A noter que cette technique peut tout a fait marcher, en la complexifiant,​ avec un grand nombre d'​objets :
 +<code python>
 +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)
 +</​code>​
 +
 +=====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 :
 +<code python>
 +cmds.polyCube(n='​tomate_polyCube'​)
 +cmds.areaLight(n='​tomate_maLumiere1'​)
 +</​code>​
 +
 +Ensuite, au moment de supprimer tout ça, il ne nous reste plus qu'à filtrer les objets existants selon leur nom, et supprimer :
 +<code python>
 +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
 +</​code>​
 +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 :
 +<code python>
 +cmds.group(list,​ name='​tomateGroup'​)
 +</​code>​
 +
 +Ainsi, au moment de supprimer, il ne reste qu'à supprimer le groupe :
 +<code python>
 +cmds.delete('​tomateGroup'​)
 +</​code>​
 +
 +====Exemple de nettoyage====
 +Voila un code mettant en œuvre ce que l'on a vu au-dessus :
 +<code python>
 +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'​)
 +</​code>​
 +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} [[l3:​mel_python:​instructions_composees#​Les fonctions|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 :
 +<code python>
 +def deleteGroup(name) :
 + '''​Supprime un groupe'''​
 + if cmds.objExists(name) :
 + cmds.delete(name)
 +</​code>​
 +(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 :
 +<code python>
 +cmds.window()
 +cmds.columnLayout()
 +cmds.button(label = '​Supprimer les objets',​ command = '​deleteGroup(name = "​tomateGroup"​)'​)
 +cmds.showWindow()
 +</​code>​
 +
 +L'​ensemble du script :
 +<code python>
 +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()
 +</​code>​
 +
 +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~~