maya
Znajdowanie obiektów sceny
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.