maya
Hitta scenobjekt
Sök…
Hitta objekt efter namn
Använd kommandona ls() att hitta objekt efter namn:
freds = cmds.ls("fred")
#finds all objects in the scene named exactly 'fred', ie [u'fred', u'|group1|fred']
Använd * som jokertecken:
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 () tar flera filtersträngargument:
cmds.ls("fred", "barney")
# [u'fred', u'|group1|barney']
Det kan också acceptera ett iterable argument:
look_for = ['fred', 'barney']
# cmds.ls(look_for)
# [u'fred', u'|group1|barney']
Att hantera ls () resultat
Att använda ls () som filter kan ibland ge utda resultat. Om du av misstag glömmer att skicka ett filterargument och ringa ls() utan argument, får du en lista över varje nod i Maya-scenen :
cmds.ls()
# [u'time1', u'sequenceManager1', u'hardwareRenderingGlobals', u'renderPartition'...] etc
En vanlig orsak till detta är att använda * args inuti ls() :
cmds.ls(["fred", "barney"]) # OK, returns ['fred', 'barney']
cmds.ls([]) # OK, returns []
cmds.ls(*[]) # not ok: returns all nodes!
Maya 2015 och tidigare
I Maya 2015 och tidigare kommer en fråga med ls() som inte hittar ingenting att returnera None istället för en tom lista. Om du använder resultatet kan det resultera i ett undantag:
for item in cmds.ls("don't_exist"):
print item
# Error: TypeError: file <maya console> line 1: 'NoneType' object is not iterable
Det renaste formspråket för att arbeta runt detta är att alltid lägga till en alternativ utgång när Ingen återlämnas or [] läggs till or [] efter en ls() -operation. Det kommer att säkerställa att returen är en tom lista snarare än None :
for item in cmds.ls("don't_exist") or []:
print item
# prints nothing since there's no result -- but no exception
Hitta objekt efter typ
ls() innehåller en type flagga, som låter dig hitta scen noder av en viss typ. Till exempel:
cameras = cmds.ls(type='camera')
// [u'topShape', u'sideShape', u'perspShape', u'frontShape']
Du kan söka efter flera typer i samma samtal:
geometry = cmds.ls(type=('mesh', 'nurbsCurve', 'nurbsSurface'))
Du kan också söka efter "abstrakta" typer, som motsvarar Mayas interna klasshierarki. Dessa för att ta reda på vilka nodtyper ett visst objekt representerar, använd kommandot 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`
Använd ls () för att se om ett objekt finns
Eftersom ls() hittar objekt efter namn är det ett praktiskt sätt att ta reda på om ett objekt finns i scenen. ls() med en lista med objekt returnerar bara de som finns i scenen.
available_characters = cmds.ls('fred', 'barney', 'wilma', 'dino')
# available_characters will contain only the named characters that are present
Arbeta med komponentval
När man arbetar med komponenter, såsom toppar eller uv-punkter, försöker Maya att returnera ett kolonseparerat område snarare än enskilda objekt:
print cmds.ls('pCube1.vtx[*]') # get all the vertices in the cube
# [u'pCube1.vtx[0:7]']
Du kan använda ls med flatten att tvinga Maya att expandera intervallnotationen till enskilda komponentposter:
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]']
Den här formen är vanligtvis bättre när du slingar, eftersom du inte har skriva någon kod för att förvandla en sträng som pCube1.vtx[0:7] till flera enskilda poster.
Du kan också få samma resultat med kommandot filterExpand .
Få ett enkelt objekt från ls
Många ls() -frågor är avsedda att hitta ett enda objekt, men ls returnerar alltid en lista (eller, i äldre Mayas, en enda None ). Detta skapar komplicerad felkontroll för en enkel fråga.
Det enklaste sättet att få ett enskilt värde från ett ls under alla omständigheter är
result = (cmds.ls('your query here') or [None])[0]
Den or garanterar att åtminstone du får en lista som innehåller en enda None så kan du alltid index i den.
Observera att den här stilen inte kommer att berätta om du har mer än ett resultat - det gör det bara säkert att anta ett enda resultat.