maya
Encontrar objetos de escena
Buscar..
Encuentra objetos por nombre
Use los comandos ls() para encontrar objetos por nombre:
freds = cmds.ls("fred")
#finds all objects in the scene named exactly 'fred', ie [u'fred', u'|group1|fred']
Use * como un comodín:
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 () toma múltiples argumentos de cadena de filtro:
cmds.ls("fred", "barney")
# [u'fred', u'|group1|barney']
También puede aceptar un argumento iterable:
look_for = ['fred', 'barney']
# cmds.ls(look_for)
# [u'fred', u'|group1|barney']
Tratando con ls () resultados
El uso de ls () como filtro a veces puede proporcionar resultados impares. Si accidentalmente olvida pasar un argumento de filtro y llama a ls() sin argumentos, obtendrá una lista de cada nodo en la escena Maya :
cmds.ls()
# [u'time1', u'sequenceManager1', u'hardwareRenderingGlobals', u'renderPartition'...] etc
Una causa común de esto es usar * args dentro de ls() :
cmds.ls(["fred", "barney"]) # OK, returns ['fred', 'barney']
cmds.ls([]) # OK, returns []
cmds.ls(*[]) # not ok: returns all nodes!
Maya 2015 y anteriores
En Maya 2015 y anteriores, una consulta ls() que no encuentra nada devolverá None lugar de una lista vacía. En caso de usar el resultado, puede resultar en una excepción:
for item in cmds.ls("don't_exist"):
print item
# Error: TypeError: file <maya console> line 1: 'NoneType' object is not iterable
El lenguaje más limpio para solucionar esto siempre es agregar una salida alternativa cuando se devuelve Ninguno agregando or [] después de una operación ls() . Eso asegurará que la devolución sea una lista vacía en lugar de None :
for item in cmds.ls("don't_exist") or []:
print item
# prints nothing since there's no result -- but no exception
Encontrar objetos por tipo
ls() incluye un indicador de type , que le permite encontrar nodos de escena de un tipo en particular. Por ejemplo:
cameras = cmds.ls(type='camera')
// [u'topShape', u'sideShape', u'perspShape', u'frontShape']
Puede buscar varios tipos en la misma llamada:
geometry = cmds.ls(type=('mesh', 'nurbsCurve', 'nurbsSurface'))
También puede buscar tipos "abstractos", que correspondan a la jerarquía interna de clases de Maya. Para averiguar qué tipos de nodo representa un objeto en particular, use el 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 () para ver si un objeto existe
Como ls() encuentra los objetos por sus nombres, es una forma útil de averiguar si un objeto está presente en la escena. ls() con una lista de objetos solo devolverá los que están en la escena.
available_characters = cmds.ls('fred', 'barney', 'wilma', 'dino')
# available_characters will contain only the named characters that are present
Trabajar con selecciones de componentes
Cuando se trabaja con componentes, como vértices o puntos uv, Maya devuelve un rango separado por dos puntos en lugar de elementos individuales:
print cmds.ls('pCube1.vtx[*]') # get all the vertices in the cube
# [u'pCube1.vtx[0:7]']
Puede usar ls con la opción flatten para forzar a Maya a expandir la notación de rango en entradas de componentes individuales:
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]']
Esta forma suele ser mejor cuando se realiza un bucle, ya que no tiene que escribir ningún código para convertir una cadena como pCube1.vtx[0:7] en varias entradas individuales.
También puede obtener el mismo resultado utilizando el comando filterExpand .
Obtención segura de un solo objeto desde ls.
Muchos ls() consultas están destinadas a encontrar un solo objeto, pero ls siempre devuelve una lista (o, en mayas más antiguos, un único None ). Esto crea una comprobación de errores complicada para una pregunta simple.
La forma más fácil de obtener un valor único de un ls bajo cualquier circunstancia es
result = (cmds.ls('your query here') or [None])[0]
El or garantiza que, como mínimo, obtendrá una lista que contenga una sola None para que siempre pueda indexarla.
Tenga en cuenta que este estilo no le dirá si tiene más de un resultado, solo hace que sea seguro asumir un solo resultado.