maya
Tworzenie interfejsu użytkownika Maya
Szukaj…
Parametry
| parametr | Detale |
|---|---|
| e / edycja | informuje Mayę, że chcesz zmienić wartość istniejącej nieruchomości |
| q / zapytanie | informuje Mayę, że chcesz uzyskać wartość istniejącej nieruchomości |
Uwagi
Maya jest dostarczana z dość kompletnym zestawem narzędzi interfejsu użytkownika, który obejmuje okna, układy i różne elementy sterujące. Jest to implementowane przy użyciu frameworka QT w C ++, ale udostępniane użytkownikom MEL i Python za pomocą domyślnego zestawu komend Maya.
QT
Zaawansowani użytkownicy mogą rozszerzyć interfejs Maya za pomocą C ++ lub Python. Wersje Maya od 2012 do 2016 używają Pyside i QT4; Maya 2017 używa Pyside2 i QT5. Więcej informacji tutaj
Uwaga: starsze odwołania w sieci odnoszą się do zestawu narzędzi interfejsu GUI Maya jako „ELF”; to wciąż poprawna nazwa, ale jest rzadko używana.
Przykład podstawowego interfejsu użytkownika [Python]
Zestaw narzędzi Maya GUI tworzy różnorodne elementy interfejsu użytkownika w prostej, bezwzględnej formie. Istnieją podstawowe polecenia do tworzenia i edycji widżetów GUI; widżety są identyfikowane unikalną nazwą ciągu.
Wszystkie polecenia GUI mają tę samą podstawową formę: podajesz typ polecenia i nazwę ciągu obiektu, nad którym chcesz pracować lub utworzyć, wraz z flagami określającymi wygląd lub zachowanie widgetu. Na przykład, aby utworzyć przycisk, którego użyjesz:
cmds.button('my_button', label = 'my label')
Spowoduje to utworzenie nowego przycisku GUI. Aby edytować przycisk, użyj tego samego polecenia z flagą edit (krótka wersja to tylko e ). Aby zmienić etykietę przycisku w następujący sposób:
cmds.button('my_button', e=True, label = 'a different label')
i możesz zapytać o bieżącą wartość właściwości za pomocą query lub flagi q :
cmds.button(`my button`, q=True, label=True)
# 'a different label'
Nazewnictwo widżetów
Podczas tworzenia nowego widżetu za pomocą polecenia interfejsu użytkownika możesz podać nazwę, którą ma otrzymać nowy widżet. Jednak nie jest to gwarantowane: Maya nada przyciskowi nazwę, o którą prosiłeś - jeśli nadasz mu znak, którego nie rozpoznaje lub jeśli istnieje już widżet o tej samej nazwie, możesz otrzymać inną nazwę. Zawsze dobrą praktyką jest przechwytywanie nazwy nowego widżetu podczas jego tworzenia, aby uniknąć niespodzianek:
my_button = cmds.button('my_button')
cmds.button(my_button, e=True, label = "a new label")
Funkcje oddzwaniania
Wiele widżetów obejmuje zdarzenia, które mogą wywoływać funkcje oddzwaniania, gdy użytkownik wchodzi w interakcję z widżetem. Na przykład po naciśnięciu przycisku, zaznaczeniu pola wyboru lub wybraniu menu rozwijanego można uruchomić funkcję.
Dokładna flaga powiązana z tym zdarzeniem zależy od widżetu, ale typowe wywołanie zwrotne wyglądałoby tak:
def callback_fn(_ignore):
print "button pressed"
button = cmds.button(label='press me', command = callback_fn)
Naciśnięcie przycisku spowoduje wydrukowanie „naciśniętego przycisku” w oknie słuchacza. Większość widgetów wysyła niektóre argumenty, gdy aktywują się ich wywołania zwrotne - na przykład button zawsze zawiera wartość logiczną - więc musisz upewnić się, że moduł obsługi wywołania zwrotnego ma odpowiednią sygnaturę, aby pasował do używanego widżetu. Dlatego callback_fn() pobiera argument, nawet jeśli go nie potrzebuje.
Przypisanie oddzwaniania
Maya obsługuje dwa różne sposoby dołączania funkcji oddzwaniania:
# this works, but is not a great idea
cmds.button(label = 'string reference', command = 'string_name_of_function')
# use this form whenever possible
cmds.button(label = 'direct function reference', command = callback_fn)
W pierwszym przykładzie wywołanie zwrotne jest przypisywane przez wartość ciągu. Maya znajdzie wywołanie zwrotne w globalnym zakresie Python - do którego zwykle trudno jest uzyskać dostęp, pisząc odpowiednio zorganizowany kod. Wywołania zwrotne nazw łańcuchowych są również wolniejsze do rozwiązania. Drugi przykład przekazuje rzeczywistą funkcję Pythona do wywołania zwrotnego - ta forma jest preferowana, ponieważ jest szybsza, a jeśli nie dostarczysz prawidłowej funkcji do funkcji wywołania zwrotnego, będziesz wiedzieć, kiedy tworzony jest interfejs użytkownika, a nie kiedy Widżety interfejsu użytkownika są faktycznie używane.
Jeśli chcesz przekazać wartość argumentu do funkcji zwrotnej, możesz użyć argumentów lambda , zamknięcia lub funools.partial powiązania z wywołaniem zwrotnym.
Przy użyciu partial :
from functools import partial
....
def callback_fn(myValue, _ignore): # _ignore swallows the original button argument
print myValue
button = cmds.button(label='press me', command = partial(callback_fn, "fooo"))
Za pomocą lambda :
def callback_fn(myValue):
print myValue
button = cmds.button(label='press me', command = lambda _ignore: callback_fn("fooo"))
# here the lambda needs to handle the button argument
Korzystanie z zamknięć
b = cmds.button(label = 'press me')
# by defining this function when `b` exists, we can use it later
# without storing it explicitly
def get_button_label(*_):
print "label of button", b, " is ", cmds.button(b, q=True, l=True)
cmds.button(b, e=True, c=get_button_label)
Więcej informacji na temat ciągów nazw wywołań zwrotnych vs. funkcji wywołania zwrotnego tutaj
Tworzenie okna
# create a window with a button that closes the window when clicked
window = cmds.window(title='example window') # create the window
layout = cmds.columnLayout(adjustableColumn=True) # add a vertical layout
def close_window(*_):
cmds.deleteUI(window) # deletes the window above
button = cmds.button(label= 'press to close", command = close_window)
# show the window
cmds.showWindow(window)
Lambdy i pętle
Lambda to przydatny skrót do łączenia zachowań z elementami GUI.
b = cmds.button("make a cube", command = lambda _: cmds.polyCube())
Jednak ze względu na sposób, w jaki Python przechwytuje zmienne wewnątrz lambdas, możesz uzyskać nieoczekiwane wyniki, jeśli powiążesz polecenia przy użyciu lambdas wewnątrz pętli. Na przykład wygląda na to, że powinien tworzyć przyciski, które tworzą kule o różnych rozmiarach:
# warning: doesn't work like it looks!
for n in range(5):
b = cmds.button("sphere size %i" % n, command = lambda _: cmds.polySphere(radius=n))
Przyciski zostaną poprawnie oznaczone, ale wszystkie będą miały ten sam promień (4), ponieważ wszystkie lambda przechwycą tę wartość po zamknięciu pętli. TLDR: Jeśli generujesz wywołania zwrotne w pętli, użyj funkcji functools.partial lub innej metody do przechwytywania wartości - lambda nie działają dla tej aplikacji. Zobacz tutaj po więcej szczegółów