Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
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/31 02:09] nico Links to articles:mel-python:annexes:operateurs changed to articles:mel-python:operateurs |
||
---|---|---|---|
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~~ |