Zoeken…


Zoek objecten op naam

Gebruik de opdrachten ls() om objecten op naam te vinden:

freds = cmds.ls("fred") 
#finds all objects in the scene named exactly 'fred', ie [u'fred', u'|group1|fred']

Gebruik * als jokerteken:

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 () accepteert meerdere filterreeksargumenten:

cmds.ls("fred", "barney") 
# [u'fred', u'|group1|barney']

Het kan ook een iterabel argument accepteren:

look_for = ['fred', 'barney']
# cmds.ls(look_for)
# [u'fred', u'|group1|barney']

Omgaan met ls () resultaten

Het gebruik van ls () als filter kan soms vreemde resultaten opleveren. Als u per ongeluk vergeet een filterargument door te geven en ls() zonder argumenten aanroept, krijgt u een lijst met alle knooppunten in de Maya-scène :

 cmds.ls()
 # [u'time1', u'sequenceManager1', u'hardwareRenderingGlobals', u'renderPartition'...] etc

Een veel voorkomende oorzaak hiervan is het gebruik van * args in ls() :

cmds.ls(["fred", "barney"]) # OK, returns ['fred', 'barney']
cmds.ls([]) # OK, returns [] 
cmds.ls(*[]) # not ok: returns all nodes!

Maya 2015 en eerder

In Maya 2015 en eerder retourneert een ls() -zoekopdracht die niets vindt None plaats van een lege lijst. In het geval dat het resultaat wordt gebruikt, kan dit leiden tot een uitzondering:

 for item in cmds.ls("don't_exist"):
     print item
 # Error: TypeError: file <maya console> line 1: 'NoneType' object is not iterable 

Het schoonste idioom om dit te omzeilen is altijd een alternatieve uitvoer toevoegen wanneer Geen wordt geretourneerd met toevoegen van or [] na een ls() -bewerking. Dat zorgt ervoor dat het rendement een lege lijst is in plaats van None :

 for item in cmds.ls("don't_exist") or []:
     print item
 # prints nothing since there's no result -- but no exception

Objecten zoeken op type

ls() is voorzien van een type vlag, waarmee u scène knooppunten van een bepaald type. Bijvoorbeeld:

 cameras = cmds.ls(type='camera')
 // [u'topShape', u'sideShape', u'perspShape', u'frontShape']

U kunt in hetzelfde gesprek naar meerdere typen zoeken:

 geometry = cmds.ls(type=('mesh', 'nurbsCurve', 'nurbsSurface'))

Je kunt ook zoeken naar 'abstracte' typen, die overeenkomen met de interne klassenhiërarchie van Maya. Gebruik de opdracht nodeType om erachter te komen welke knooppunttypen een bepaald object vertegenwoordigt:

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`

Gebruik ls () om te zien of er een object bestaat

Omdat ls() objecten op naam vindt, is het een handige manier om erachter te komen of een object in de scène aanwezig is. ls() met een lijst met objecten retourneert alleen de objecten die zich in de scène bevinden.

 available_characters = cmds.ls('fred', 'barney', 'wilma', 'dino')
 # available_characters will contain only the named characters that are present

Werken met componentenselecties

Bij het werken met componenten, zoals hoekpunten of uv-punten, retourneert Maya standaard een dubbelpunt gescheiden bereik in plaats van afzonderlijke items:

 print cmds.ls('pCube1.vtx[*]')  # get all the vertices in the cube
 # [u'pCube1.vtx[0:7]']

U kunt ls met de flatten om Maya te dwingen de bereiknotatie uit te breiden naar afzonderlijke componentitems:

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]']

Deze vorm is meestal beter bij het doorlussen, omdat u geen code hoeft te schrijven om een string zoals pCube1.vtx[0:7] in meerdere afzonderlijke items om te zetten.

U kunt ook hetzelfde resultaat krijgen met de opdracht filterExpand .

Veilig een enkel object van ls krijgen

Veel ls() -zoekopdrachten zijn bedoeld om één object te vinden, maar ls retourneert altijd een lijst (of, in oudere Maya's, één enkele None ). Dit zorgt voor gecompliceerde foutcontrole voor een eenvoudige vraag.

De eenvoudigste manier om onder alle omstandigheden een enkele waarde van een ls te krijgen, is

result = (cmds.ls('your query here') or [None])[0]

De or garandeert dat je minimaal een lijst krijgt met één None zodat je er altijd in kunt indexeren.

Merk op dat deze stijl je niet vertelt of je meer dan één resultaat hebt - het maakt het gewoon veilig om uit te gaan van een enkel resultaat.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow