maya
Szenenobjekte finden
Suche…
Objekte nach Namen suchen
Verwenden Sie die Befehle ls() , um Objekte anhand des Namens zu suchen:
freds = cmds.ls("fred")
#finds all objects in the scene named exactly 'fred', ie [u'fred', u'|group1|fred']
Verwenden Sie * als Platzhalter:
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 () akzeptiert mehrere Filterstringargumente:
cmds.ls("fred", "barney")
# [u'fred', u'|group1|barney']
Es kann auch ein iterierbares Argument akzeptieren:
look_for = ['fred', 'barney']
# cmds.ls(look_for)
# [u'fred', u'|group1|barney']
Umgang mit ls () Ergebnissen
Die Verwendung von ls () als Filter kann manchmal zu ungeraden Ergebnissen führen. Wenn Sie versehentlich vergessen, ein Filterargument zu übergeben und ls() ohne Argumente aufzurufen, erhalten Sie eine Liste aller Knoten in der Mayaszene :
cmds.ls()
# [u'time1', u'sequenceManager1', u'hardwareRenderingGlobals', u'renderPartition'...] etc
Eine häufige Ursache hierfür ist die Verwendung von * args in ls() :
cmds.ls(["fred", "barney"]) # OK, returns ['fred', 'barney']
cmds.ls([]) # OK, returns []
cmds.ls(*[]) # not ok: returns all nodes!
Maya 2015 und früher
In Maya 2015 und früheren ls() gibt eine ls() Abfrage, die nichts findet, None leere Liste zurück. Bei Verwendung des Ergebnisses kann es zu einer Ausnahme kommen:
for item in cmds.ls("don't_exist"):
print item
# Error: TypeError: file <maya console> line 1: 'NoneType' object is not iterable
Das sauberste Idiom für die Umgehung dieses Problems ist immer das Hinzufügen einer alternativen Ausgabe, wenn None nach einem ls() Vorgang addiert wird or [] Dadurch wird sichergestellt, dass die Rückgabe eine leere Liste und None .
for item in cmds.ls("don't_exist") or []:
print item
# prints nothing since there's no result -- but no exception
Objekte nach Typ suchen
ls() enthält ein type Flag, mit dem Sie Szenenknoten eines bestimmten Typs finden können. Zum Beispiel:
cameras = cmds.ls(type='camera')
// [u'topShape', u'sideShape', u'perspShape', u'frontShape']
Sie können im selben Anruf nach mehreren Typen suchen:
geometry = cmds.ls(type=('mesh', 'nurbsCurve', 'nurbsSurface'))
Sie können auch nach "abstrakten" Typen suchen, die der internen Klassenhierarchie von Maya entsprechen. nodeType herauszufinden, welche Knotentypen ein bestimmtes Objekt darstellt, verwenden Sie den Befehl 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`
Verwenden Sie ls (), um festzustellen, ob ein Objekt vorhanden ist
Da ls() Objekte anhand von Namen findet, ist es eine praktische Methode, um herauszufinden, ob ein Objekt in der Szene vorhanden ist. ls() mit einer Liste von Objekten gibt nur die Objekte zurück, die sich in der Szene befinden.
available_characters = cmds.ls('fred', 'barney', 'wilma', 'dino')
# available_characters will contain only the named characters that are present
Arbeiten mit Komponentenauswahlen
Bei der Arbeit mit Komponenten, wie z. B. Scheitelpunkten oder UV-Punkten, gibt Maya standardmäßig einen durch Doppelpunkte getrennten Bereich zurück und nicht einzelne Elemente:
print cmds.ls('pCube1.vtx[*]') # get all the vertices in the cube
# [u'pCube1.vtx[0:7]']
Sie können ls mit der flatten , um Maya zu zwingen, die Bereichsnotation in einzelne Komponenteneinträge zu erweitern:
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]']
Diese Form ist beim Schleifen normalerweise besser, da Sie keinen Code schreiben müssen, um einen String wie pCube1.vtx[0:7] in mehrere einzelne Einträge pCube1.vtx[0:7] .
Sie können das gleiche Ergebnis auch mit dem Befehl filterExpand .
Sicheres Erhalten eines einzelnen Objekts von ls
Viele ls() Abfragen sollen ein einzelnes Objekt finden, aber ls immer eine Liste zurück (oder in älteren Mayas ein None ). Dies führt zu einer komplizierten Fehlerprüfung für eine einfache Frage.
Der einfachste Weg, um einen einzigen Wert aus einem ls unter allen Umständen zu erhalten, ist
result = (cmds.ls('your query here') or [None])[0]
Das or garantiert, dass Sie mindestens eine Liste mit einem None sodass Sie immer einen Index erstellen können.
Beachten Sie, dass dieser Stil Ihnen nicht sagt, wenn Sie mehr als ein Ergebnis haben - es macht es einfach, ein einzelnes Ergebnis anzunehmen.