Tworzymy skrypt do szybkiego przygotowania do pracy w Maya

Oszczędzamy czas i uczymy się czegoś nowego

Pan Animator napisał 8 sierpnia 2025 | AnimacjaMaya

No czołem!
Tak sobie usiadłem i pomyślałem, że chyba warto podzielić się trikiem, który może oszczędzić Wam czasu przynajmniej raz dziennie – a raczej przy każdym odpaleniu Maya. Chodzi mi o wczytanie poprzez skrypt wszystkich Waszych ulubionych ustawień z różnych części programu jednym kliknięciem!

Ale jakich ustawień zapytacie..

No przejdź sobie tak w głowie co robisz po każdorazowym odpaleniu Maya.
Wybierasz swój ulubiony workspace, pewnie zmieniasz ustawienia viewport. A jak masz ich kilka (jak ja!), to się zacznie zabawa. Jeden viewport powinien mieć inne ustawienia, inną kamerę, drugi jeszcze co innego. A co to się stało – Timeslider jest nagle mniejszy niż tak jak lubisz? Graph Editor nie wczytuje Twoich ustawień?
Odpalasz czyjąś scenę, a tam zapisane jeszcze inne ustawienia – to co, na nowo ustawiasz!
PAAANIE! DAJ PAN SPOKÓJ!
Kto ma czas i nerwy na takie ustawianie! Codziennie. Kilka razy minimum! Bo Maya lubi się wywalić.

„Jeden przycisk, by wszystkimi rządzić…”

Teraz zapnij pasy! To wszystko co wspomniałem można zrobić jednym kliknięciem!
I z ratunkiem przyjdzie nasz dobry przyjaciel Python.

Czyli język programowania (pewnie to już wiesz), który skryptem wykona za nas te wszystkie czynności.
No i tak – w czasach kumpla ChatGPT kodowanie może wydawać się to prostsze niż jest, ale jednak dobrze jest wiedzieć co się robi. Bo gdy kod się wysypie to AI może już nie rozwiązać problemów.
Dlatego pozwólcie, że na podstawy tej naszej pogawędki użyję klasycznego… MANUAL MAYA!!

Maya? Help?

Wiem, zazwyczaj instrukcji się nie czyta, ale tu zróbcie wyjątek. Jeżeli jeszcze – chociażby – nie przewertowaliście wszystkiego (nawet jakieś nudy), to jednak bardzo polecam. Skill rośnie aż miło!
Wracając – manual użyjemy do ogarnięcia co dane komendy robią. A i w odkryciu tych komend może nawet nam pomóc Script Editor. Czyli od teraz jeżeli jeszcze nim nie jest – kolejne ulubione narzędzie animatora. To okienko wypluwa co robimy w Maya, tworzymy obiekty, poruszamy nimi, stawiamy klucze, zmieniamy ustawienia. Nie wiem – wszystko!

script editor okno

To na początku naszej przygody pomoże nam w zrozumieniu jak program działa i czego używa do tych czynności.
A jak będziemy już chcieli naszą wiedzę wykorzystać, to w tym samym okienku zaczniemy pisać nasz skrypt.

Animator programista?

Trochę tak, ale to jest BARDZO MOCNA ZALETA!
Czas na anegdotkę, więc jak to dla Ciebie nudy to przewiń dalej :)

Story time

Ładnych kilka lat temu jeszcze długo przed tym, kiedy to zaczynaliśmy przygodę ze „Smok Diplodok” musiałem robić wiele rzeczy na raz, na już, na teraz, na wczoraj. Rzeczy były często repetytywne typu.. Otwórz scenę, zaznacz 10 obiektów, zmień ich nazwę, dodaj do grupy, zrób bake animacji. No i co, jak taki biedny animator siadasz i tłuczesz te sceny za sceną, obiekt za obiektem. Cały dzień zleciał. A ja, że nie miałem całego dnia to zacząłem szukać sposobu na przyspieszenie tempa pracy.

Odpaliłem ten cały Script Editor i patrzyłem co on tam wyświetla po każdej z moich czynności. To co robiłem w programie wyrzucał jako komendę MEL – Maya Embedded Language. Czyli taki wewnętrzny język, którym Maya tak kulawo się porozumiewa.
No i ja – proszę ja Ciebie – zacząłem robić copy/paste komend i samemu to jakoś układać tak, żeby to te kilka linijek kodu zrobiło to o wiele szybciej.
Pierwsze kodowanie jak możesz się spodziewać zajęło więcej niż ta cała czynność byłaby ręcznie robiona, ale przy kolejnym przypadku już miałem jakiś zalążek w głowie i wiedziałem jak mogę temat szybciej ugryźć. I tak powstawał skrypt za skryptem.

Fast forward – teraz chyba nie ma dnia kiedy nie użyję Script Editora albo narzędzia, które sobie napisałem przy okazji jakiegoś projektu. O oszczędności czasu nie muszę pisać. Z moich narzędzi nie korzystam tylko ja. Jako animation supervisor staram się pomóc całemu teamowi i na zamówienie trzaskam kod żeby tylko im pomóc i przyspieszyć tempo prac.

Dni i godziny prac zamieniają się w minuty.

Od czego zaczynamy?

Dla tych, którzy przewinęli akapit tylko jeszcze podrzucę – warto nauczyć się programowania w Maya, bo to oszczędzi mega dużo czasu.
Do tego na pewno pomoże DARMOWY kurs Python 3 for Maya, który stworzył Chris Zurbrigg. Przechodziłem jego poprzednią wersję, więc jeżeli coś zaktualizował to jeszcze lepiej!

No, ale dobra, powiedzmy, że coś tam wiemy, a jak nie to udawajmy. Cicho!

script editor skrot

Odpalamy Script Editor. Albo w prawym dolnym rogu ekranu
albo przez Windows -> General Editors -> Script Editor.
Drugi sposób szybszy.

Dobra – wiemy jak wygląda, więc teraz tylko utrwalmy wiedzę.
Mamy okienko podzielone na pół oraz zakładki z językiem MEL lub Python.
Od tej pory będziemy używać Python.

maya skrypt
script editor ustawienia

A i przy okazji przejdźmy do History i zaznaczmy Line numbers in errors i Show Stack Trace.
Te dwie opcje pomogą nam lepiej zanalizować błędy w kodzie i łatwiej je naprawić.

To co? Gdzie ten skrypt? Kodujemy?

No właśnie już chciałem do tego przejść, ale… co mamy kodować?
Poniżej jest lista/pseudokod, którą mniej więcej mam u siebie:

  1. Ustaw mój ulubiony widok paneli
    Czyli podział viewportów na ekranie, graph editor i ich ustawień.
  2. Znajdź i zmień ustawienia kamery do renderu
    Ustawimy kamerkę w powyższych panelach tak jak chcemy
  3. Pokaż/ukryj wybrane elementy we viewportach
    Ja (i wielu animatorów) pracuję na dwóch viewport. Jeden to widok z kamery do renderu, czyli finalny kadr, a drugi to mój „persp”. Taki roboczy viewport. Zmienimy sobie właśnie ich ustawienia.
  4. Wymuś zmianę wysokości TimeSlider
    Lubię wysoki TimeSlider, ale Maya jakoś mi utrudnia zapisanie tych ustawień, więc jej przypominam…
  5. Zmień set menu na Animation
    Górna belka od razu gotowa do animacji
  6. Dodaj podstawowy, prosty set świateł jeżeli nie ma ich w scenie
    Lubię coś widzieć i mocno nie lubię default maya lights
  7. Wykonaj dodatkowe polecenia
    Tutaj na koniec wklepuję rzeczy, które zmieniają się per projekt. Coś potrzebuję akurat na teraz to tam dopisuję.

Tak mniej więcej będzie wyglądał nasz skrypt… no i to jest przykład tego co możemy osiągnąć. Ale tego jest więcej!
Masz ulubione ustawienia Graph Editor, których Maya nie zapamiętuje? Damy radę!
A może chcesz żeby wczytała/przeładowała wszystkie tekstury po odpaleniu sceny? Damy radę!
No albo gdyby tak oczyścić, przeorganizować, posprzątać Outliner? Damy radę!
Sky (i RAM) is the limit!

Ustawiamy nowy layout w Panel Editor oraz nasz Workspace

Jeżeli masz już zapisany swój własny panel layout oraz Workspace, to możesz śmiało przejść dalej.
Natomiast jeśli jeszcze tego nie zrobiłeś, to luzik – już za chwilę wyjaśnię, co dokładnie zrobimy krok po kroku: W Maya możemy ustawić swoje ulubione ułożenie podziału okienek oraz co ma się w nich znajdować. Mało tego – Maya nawet zapamięta ustawienia elementów widoku w tych okienkach. A Workspace zapamięta ustawienie okienek na ekranie/ekranach.

Panel Editor

Przechodzimy do Windows -> Settings/Preferences -> Panel Editor.
Od razu lecimy do Edit Layouts i zaczynamy ustawianie głównego okna Maya.
Na tym etapie możesz wybrać taki układ, jaki najbardziej odpowiada Twojemu stylowi pracy. Dwa okienka dzielone pionowo/poziomo.. trzy.. cztery okienka? Obok sobie, na sobie? Yyy jedno? Rany, tyle możliwości!

Dobra, teraz przechodzimy zakładkę dalej – Contents.
Tu wybieramy co w każdym z paneli ma się znaleźć. Zadanie dosyć proste, bo na żywo dostajemy podgląd tego jak będzie wyglądać nasze ustawienie.
Ja podzielę się moim ulubionym:

panel editor
panel layout

Hot tip: Jeżeli masz jeden monitor to możesz w górnej części ustawić pionowy podział, a w dolnym np. Graph Editor.



Nie zamykaj jeszcze okienka Panel Editora.
Kliknij na głównym viewport: Panels -> Tear Off Copy..

tear off copy maya

Oderwiemy okienko! Bo jak mamy dwa monitory to chcemy je użyć, co nie?
Przeciągamy to okienko na drugi monitor i maksymalizujemy.

panel maya viewport

Chcesz jeszcze jedno? Spoko, powtórz to!

Ale jeżeli chcesz żeby w tym okienku było coś innego niż viewport (widok z kamery) to najpierw przełącz się na wybrany Editor w Panels -> Panel -> …
I dopiero potem wykonaj Tear Off Copy..

To wszystko co tu opisuję to kwestia mocno personalna.
Zaszalej!

Pa tera! Zaczyna się najciekawsze!

Zmiana ustawień viewport

Przejdź przez każdy viewport i zmień ustawienia widoczności elementów (Show) na takie, które chcesz.
Widok z kamery? Pewnie wystarczą same Polygons, Image Planes i HUD (reszta out).
Persp (widok do pracy) – może Controllers, NURBS Curves, Polygons, Cameras, Locators, Motion Trails, Manipulators, Selection Highliting.. nie wiem, dużo tego. To znowu kwestia indywidualna, więc nic nie sugeruję. Popróbujcie. Ale pamiętajcie, że w razie czego od tego jest nasz skrypt i później możemy wszystko nadpisać, więc bez stresu! Btw – Od Maya 2024 jest to fajniej ogarnięte/pogrupowane. Tu poniżej jeszcze 2022.

maya show settings

Gotowi? To czas zapisać efekty naszej pracy!
Wracamy do okienka Panel Editor, przechodzimy do Layouts, zjeżdżamy na dół i klikamy New Layout.
Zaznaczamy go i zmieniamy nazwę na coś co zapamiętamy:

panel editor

I to tyle! Możesz teraz poskakać sobie pomiędzy różnymi layoutami.

Dodajemy Workspace

Skrypt startowy Maya – wczytywanie layout Workspace

Dobra, nie szalej jeszcze. Na koniec ustawienie naszych okienek na ekranie oraz ich ustawień (via Panel Editor) zapiszmy jako nasz Workspace.
Czyli – animujesz? To na pewno masz inne ustawienie i ilość okienek jakbyś kodował. Albo tworzenie loopów? To może potrzebujesz kilka okienek z różnych kamer. Albo oświetlasz – przyda się coś z Hypershade pewnie. Workspace trzyma właśnie takie ustawienia.

W prawym górnym rogu Maya klikamy na Workspace.
Zjeżdżamy na dół i klikamy Save Current Workspace As…
Od razu na screenie możecie zobaczyć, że sporo ich tworzę na różne potrzeby.
Dalej – oszczędzamy czas nie ustawiając tego wszystkiego na nowo!

Na koniec zawsze warto kliknąć ikonkę kłódki obok tego pola wyboru. Żebyśmy sobie czegoś nie napsuli niechcący.

Potrzebujesz więcej takich ustawień? Powtórz po prostu te kroki.
Zapisuję też backup – z dopiskiem „2”. Na wypadek jakby się coś posypało.

Przy okazji warto zmienić jedno ustawienie w
Windows -> Settings/Preferences -> Preferences.
Tam w UI Elements -> Panel Configurations ustawmy, żeby przy tworzeniu nowej sceny używał naszego nowego layout:

maya settings


A jak już wszystko ogarnięte to lecimy dalej, bo wpis już długi i pewnie nikt do tego momentu już nie dotrwał.

Kodujemy! Part 1/???

Dobra. Wracamy wreszcie do Script Editor. Miejsce w którym będziemy pisać to jest najzwyklejsza konsola Python. Tam możemy używać podstawowych komend jak:

print("Hello World!")Code language: Python (python)

Przetestuj! Wklej to do zakładki Python i wciśnij „Execute All” – dwa niebieskie trójkąty na górze okna.

Na start musimy powiedzieć tej konsoli, że pomimo będąc w programie Maya chcemy używać komend z tego programu. Tak.. wiem…
Na początku kodu zawsze dajemy biblioteki, które będziemy używać, więc zacznijmy od Maya Commands, które sobie dla wygody skrócimy do odwołania „cmds”:

import maya.cmds as cmdsCode language: Python (python)

Ok! Do tej części skryptu będziemy jeszcze wracać.
Na razie przejdźmy do naszego pseudokodu i zobaczmy co mamy dalej zrobić.
A! Mój ulubiony panel view!
Do tego musimy skorzystać z komendy MEL, bo nie ma bezpośredniej komendy w Python. Niestety, czasami tak bywa.
I do tego potrzebujemy tej biblioteki.
Jak powiedziałem tak robimy – zaraz za maya.cmds dopisujemy:

import maya.cmds as cmds
import maya.mel as mel
Code language: Python (python)

Teraz po tym możemy dopisać użycie MELowej komendy eval, która użyje setNamedPanelLayout:

mel.eval('setNamedPanelLayout "PanAnimatorLayout";')Code language: PHP (php)

Ale oczywiście pomiędzy ” ” wpisujecie nazwę layoutu, który chcecie lub stworzyliście chwilę temu.

Hot tip: Zaznacz wszystkie lub wybrane linijki kodu i wciśnij CTRL + ENTER. Wykonasz zaznaczone linijki bez utraty zawartości konsoli.

Dobra, na razie u mnie działa, więc jedziemy dalej! Bo wpis długi, a uwaga czytających słabnie.

Kodujemy part 2/???

Teraz według naszej listy mamy do roboty: Znajdź i zmień ustawienia kamery do renderu

Wreszcie coś łatwego!
Znajdziemy wszystkie kamery w scenie za pomocą listCameras. Potem poszukamy tej, która spełnia nasze kryteria (tu przykładowo nazwa jej to „renderCam”). A potem za pomocą komendy setAttr zmienimy jej atrybuty.
Co? Te atrybuty? A no tak, przy użyciu Attribute Editor, Script Editor i losowego przestawiania wszystkiego w programie można zobaczyć jak się nazywają w MEL i czego potem będziemy potrzebować w Python.

Python script w Maya do automatyzacji uruchomienia


To bardzo prosty sposób. Ale do listy atrybutów każdej node w Maya można dojść na wiele sposobów.
Ale dobra! Nie uczę tu kodowania (sam powinienem to zrobić), więc pozwólcie, że opiszę każdą linijkę:

render_cam = False  # zerujemy zmienna na wypadek
scene_cameras = cmds.listCameras(p=True)  # Lista kamer perspektywicznych w calej scenie
for cam in scene_cameras:  # przeswietlimy teraz kazda z kamer
    if cam.find("renderCam") != -1:
        # Jezeli znajdzie renderCam w nazwie to lecimy dalej. Zamien to na to czego uzywasz w projekcie
        # Ponizej oryginalny kod, ktory napisalem lata temu w nocy. Dziala, zostawie dla beki :D Ale da sie to zrobic lepiej
        scene_cameras.remove(cam)  # ASDASDASDA#@ !@
        scene_cameras.insert(0, cam)  # its stupid, but its late and im tired...

if scene_cameras: # bezpiecznik, jezeli znajdzie kamere to lecimy dalej
    # pierwsza znaleziona kamera spelniajaca kryteria. Nie jest idealnie, ale raczej da rade.
    render_cam = scene_cameras[0]
    
if render_cam:  # bezpiecznik, jezeli wszystko powyzej sie udalo to mozemy zmieniac atrybuty.
    # Near clip plane ustawiam na 0.1, ale to zalezy od projektu
    cmds.setAttr(render_cam + '.nearClipPlane', 0.1)
    # Gate mask - widoczna szara maska na polu bez renderu, tak, poprosze.
    cmds.setAttr(render_cam + '.displayGateMask', 1)
    # Ale chce tylko film gate. Nie render gate. To nie to samo.
    cmds.setAttr(render_cam + '.displayFilmGate', 1)
    # A teraz chce, zeby ta maska byla w 100% widoczna. Chcesz 90%? Daj 0.9
    cmds.setAttr(render_cam + '.displayGateMaskOpacity', 1)
    # To co nie bedzie w renderze to chce zakryc czarnym kolorem. Nie szarym. 
    cmds.setAttr(render_cam + '.displayGateMaskColor', 0, 0, 0, type='double3')
    # Chce zeby zlikwidowac overscan - widok renderCam ma wypelniac viewport w 100%. Ja tak lubie to ustawiam.
    cmds.setAttr(render_cam + '.ovr', 1)
Code language: PHP (php)

I teraz uwaga! Wszystko co powyżej wykonałem to zmiana ustawień kamery renderującej.
Ręcznie (ughhh) możecie to zrobić przez Attribute Editor, a zmiany śledzić w Script Editor.

maya ustawienia kamery

No i dalej – te ustawienia zmieniam wedle projektu. Czyli tak, do tej części kodu często wracam.
Krótki skrypt, a już ile czasu oszczędzi!

Hot tip: Przy okazji analogicznie możecie też zmienić ustawienia kamery persp – tej z obszaru roboczego.

Kodujemy part 3/???

Kolejny krok z naszej listy: Pokaż/ukryj wybrane elementy we viewportach.

Dobra, teraz kolej na jedną z moich ulubionych rzeczy. Stworzymy listę rzeczy, które chcemy pokazać lub ukryć w okienku roboczym oraz z kamerą renderującą.
Tak, przed chwilą to robiliśmy w Panel Editor. Ale rzeczy często się zmieniają per projekt, potrzeby czy też po prostu możemy chcieć wymuszać te ustawienia, bo Maya robi i tak swoje.
To tylko kilka linijek, a spokój na dłużej.

Lista atrybutów

Zrobimy sobie dwie listy, co ukrywamy i co pokazujemy.
I teraz skąd mamy to wiedzieć?
A, manual! Zaglądamy do listy flag komendy modelEditor.
To skąd wiem, że to ta komenda? Wracam do Script Editor. Włączam History -> Echo All Commands tylko na chwilę! Ta opcja spowoduje wypluwanie w konsolę praktycznie każdego mojego kliknięcia. Jeżeli to zostawię na dłużej, to Maya może nieźle spowolnić, bo całą historię będzie dla nas trzymać.
No, ale teraz mając tę opcję włączoną idę do mojego viewport, tam klikam Show i sobie klikam na element, który chciałbym, żeby znalazł się na jednej z moich list.
W Script Editor otrzymuję na przykład taką komendę MEL:

modelEditor -e -joints false modelPanel5;Code language: MEL (mel)

Z tego dowiedziałem się, że potrzebuję komendy „modelEditor„. A jeżeli dla przykładu chcę ukryć kości to potrzebuję flagę „joints” ustawić na 0/false.
Przy okazji dowiedziałem się jak mój viewport (modelPanel – to okienko, które trzyma viewport) się nazywa. To przyda się nam za chwilę.
A za chwilę taką komendę przerzucimy z MEL na Python.

Takim sposobem (lub po prostu wejście w manual…) tworzę listę flag/atrybutów, które chcę ukryć i pokazać w moim okienku z kamerą renderującą.

Modyfikujemy widoczność w kadrze / render view

# Lista atrybutow do renderCam
render_hide_attrs = ['alo', 'gr', 'm', 'nc', 'sel']  # To ukrywamy
render_show_attrs = ['polymeshes', 'dtx', 'mt', 'pluginShapes', 'imp']  # To pokazujemy
# Generujemy slownik flag z ukrytymi atrybutami
render_flags_off = {i: 0 for i in render_hide_attrs}
# Generujemy slownik flag z widocznymi atrybutami
render_flags_on = {i: 1 for i in render_show_attrs}
# Tworzymy spis flag. Dodajemy najpierw ukryte
render_flags = render_flags_off.copy()
render_flags.update(render_flags_on)  # A potem te widoczne
# Modyfikujemy modelPanel
cmds.modelEditor(render_view, edit=True, displayAppearance="smoothShaded", dl="all", camera=render_cam, **render_flags)
Code language: Python (python)

Taką listę zamieniamy w słownik, czyli przy każdej fladze postawimy 1 lub 0 (true/false) co będzie informacją dla komendy modelEditor co ma z wybraną flagą zrobić.
A na koniec łączymy ze sobą dwa słowniki, w jeden – render_flags.

Teraz używamy naszej komendy modelEditor w trybie edit – bo edytujemy już utworzony viewport.
Tutaj warto zauważyć – dodałem jeszcze trzy ciekawe opcje:
displayAppearance=”smoothShaded” – na wypadek włączonego wireframe lub innych opcji Shadingu we viewport
dl=”all” – włączone domyślne światła (zaraz też do nich przejdziemy)
camera=render_cam – wymusimy ustawienie w tym viewport kamery renderującej

Oczywiście takich zmian możemy robić jeszcze więcej – zapraszam do dokumentacji.

Jedna ważna rzecz bez której powyższy skrypt nie zadziała. Na pierwszym miejscu w tej komendzie wskazałem zmienną, która powie w którym modelPanel robimy zmiany.
Nazwy takich modelPanel mogą się czasami przypadkowo zmienić, dlatego na początku całego kodu definiuję zmienną render_view, którą szybko w razie czego mogę poprawić:

import maya.cmds as cmds
import maya.mel as mel

render_view = "modelPanel5"
Code language: Python (python)

Jak dojść do nazwy interesującego nas modelPanel pisałem wyżej.
Ale w razie czego zawsze polecam też inny sposób.
Klikamy gdziekolwiek wewnątrz viewport, którego nazwę chcemy zdobyć. Następnie w tej mini konsoli na dole głównego okna Maya wklepać taką komendę Python używającą getPanel i wcisnąć Enter:

print(cmds.getPanel(withFocus=True))Code language: PHP (php)
maya python

W Script Editor dostaniemy komunikat typu „modelPanel5”. I to jest właśnie nazwa naszego modelPanel, który chcemy edytować.

Taką komendę możemy zostawić sobie jako komentarz zaraz na początku skryptu. W razie czego szybki copy/paste mamy pod ręką:

import maya.cmds as cmds
import maya.mel as mel

render_view = "modelPanel5" 
# print(cmds.getPanel(withFocus=True))
Code language: Python (python)

Dobra! Gotowe! Podobną rzecz robię do obszaru roboczego. Praktycznie ten sam kod.

Modyfikujemy widoczność w obszarze roboczym

Ale uwaga – robiąc takie copy/paste pamiętajcie o zmianie nazw zmiennych. W praktyce – wszystko z „render_” zmieniam na „persp_”. Ale sami też prześledźcie kod!

# Lista atrybutow do perspCam
persp_hide_attrs = ['j', 'imp']  # To ukrywamy
persp_show_attrs = ['polymeshes', 'nc', 'mt', 'pluginShapes', 'ca']  # To pokazujemy

# Generujemy slownik flag z ukrytymi atrybutami
persp_flags_off = {i: 0 for i in persp_hide_attrs}
# Generujemy slownik flag z widocznymi atrybutami
persp_flags_on = {i: 1 for i in persp_show_attrs}
# Do flag dodajemy najpierw ukryte
persp_flags = persp_flags_off.copy()
persp_flags.update(persp_flags_on)  # A potem te widoczne
# Modyfikujemy modelPanel
cmds.modelEditor(persp_view, edit=True, displayAppearance="smoothShaded", dl="default", camera="persp", **persp_flags)
Code language: Python (python)

To taki prosty przykład. Te hide/show attrs zmieniam wedle uznania.
Dokładnie to samo możesz zrobić do każdego modelPanel i wybranej kamery.
Uwaga – tu też użyłem nową zmienną – persp_view. Analogicznie jak render_view trzeba ją zdefiniować na początku całego kodu.

Ufff… dobra! Coś powoli nam się zapełnia Script Editor. Lecimy dalej!

Kodujemy part 4/???

Następny krok: Wymuś zmianę wysokości TimeSlider

To akurat jest część, która jest zapisana w naszym Workspace, ale czasami warto coś poprawić.
Daję też jako ciekawostkę co jeszcze możemy zmieniać w Maya.
Prosty skrypt!

cmds.formLayout(mel.eval("$retvalue = $gTimeSliderForm;"), edit=True, height=75)Code language: Python (python)

Komenda formLayout służy między innymi do tworzenia i modyfikacji wszystkiego co widzimy w Maya.
Podajemy nazwę elementu UI – TimeSlider. A do niego można dojść tylko przez użycie języka MEL, a właściwie komendy eval – do interpretowania kawałka kodu jako MEL (a nie Python). Więc w nawiasy pcham kawałek kodu MEL, który daje nazwę elementu UI od TimeSlider.
Na koniec zmieniam wysokość tego elementu. Ja lubię wysoki TimeSlider, więc 75 styknie.

maya timeslider

Dobra, zbliżamy się do końca!

Kodujemy part 5/???

Szybko następny punkcik: Zmień set menu na Animation

Do tego użyjemy komendy setMenuMode i skrypt wygląda tak:

cmds.setMenuMode('animationMenuSet')
cmds.shelfTabLayout(mel.eval('$tempMelVar=$gShelfTopLevel'), edit=True, selectTab="PanAnimatorShelf")
Code language: Python (python)

I tu jeszcze jedna rzecz! Z shelfTabLayout przy użyciu mel.eval zmieniam też shelf ze skrótami na ten przeze mnie wybrany. Mała rzecz, a cieszy! Lubię rzeczy, które cieszą.

Kodujemy part 6/???

Czas na: Dodaj podstawowy, prosty set świateł jeżeli nie ma ich w scenie

O tym dlaczego warto dodawać światła do sceny pisałem już kiedyś.
Teraz po prostu taki zestaw świateł stworzymy kilkoma linijkami kodu:

# Wylistujmy wszystkie obiekty typu swiatlo w scenie
lights = cmds.ls(type="light")

if not lights: # Jezeli nie ma to:
    # Tworzymy 2xDirectional, 1xAmbient
    cmds.directionalLight(n="prxLight01", rotation=(-39, 00, 00), intensity=1, rs=False)
    cmds.directionalLight(n="prxLight02", rotation=(-160, 00, 00), intensity=0.7, rs=False)
    cmds.ambientLight(n="prxLight03", intensity=0.3, rs=False)
    # Grupujemy dla porzadku w Outliner
    cmds.group('prxLight01', 'prxLight02', 'prxLight03', n='prxLights')
Code language: Python (python)

Używamy ls do przeszukania obiektów w scenie przez typ lub nazwę.
Potem komendy directionalLight i ambientLight – to wiadomo o co chodzi. Atrybuty dobrałem według mojego gustu.
A na koniec group do wrzucenia wszystkich wyżej stworzonych świateł do jednej grupy. Dbamy o porządek!
W centrum sceny powinny pojawić się trzy światła, którymi możemy się bawić według potrzeb konkretnego ujęcia. Skrypt ładnie rośnie!

Kodujemy part 7/???

I na koniec ostatni punkt z naszej listy: Wykonaj dodatkowe polecenia

Tutaj nie mam gotowego kawałka kodu. Ostatnia część to po prostu zlepki skryptów, których używamy do obecnego projektu. Albo po prostu nie mają swojej kategorii i tworzy się taki wesoły tworek.

U mnie na przykład znajdziecie:

cmds.outlinerEditor("graphEditor1OutlineEd", e=True, animLayerFilterOptions="active")Code language: Python (python)

outlinerEditor – który za mnie zmienia ustawienia filtra Animation Layers w Graph Editor:

Albo przy użyciu headsUpDisplay:

cmds.headsUpDisplay('HUDFocalLength', edit=True, visible=True, section=5, block=2)
cmds.headsUpDisplay('HUDCurrentFrame', edit=True, visible=True, dataFontSize="large", section=5, block=1)
if cmds.headsUpDisplay('HUDViewAxis', ex=True):
    cmds.headsUpDisplay('HUDViewAxis', rem=True)
cmds.toggleAxis(o=False)
Code language: Python (python)

Tworzę wyświetlanie Focal Length i Frame w lewym dolnym rogu zamiast oznaczenia osi kierunku:

maya viewport hud

I mam jeszcze kilka rzeczy, ale tylko pod obecny projekt. Zachowam dla siebie :)
Ale jak widzicie praktycznie wszystko da się przekuć w komendę, a rzeczy powtarzalne zautomatyzować.

Finalny skrypt

# www.pananimator.pl/skrypt-startowy-maya/

import maya.cmds as cmds
import maya.mel as mel

# ZMIENNE
render_view = "modelPanel5"
persp_view = "modelPanel4"
# print(cmds.getPanel(withFocus=True))
# ------------------------

# ZMIENIAMY PANEL LAYOUT
mel.eval('setNamedPanelLayout "PanAnimatorLayout";')

# ------------------------

# MODYFIKUJEMY KAMERE RENDERUJACA
render_cam = False  # zerujemy zmienna na wypadek
scene_cameras = cmds.listCameras(p=True)  # Lista kamer perspektywicznych w calej scenie
for cam in scene_cameras:  # przeswietlimy teraz kazda z kamer
    if cam.find("renderCam") != -1:
        # Jezeli znajdzie renderCam w nazwie to lecimy dalej. Zamien to na to czego uzywasz w projekcie
        # Ponizej oryginalny kod, ktory napisalem lata temu w nocy. Dziala, zostawie dla beki :D Ale da sie to zrobic lepiej
        scene_cameras.remove(cam)  # ASDASDASDA#@ !@
        scene_cameras.insert(0, cam)  # its stupid, but its late and im tired...

if scene_cameras:  # bezpiecznik, jezeli znajdzie kamere to lecimy dalej
    # pierwsza znaleziona kamera spelniajaca kryteria. Nie jest idealnie, ale raczej da rade.
    render_cam = scene_cameras[0]

if render_cam:  # bezpiecznik, jezeli wszystko powyzej sie udalo to mozemy zmieniac atrybuty.
    # Near clip plane ustawiam na 0.1, ale to zalezy od projektu
    cmds.setAttr(render_cam + '.nearClipPlane', 0.1)
    # Gate mask - widoczna szara maska na polu bez renderu, tak, poprosze.
    cmds.setAttr(render_cam + '.displayGateMask', 1)
    # Ale chce tylko film gate. Nie render gate. To nie to samo.
    cmds.setAttr(render_cam + '.displayFilmGate', 1)
    # A teraz chce, zeby ta maska byla w 100% widoczna. Chcesz 90%? Daj 0.9
    cmds.setAttr(render_cam + '.displayGateMaskOpacity', 1)
    # To co nie bedzie w renderze to chce zakryc czarnym kolorem. Nie szarym.
    cmds.setAttr(render_cam + '.displayGateMaskColor', 0, 0, 0, type='double3')
    # Chce zeby zlikwidowac overscan - widok renderCam ma wypelniac viewport w 100%. Ja tak lubie to ustawiam.
    cmds.setAttr(render_cam + '.ovr', 1)

# ------------------------

# MODYFIKUJEMY VIEWPORTY / MODELPANELS

# Lista atrybutow do renderCam
render_hide_attrs = ['alo', 'gr', 'm', 'nc', 'sel']  # To ukrywamy
render_show_attrs = ['polymeshes', 'dtx', 'mt', 'pluginShapes', 'imp']  # To pokazujemy
# Generujemy slownik flag z ukrytymi atrybutami
render_flags_off = {i: 0 for i in render_hide_attrs}
# Generujemy slownik flag z widocznymi atrybutami
render_flags_on = {i: 1 for i in render_show_attrs}
# Tworzymy spis flag. Dodajemy najpierw ukryte
render_flags = render_flags_off.copy()
render_flags.update(render_flags_on)  # A potem te widoczne
# Modyfikujemy modelPanel
cmds.modelEditor(render_view, edit=True, displayAppearance="smoothShaded", dl="all", camera=render_cam, **render_flags)

# Lista atrybutow do perspCam
persp_hide_attrs = ['j', 'imp']  # To ukrywamy
persp_show_attrs = ['polymeshes', 'nc', 'mt', 'pluginShapes', 'ca']  # To pokazujemy

# Generujemy slownik flag z ukrytymi atrybutami
persp_flags_off = {i: 0 for i in persp_hide_attrs}
# Generujemy slownik flag z widocznymi atrybutami
persp_flags_on = {i: 1 for i in persp_show_attrs}
# Do flag dodajemy najpierw ukryte
persp_flags = persp_flags_off.copy()
persp_flags.update(persp_flags_on)  # A potem te widoczne
# Modyfikujemy modelPanel
cmds.modelEditor(persp_view, edit=True, displayAppearance="smoothShaded", dl="default", camera="persp", **persp_flags)

# ------------------------

# ZMIENIAMY WYSOKOSC TIMESLIDER
cmds.formLayout(mel.eval("$retvalue = $gTimeSliderForm;"), edit=True, height=75)

# ------------------------

# ZMIENIAMY MENU I SHELF
cmds.setMenuMode('animationMenuSet')
cmds.shelfTabLayout(mel.eval('$tempMelVar=$gShelfTopLevel'), edit=True, selectTab="PanAnimatorShelf")

# ------------------------

# TWORZYMY PROSTY SETUP SWIATEL
# Wylistujmy wszystkie obiekty typu swiatlo w scenie
lights = cmds.ls(type="light")

if not lights: # Jezeli nie ma to:
    # Tworzymy 2xDirectional, 1xAmbient
    cmds.directionalLight(n="prxLight01", rotation=(-39, 00, 00), intensity=1, rs=False)
    cmds.directionalLight(n="prxLight02", rotation=(-160, 00, 00), intensity=0.7, rs=False)
    cmds.ambientLight(n="prxLight03", intensity=0.3, rs=False)
    # Grupujemy dla porzadku w Outliner
    cmds.group('prxLight01', 'prxLight02', 'prxLight03', n='prxLights')

# ------------------------

# DODATKOWE FUNKCJE

# Zmiana filtra Animation Layers w Graph Editor
cmds.outlinerEditor("graphEditor1OutlineEd", e=True, animLayerFilterOptions="active")

# Zmiana HUD
cmds.headsUpDisplay('HUDFocalLength', edit=True, visible=True, section=5, block=2)
cmds.headsUpDisplay('HUDCurrentFrame', edit=True, visible=True, dataFontSize="large", section=5, block=1)
if cmds.headsUpDisplay('HUDViewAxis', ex=True):
    cmds.headsUpDisplay('HUDViewAxis', rem=True)
cmds.toggleAxis(o=False)

Code language: Python (python)

Trochę posprzątałem, pokomentowałem i oddzieliłem dla lepszej widoczności.
Dodałem też link do wpisu żeby był zawsze pod ręką.
Zapraszam do kopiowania!

A już szczególnie do dodania tego kodu na swój Shelf.
Wklejamy to w Script Editorzakładka Python jeżeli to jeszcze nie jest oczywiste do tej pory.

maya skrypt skrot

Zaznaczamy nasz cały skrypt i przeciągamy na wybrany Shelf. Maya zapyta w jakim języku jest to kod, więc pomóżmy jej i wciśnijmy „Python”. Jak mamy jeszcze czas to możemy udekorować i podpisać nasz skrót w Shelf Editor.
Od teraz cała opracowana w tym wpisie magia działa już po jednym kliknięciu. Tak jak obiecywałem!

Podsumowanie

Dzięki nie aż tak skomplikowanemu kodowaniu możemy łatwo zmieniać wiele ustawień. Ogólnie – cały program możemy tak dostosować, że otwierając pliki skupiamy się od razu na pracy, a nie przygotowaniu do niej. A samo liźnięcie programowania NA PEWNO NAM POMOŻE!

Uff! RANY! Ale długi wpis! Ale fajny! Normalnie bym go podzielił na części, ale… ale chyba szkoda to rozbijać.
Właściwie jak skoncentrujemy się tylko na kodzie to szybko idzie, no ale trzeba pogadać jednak co to ten Script Editor, Python i komendy maya.cmds.
Do tego jeszcze ustawialiśmy sobie Maya do naszych potrzeb, a to też trochę zajmuje. No, ale fajnie działa i bajabongo.

Wpis długi, tak, starałem się ścinać zakręty gdzie się da. Jeżeli jednak coś jest napisane zbyt enigmatycznie, bez sensu lub co gorsza – popełniłem błąd – to dawajcie znać. Chętnie jeszcze coś tu dopiszę! :)