Ricerca…


Trova gli oggetti per nome

Usa i comandi ls() per trovare gli oggetti per nome:

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

Usa * come carattere jolly:

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 () accetta più argomenti della stringa filtro:

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

Può anche accettare un argomento iterabile:

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

Trattare con risultati ls ()

L'uso di ls () come filtro a volte può fornire risultati strani. Se dimentichi accidentalmente di passare un argomento di filtro e chiama ls() senza argomenti, otterrai una lista di ogni nodo nella scena Maya :

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

Una causa comune di questo è l'utilizzo di * args all'interno di ls() :

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

Maya 2015 e precedenti

In Maya 2015 e precedenti, una query ls() che non trova nulla restituirà None invece di una lista vuota. In caso di utilizzo del risultato, può causare un'eccezione:

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

L'idioma più pulito per aggirare questo problema è sempre aggiungere un output alternativo quando viene restituito None or [] dopo un'operazione ls() . Ciò garantirà che il ritorno sia una lista vuota anziché None :

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

Trovare oggetti per tipo

ls() include un flag di type , che consente di trovare i nodi di scena di un particolare tipo. Per esempio:

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

Puoi cercare più tipi nella stessa chiamata:

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

Puoi anche cercare tipi "astratti", che corrispondono alla gerarchia di classi interne di Maya. Questi per scoprire quale tipo di nodo rappresenta un particolare oggetto, usa il comando 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`

Usando ls () per vedere se esiste un oggetto

Poiché ls() trova gli oggetti per nome, è un modo pratico per scoprire se un oggetto è presente nella scena. ls() con una lista di oggetti restituirà solo quelli che sono nella scena.

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

Lavorare con le selezioni dei componenti

Quando si lavora con componenti, come vertici o punti uv, il valore predefinito di Maya restituisce un intervallo separato da due punti anziché singoli elementi:

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

Puoi usare ls con l'opzione flatten per forzare Maya ad espandere la notazione degli intervalli in singole voci del componente:

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

Questa forma di solito è migliore durante il ciclo, poiché non hai scritto alcun codice per trasformare una stringa come pCube1.vtx[0:7] in più voci individuali.

Puoi anche ottenere lo stesso risultato usando il comando filterExpand .

Ottenendo in modo sicuro un singolo oggetto da ls

Molte query ls() hanno lo scopo di trovare un singolo oggetto, ma ls restituisce sempre un elenco (o, nei vecchi Maya, un singolo None ). Questo crea un complicato controllo degli errori per una semplice domanda.

Il modo più semplice per ottenere un singolo valore da una ls in qualsiasi circostanza è

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

Il or garantisce che come minimo si otterrà una lista contenente un singolo None modo da poter sempre indicizzare in esso.

Nota che questo stile non ti dirà se hai più di un risultato: è sufficiente assumere un singolo risultato.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow