maya
Recherche d'objets de scène
Recherche…
Rechercher des objets par nom
Utilisez les commandes ls() pour rechercher des objets par nom:
freds = cmds.ls("fred")
#finds all objects in the scene named exactly 'fred', ie [u'fred', u'|group1|fred']
Utilisez * comme joker:
freds = cmds.ls("fred*")
# finds all objects whose name starts with 'fred'
# [u'fred', u'frederick', u'fred2']
has_fred = cmds.ls("*fred*")
# [u'fred', u'alfred', u'fredericka']
ls () prend plusieurs arguments de chaîne de filtrage:
cmds.ls("fred", "barney")
# [u'fred', u'|group1|barney']
Il peut aussi accepter un argument itérable:
look_for = ['fred', 'barney']
# cmds.ls(look_for)
# [u'fred', u'|group1|barney']
Traiter les résultats de ls ()
L'utilisation de ls () comme filtre peut parfois fournir des résultats impairs. Si vous oubliez accidentellement de passer un argument de filtre et appelez ls() sans argument, vous obtiendrez une liste de tous les nœuds de la scène Maya :
cmds.ls()
# [u'time1', u'sequenceManager1', u'hardwareRenderingGlobals', u'renderPartition'...] etc
Une cause fréquente de ceci est d'utiliser * args dans ls() :
cmds.ls(["fred", "barney"]) # OK, returns ['fred', 'barney']
cmds.ls([]) # OK, returns []
cmds.ls(*[]) # not ok: returns all nodes!
Maya 2015 et plus tôt
Dans Maya 2015 et les ls() antérieures, une requête ls() qui ne trouve rien retournera None au lieu d'une liste vide. En cas d'utilisation du résultat, il peut en résulter une exception:
for item in cmds.ls("don't_exist"):
print item
# Error: TypeError: file <maya console> line 1: 'NoneType' object is not iterable
L'idiome le plus propre pour contourner ce problème consiste toujours à ajouter une sortie alternative lorsque Aucun est renvoyé en ajoutant or [] après une opération ls() . Cela garantira que le retour est une liste vide plutôt que None :
for item in cmds.ls("don't_exist") or []:
print item
# prints nothing since there's no result -- but no exception
Recherche d'objets par type
ls() inclut un indicateur de type qui vous permet de trouver des nœuds de scène d'un type particulier. Par exemple:
cameras = cmds.ls(type='camera')
// [u'topShape', u'sideShape', u'perspShape', u'frontShape']
Vous pouvez rechercher plusieurs types dans le même appel:
geometry = cmds.ls(type=('mesh', 'nurbsCurve', 'nurbsSurface'))
Vous pouvez également rechercher des types «abstraits», qui correspondent à la hiérarchie de classes interne de Maya. Celles-ci pour savoir quels types de nœuds un objet particulier représente, utilisez la commande nodeType :
cmds.nodeType('pCubeShape1', i=True) # 'i' includes the inherited object types
// Result: [u'containerBase',
u'entity',
u'dagNode',
u'shape',
u'geometryShape',
u'deformableShape',
u'controlPoint',
u'surfaceShape',
u'mesh'] //
# in this example, ls with any of the above types will return `pCubeShape1`
Utiliser ls () pour voir si un objet existe
Comme ls() trouve des objets par noms, c’est un moyen pratique de savoir si un objet est présent dans la scène. ls() avec une liste d'objets ne renverra que ceux qui sont dans la scène.
available_characters = cmds.ls('fred', 'barney', 'wilma', 'dino')
# available_characters will contain only the named characters that are present
Travailler avec des sélections de composants
Lorsque vous utilisez des composants, tels que des sommets ou des points UV, Maya renvoie par défaut une plage séparée par des deux-points plutôt que des éléments individuels:
print cmds.ls('pCube1.vtx[*]') # get all the vertices in the cube
# [u'pCube1.vtx[0:7]']
Vous pouvez utiliser ls avec l'option flatten pour forcer Maya à étendre la notation de la plage en entrées de composant individuelles:
expanded = cmds.ls('pCube1.vtx[*]', flatten=True)
print expanded
# [u'pCube1.vtx[0]', u'pCube1.vtx[1]', u'pCube1.vtx[2]', u'pCube1.vtx[3]', u'pCube1.vtx[4]', u'pCube1.vtx[5]', u'pCube1.vtx[6]', u'pCube1.vtx[7]']
Cette forme est généralement meilleure en boucle, car vous n'avez pas écrit de code pour transformer une chaîne comme pCube1.vtx[0:7] en plusieurs entrées individuelles.
Vous pouvez également obtenir le même résultat en utilisant la commande filterExpand .
Obtenir en toute sécurité un seul objet de ls
Beaucoup de ls() requêtes sont destinées à trouver un seul objet, mais ls renvoie toujours une liste (ou, plus âgés, un Mayas seul None ). Cela crée une vérification compliquée des erreurs pour une question simple.
Le moyen le plus simple d’obtenir une valeur unique à partir de ls est de
result = (cmds.ls('your query here') or [None])[0]
Le or garantit au minimum que vous obtiendrez une liste contenant un seul None de sorte que vous pouvez toujours les indexer.
Notez que ce style ne vous dira pas si vous avez plus d'un résultat - cela permet simplement de supposer un seul résultat.