Ceci est une ancienne révision du document !


A PCRE internal error occured. This might be caused by a faulty plugin

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