Acest tutorial este o introducere în construirea interfețelor grafice de utilizator (GUI) în MEL pentru Maya 2010 și mai jos. Maya 2011 introduce o nouă metodologie pentru crearea de GUI-uri care nu vor fi acoperite aici. Vom trece codul corect pentru UI-uri, manipularea erorilor și vom pune împreună un script foarte util care vă oferă un control considerabil asupra punctului de pivot al unui obiect.
Dacă aveți de gând să dați scripturile dvs. unui alt artist, atunci poate fi extrem de util să creați un GUI ușor de utilizat, care să facă accesul codului dumneavoastră la non-programatori. În aceste zile, folosesc rar chei personalizate personalizate, bazându-mă în schimb pe o mulțime de UI pe care le-am construit în MEL pentru a automatiza procesele Maya. Le pot purta cu mine și nu trebuie să schimb orice preferințe pentru a lucra confortabil pe mai multe stații de lucru. Abilitatea de a crea și de a menține UI este un instrument puternic, dar uneori frustrant în setul de instrumente MEL.
Să aruncăm o privire la ceea ce vom crea astăzi. Începeți prin salvarea fișierului "EdW_PivotControl.mel" inclus în acest tutorial în directorul de scripturi. Apoi, deschide-o pe Maya. Voi folosi Maya 2010 pe durata acestui tutorial, dar același cod ar trebui să funcționeze pentru majoritatea versiunilor Maya. Introduceți următoarele în linia de comandă și apăsați enter:
sursa EdW_PivotControl; EdW_PivotControl;
Ar trebui să avem o fereastră deschisă cu câteva butoane pe ea. Încercați să creați o geometrie și să experimentați scenariul. Scopul este de a crea un script care să vă ofere controlul on-the-fly asupra punctelor pivot ale obiectului.
Stabiliți ce proceduri vom avea nevoie pentru a face acest script:
Eu folosesc epc_ ca prefixul meu. Ca și în tutorialele anterioare, doriți să vă asigurați că procedurile dvs. au nume unice, astfel încât să nu interfereze cu alte scripturi.
Vom începe scriptul nostru deschizând acel vechi standby, Microsoft Notepad. Prima procedură este ușoară:
Salvați fișierul. Când salvați un document MEL, asigurați-vă că alegeți "Toate fișierele" sub "salvați ca tip". Salvați documentul ca fișier .mel în directorul de scripturi Maya. Voi folosi EdW_PivotControl.mel ca numele meu de fișier, dar nu ezitați să alegeți ce vă place.
Acum ajungem la partea grea. Crearea de interfețe utilizator în MEL nu a fost niciodată un proces deosebit de elegant, așa că voi face tot posibilul pentru a face procesul fără dureri. Uneori, este mai bine să scoateți ceva pe hârtie înainte de a începe să scrieți codul, pentru a schița aspectul de bază pentru ceea ce doriți ca UI-ul final să arate. Acest script este destul de simplu, dar când începeți să vă ocupați cu filele, meniurile, barele de derulare etc. doriți să vă asigurați că aveți un plan de joc în minte.
Vom analiza trei tipuri diferite de comenzi UI:
Iată o defalcare a schiței noastre în funcție de comenzile MEL folosite pentru a le crea:
Primul pas pentru crearea interfeței UI este stabilirea ferestrei. Deoarece obiectul nostru Window va avea un nume unic, Maya nu poate avea două ferestre deschise simultan. Prima parte a procedurii noastre verifică dacă fereastra este deja deschisă și dacă aceasta este închisă.
// Crearea unui nivel global al procului pivotControl ()
dacă ('fereastra -există PivotControlMain')
deleteUI PivotControlMain;
; // ...;
Acum, să încercăm să creăm o fereastră în cod și să vedem ce se întâmplă:
fereastră -rtf 1 -t "EdW Pivot Control" -mnb 1 -mxb 1 -w 450 -h 300 PivotControlMain;
În momentul de față, fereastra a fost creată în interiorul scriptului, dar este necesară o altă comandă pentru ao arăta. Această comandă va apărea întotdeauna după toate comenzile UI pentru fereastră.
showWindow PivotControlMain;
Codul nostru complet ar trebui să arate astfel:
// Funcția principală globală proc EdW_PivotControl () pivotControl; ; // Creează pacul global proc pivotControl () if ('fereastră -există PivotControlMain') deleteUI PivotControlMain; ; fereastră -rtf 1 -t "EdW Pivot Control" -mnb 1 -mxb 1 -w 200 -h 350 PivotControlMain; showWindow PivotControlMain; ;
Sursa în noul cod și executați-l din linia de comandă Maya. Aceasta este ceea ce ar trebui să obțineți:
sursa EdW_PivotControl; EdW_PivotControl;
Fereastra este obiectul principal din ierarhia noastră de interfață. Toate planurile și controalele sunt copii ai acestui obiect. Primul aspect pe care îl vom folosi este un aspect al coloanei, pentru a ține apăsat butoanele:
coloanăLayout - ajustabilăColumnul 1 -Roaspunderea 0 EPC_MainColumnLayout;
Am descoperit că includerea unor instrucțiuni sau clarificări în interiorul UI poate face scriptul mai util. Adăugați un control de text în script:
text -l "Mutați pivotul la:";
Apoi, dorim să adăugăm un aspect pentru a ține apăsat butoanele din partea de sus a ferestrei, pentru a mișca pivoții în jur. Un aspect pe care îl putem folosi este gridLayout, care creează un set de celule distanțate uniform care conțin câte un obiect.
gridLayout -cwh 60 24 -nrc 2 5;
Fiecare celulă din rețea poate conține un singur control. Acestea sunt umplute automat când creați obiectele aflate sub planul. În cazul nostru, dorim să creăm nouă butoane. Vom folosi pavilionul-comanda mai târziu pentru a indica butoanelor procedura de apel:
butonul -l "Centrul"; butonul -l "Y Min"; butonul -l "Y Max"; butonul -l "Origine"; butonul -l "selectat"; butonul -l "X Min"; butonul -l "X Max"; butonul -l "Z Min"; butonul -l "Z Max";
Acum, avem nevoie de o modalitate de a le spune Maya că am terminat cu gridLayout și vrem să adăugăm mai multe elemente în coloana Layout. Pentru a face acest lucru, vom folosi o comandă MEL pentru a seta părintele gridLayout.
setParent ...;
...; indică faptul că doriți ca părintele să aibă o lățime mai mare în lanțul de ierarhie. Am putea folosi și numele layout-ului, dar acest lucru este util doar dacă toate layout-urile au nume explicite:
setParent EPC_MainColumnLayout;
Scriptul pivotControl ar trebui să arate astfel:
globul proc pivotControl () if ('fereastra -există PivotControlMain') deleteUI PivotControlMain; ; fereastră -rtf 1 -t "EdW Pivot Control" -mnb 1 -mxb 1 -w 200 -h 350 PivotControlMain; coloanăLayout - ajustabilăColumnul 1 -Roaspunderea 0 EPC_MainColumnLayout; text -l "Mutați pivotul la:"; gridLayout -cwh 60 24 -nrc 2 5 -ag 1; butonul -l "Centrul"; butonul -l "Y Min"; butonul -l "Y Max"; butonul -l "Origine"; butonul -l "selectat"; butonul -l "X Min"; butonul -l "X Max"; butonul -l "Z Min"; butonul -l "Z Max"; setParent ...; showWindow PivotControlMain; ;
La fel ca gridLayout, coloana Layout trebuie să fie închisă prin setarea părintelui său.
setParent ...;
Sursă în scenariu și vezi ce primești:
Procedura UI se face!
// Funcția principală globală proc EdW_PivotControl () pivotControl; ; // Creează pacul global proc pivotControl () if ('fereastră -există PivotControlMain') deleteUI PivotControlMain; ; fereastră -rtf 1 -t "EdW Pivot Control" -mnb 1 -mxb 1 -w 200 -h 350 PivotControlMain; coloanăLayout - ajustabilăColumnul 1 -Roaspunderea 0 EPC_MainColumnLayout; text -l "Mutați pivotul la:"; gridLayout -cwh 60 24 -nrc 2 5 -ag 1; butonul -l "Centrul"; butonul -l "Y Min"; butonul -l "Y Max"; butonul -l "Origine"; butonul -l "selectat"; butonul -l "X Min"; butonul -l "X Max"; butonul -l "Z Min"; butonul -l "Z Max"; setParent ...; setParent ...; showWindow PivotControlMain; ;
Acum trebuie să creăm codul pentru a muta punctul de pivot al unui obiect. Pentru a face acest lucru, vom crea două proceduri care vor funcționa împreună:
Plasați pseudo-codul pentru epc_getBounds:
creați scheletul procedurii, completat cu un tip de returnare și un argument transmis.
global proc float [] epc_getBounds (șir $ objSel) ;
selectați obiectul transmis ca argument și obțineți informațiile din caseta delimitată.
globul proc float [] epc_getBounds (șir $ objSel) select -r $ objSel; flotați $ getBoundArray [] = 'xform -q -ws -bb'; ;
Steagul -boundingBox returnează șase valori într-o matrice: x minimă, x maximă, y minimă, y maximă, z minimă și z maximă.
calculați mediile dintre valorile minime și maxime. Rețineți că matricele încep întotdeauna cu un indice de zero.
float $ bbXAv = (($ getBoundArray [3] + $ getBoundArray [0]) / 2); // xmax plus xmin împărțit de două float $ bbYAv = (($ getBoundArray [4] + $ getBoundArray [1]) / 2); // ymax plus ymin împărțit de două float $ bbZAv = (($ getBoundArray [5] + $ getBoundArray [2]) / 2); // zmax plus zmin împărțit la doi
calculați mediile dintre valorile minime și maxime. Rețineți că matricele încep întotdeauna cu un indice de zero.
float $ bbXAv = (($ getBoundArray [3] + $ getBoundArray [0]) / 2); // xmax plus xmin împărțit de două float $ bbYAv = (($ getBoundArray [4] + $ getBoundArray [1]) / 2); // ymax plus ymin împărțit de două float $ bbZAv = (($ getBoundArray [5] + $ getBoundArray [2]) / 2); // zmax plus zmin împărțit la doi
Adăugați mediile noi calculate și returnați matricea finală.
$ getBoundArray [6] = $ bbXAv; $ getBoundArray [7] = $ bbYAv; $ getBoundArray [8] = $ bbZAv; return $ getBoundArray;
Procedura finală ar trebui să arate astfel:
globul proc float [] epc_getBounds (șir $ objSel) select -r $ objSel; flotați $ getBoundArray [] = 'xform -q -ws -bb'; float $ bbXAv = (($ getBoundArray [3] + $ getBoundArray [0]) / 2); float $ bbYAv = (($ getBoundArray [4] + $ getBoundArray [1]) / 2); float $ bbZAv = (($ getBoundArray [5] + $ getBoundArray [2]) / 2); $ getBoundArray [6] = $ bbXAv; $ getBoundArray [7] = $ bbYAv; $ getBoundArray [8] = $ bbZAv; return $ getBoundArray; ;
Acum putem pune acest cod în cadrul procedurii noastre epc_movePivotLocal. Scrie pseudo-codul:
creați scheletul pentru procedură. Configurați o buclă de intrare, astfel încât codul să fie executat o singură dată pentru fiecare obiect selectat în scenă.
Protocolul global epc_movePivotLocal (string $ mode) string $ sel [] = 'ls -sl'; pentru ($ thisObj în $ sel) // codul merge aici; ;
Utilizați procedura return-value din epc_getBounds pentru a scrie o matrice float:
flotați $ pos [] = 'epc_getBounds $ thisObj';
Acum, vom folosi o instrucțiune de comutare pentru a muta cu adevărat pivotul. Structura de bază a unui compartiment este următoarea:
comutator (variabila $) // variabila poate fi orice tip, inclusiv siruri de caractere si plutitoare case variableValue: // daca variabila se potriveste cu variabilaValue // rula acest break; caz otherValue: // cod aici break; ;
Declarația casei de comutare este un sistem cascadă, ceea ce înseamnă că dacă nu includeți comanda "pauză" după fiecare caz, restul cazurilor se vor executa, de asemenea. Pentru procedura noastră, vrem să adăugăm un compartiment care ne va permite să folosim aceeași procedură pentru a muta un pivot în mai multe poziții diferite. Cazul nostru de comutare va arăta astfel:
comutator (modul $) caz "center": CenterPivot $ thisObj; pauză; cazul "ymin": mutați -a -rpr $ pos [6] $ pos [1] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); pauză; ;
Continuați să adăugați cazuri la scenariu, astfel încât fiecare dintre butoanele noastre de utilizare să aibă un caz corespunzător. Procedura completă ar trebui să arate astfel:
Protocolul global epc_movePivotLocal (string $ mode) string $ sel [] = 'ls -sl'; pentru ($ thisObj în $ sel) float $ pos [] = 'epc_getBounds $ thisObj'; comutator (modul $) caz "center": CenterPivot $ thisObj; pauză; cazul "ymin": mutați -a -rpr $ pos [6] $ pos [1] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); pauză; cazul "ymax": deplasare -a -rpr $ pos [6] $ pos [4] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); pauză; caz "origine": mutați -a -rpr 0 0 0 ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); pauză; cazul "xmin": mutați -a -rpr $ pos [0] $ pos [7] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); pauză; cazul "xmax": mutați -a -rpr $ pos [3] $ pos [7] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); pauză; cazul "zmin": mutați -a -rpr $ pos [6] $ pos [7] $ pos [2] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); pauză; cazul "zmax": mutați -a -rpr $ pos [6] $ pos [7] $ pos [5] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); pauză; ; ; ;
Ultima noastră procedură urmează aproape aceeași idee.
Protocolul global epc_movePivotToObject () string $ selLast [] = 'ls -sl -tail 1'; șir $ copyToObj = $ selLast [0]; selectați-selectați $ copyToObj; șirul $ selSet [] = 'ls -sl'; flotare $ pivotSel [] = 'xform -q -piv -ws $ copyToObj'; print $ pivotSel; pentru $ ($ each in $ selSet) move -a $ pivotSel [0] $ pivotSel [1] $ pivotSel [2] ($ fiecare + ".rotatePivot") ($ fiecare + ".scalePivot"); ; ;
Există doar două noi pavilioane în această procedură:
Acum, tot ce rămâne este de a face butoanele noastre din UI să sune de fapt procedurile pe care le-am scris.
buton -l "Centrul" -c "epc_movePentru centruLocal"; butonul -l "Y Min" -c "epc_movePivotLocal ymin"; butonul -l "Y Max" -c "epc_movePivotLocal ymax"; butonul -l "Origine" -c "epc_move Originea PivotLocal"; butonul -l "Selecționat" -c "epc_movePivotToObject"; butonul -l "X Min" -c "epc_movePivotLocal xmin"; butonul -l "X Max" -c "epc_movePivotLocal xmax"; butonul -l "Z Min" -c "epc_movePivotLocal zmin"; butonul -l "Z Max" -c "epc_movePivotLocal zmax";
Și am terminat!