Szukaj…


Znajdź obiekty według nazwy

Użyj poleceń ls() , aby znaleźć obiekty według nazwy:

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

Użyj * jako symbolu wieloznacznego:

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 () przyjmuje wiele argumentów ciągu filtrów:

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

Może również zaakceptować iterowalny argument:

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

Radzenie sobie z wynikami ls ()

Użycie ls () jako filtra może czasem dać dziwne wyniki. Jeśli przypadkowo zapomnisz przekazać argument filtru i wywołasz ls() bez argumentów, otrzymasz listę każdego węzła w scenie Maya :

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

Typową przyczyną tego jest używanie * args wewnątrz ls() :

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

Maya 2015 i wcześniejsze

W Maya 2015 i wcześniejszych kwerenda ls() która niczego nie znajdzie, nie zwróci None zamiast pustej listy. W przypadku użycia wyniku może dojść do wyjątku:

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

Najczystszym idiomem do obejścia tego jest zawsze dodawanie alternatywnych danych wyjściowych, gdy Brak zwraca wartość dodawania or [] po operacji ls() . Dzięki temu zwracana będzie pusta lista, a nie None :

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

Znajdowanie obiektów według typu

ls() zawiera flagę type , która pozwala znaleźć węzły scen określonego typu. Na przykład:

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

Możesz wyszukać wiele typów w tym samym połączeniu:

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

Możesz także wyszukiwać typy „abstrakcyjne”, które odpowiadają wewnętrznej hierarchii klas Mayi. Aby dowiedzieć się, jakie typy węzłów reprezentuje dany obiekt, użyj polecenia 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`

Za pomocą ls () sprawdź, czy istnieje obiekt

Ponieważ ls() znajduje obiekty według nazw, jest to wygodny sposób na sprawdzenie, czy obiekt jest obecny na scenie. ls() z listą obiektów zwróci tylko te, które są w scenie.

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

Praca z zaznaczeniami komponentów

Podczas pracy z komponentami, takimi jak wierzchołki lub punkty UV, Maya domyślnie zwraca zakres rozdzielany dwukropkami zamiast pojedynczych elementów:

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

Możesz użyć ls z opcją flatten , aby zmusić Mayę do rozszerzenia zapisu zakresu na poszczególne wpisy komponentu:

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

Ta forma jest zwykle lepsza podczas zapętlania, ponieważ nie masz żadnego kodu, aby zamienić ciąg taki jak pCube1.vtx[0:7] na wiele pojedynczych pozycji.

Ten sam wynik można również uzyskać za pomocą polecenia filterExpand .

Bezpieczne uzyskanie pojedynczego obiektu od ls

Wiele zapytań ls() ma na celu znalezienie pojedynczego obiektu, ale ls zawsze zwraca listę (lub, w starszych Mayas, pojedynczy None ). Powoduje to skomplikowane sprawdzanie błędów w przypadku prostego pytania.

Najłatwiejszym sposobem uzyskania pojedynczej wartości z ls w każdych okolicznościach jest

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

or gwarantuje, że przynajmniej otrzymasz listę zawierającą pojedynczy None więc zawsze możesz się do niej indeksować.

Pamiętaj, że ten styl nie powie ci, czy masz więcej niż jeden wynik - po prostu bezpiecznie jest założyć pojedynczy wynik.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow