Maya MEL Prosedyremodeling for Artists - UiS 
 
 Denne opplæringen er en introduksjon til å bygge grafiske brukergrensesnitt (GUI) i MEL for Maya 2010 og under. Maya 2 011 introduserer en ny metode for å lage GUI som ikke vil bli dekket her. Vi kommer til å gå over riktig koding for UiS, feilhåndtering, og vi skal sette sammen et svært nyttig script som gir deg betydelig kontroll over et objekt dreiepunkt. 
 
 
 
 Brukergrensesnitt 
 
 Hvis du har planer om å gi dine skript til en annen artist, så det kan være utrolig nyttig å sette sammen et brukervennlig GUI som gjør koden tilgjengelig for ikke-programmerere. I disse dager, jeg bruker sjelden definerte hurtigtaster, istedenfor å stole på en håndfull av UiS som jeg har bygget i MEL å automat Maya prosesser. Jeg kan bære dem med meg, og trenger ikke å endre noen innstillinger for å jobbe komfortabelt på flere arbeidsstasjoner. Evnen til å skape og opprettholde UiS er et kraftig, men noen ganger frustrerende verktøy i MEL verktøykasse. 
 
Trinn 1
 La oss ta en titt på hva vi kommer til å være å skape i dag . Start med å redde "EdW_PivotControl.mel" -fil som følger med denne opplæringen til din scripts katalogen. Deretter åpner opp Maya. Jeg skal bruke Maya 2010 for varigheten av denne opplæringen, men den samme koden skal fungere for de fleste Maya versjoner. Skriv inn følgende i kommandolinjen og trykk enter: 
 kilde EdW_PivotControl; EdW_PivotControl; 
Trinn 2
 Vi bør ha et vindu åpent opp med et par knapper på den. Prøv å skape noen geometri og eksperimentere med manuset. Målet er å lage et skript som gir deg on-the-fly kontroll over objektet dreiepunkter. 
 
Trinn 3
 Legg ut hvilke rutiner vi må gjøre dette skriptet : 
 
 EdW_PivotControl - lanserer den viktigste prosedyren av skriptet 
 
 epc_pivotControl - skaper UI 
 
 epc_getBounds - bruke XForm kommandoen for å få markeringsrammen til den valgte innvende 
 
 epc_movePivotLocal - flytter objektets pivot til en lokal posisjon (y min, x min, etc.) 
 
 epc_movePivotToObject - flytter pivot til et annet objekt beliggenhet 
 
 Jeg bruker epc_ som min prefiks. Som i tidligere tutorials, vil du sørge for at prosedyrene har unike navn, slik som å ikke forstyrre andre scripts. 
 
Trinn 4
 Vi starter vår script ved å åpne opp det gamle standby, Microsoft Notepad. Den første prosedyren er enkel: 
 
 
 
Trinn 5
 Lagre ut filen. Når du lagrer en MEL dokument, sørg for å velge "Alle filer" under "lagre som type". Lagre dokumentet som en .mel fil i Maya scripts katalogen. Jeg skal bruke EdW_PivotControl.mel som min filnavn, men gjerne velge hva du vil. 
 
Trinn 6
 Nå får vi til den vanskelige delen. Opprette UiS i MEL har aldri vært en spesielt elegant prosess, så jeg skal gjøre mitt beste for å gjøre prosessen så smertefri som mulig. Noen ganger er det best å bare trekke noe ut på papir før vi begynner å skrive ut kode, så skissere en grunnleggende oppsett for hva du vil ha den endelige UI å se ut. Dette skriptet er ganske enkel, men når du begynner å forholde seg til faner, menyer, rullefelt osv du vil være sikker på at du har et spill-plan i tankene. 
 
Trinn 7
< p> Vi kommer til å se på tre ulike typer av UI-kommandoer:
Windows - toppnivå objekter som har de vanlige knappene på alle OS-vinduet, for eksempel minimere, maksimere og lukke .
Layouts - ulike måter å organisere objekter innenfor en windows
Controls -.. knapper, slidere, tekstfelt, etc. Dette er de interaktive elementene i brukergrensesnittet
 Her er en oversikt over våre skisse henhold til MEL kommandoer som brukes til å lage dem: 
 
 
 
Trinn 8
 Det første skrittet for å skape brukergrensesnittet er å etablere vinduet. Fordi vår vindusobjekt vil ha et unikt navn, kan Maya ikke ha to av samme vinduet åpent på en gang. Den første delen av vår prosedyre sjekker om vinduet er allerede åpen, og lukker den hvis det er 
 //Opprett UIglobal proc pivotControl () {. ≪ br /> if (`vindu -exists PivotControlMain`) {< br /> deleteUI PivotControlMain; < br /> }; //...}; 
Trinn 9
 Nå, la oss prøve å lage et vindu i koden og se hva som skjer: 
 vindu -rtf en -t "Edw Pivot Control "-mnb en -mxb 1-w 450 h 300 PivotControlMain; 
 
 -resizeToFitChildren (-rtf) hvis sant, vil vinduet automatisk endre størrelse for å passe alle oppsett og kontrollerer du opprette 
 
 -title (-t) teksten vises i tittellinjen øverst i vinduet 
 
 -minimizeButton (-mnb) aktiverer eller deaktiverer minimer-knappen 
 
 -maximizeButton (-mxb) aktiverer eller deaktiverer påmaksimeringsknappen 
 
 -Bredde (w) bredden på vinduet i piksler 
 
 -Høyde (h) høyden på vinduet i piksler 
 
Step 10
 Akkurat nå har vinduet blitt opprettet i manuset, men en annen kommando er nødvendig for å vise det. Denne kommandoen vil alltid komme etter alt av UI-kommandoer for vinduet 
 Showwindow PivotControlMain; 
Step 11
 Våre full koden skal se slik ut:. 
 //Hoved Functionglobal proc EdW_PivotControl () {pivotControl;}; //Opprett UIglobal proc pivotControl () {if (`vindu -exists PivotControlMain`) {deleteUI PivotControlMain; }; vindu -rtf en -t "Edw Pivot Control" -mnb en -mxb 1-w 200 h 350 PivotControlMain, Showwindow PivotControlMain;}; 
Trinn 12
 Kilde i det nye kode og kjøre det fra Maya kommandolinjen. Dette er hva du bør få: 
 kilde EdW_PivotControl; EdW_PivotControl; < span class = "tutorial_image" > < img src = "http://cdn.tutsplus.com/cg/uploads/legacy/249_MAYA_EdWhetstone3/6.jpg" data-original-url = "http: //cgtuts.s3.amazonaws.com/249_MAYA_EdWhetstone3/6.jpg "alt =" "border =" 0 "/> < /span > 
Step 13
 The Window er øverste objektet i vårt UI hierarki. Alle oppsett og kontrollene er barn av dette objektet. Det første oppsettet vi bruker er en layout kolonne, for å holde knappene: 
 columnLayout -adjustableColumn en -rowSpacing 0 EPC_MainColumnLayout; 
 
 -adjustableColumn (-ac) kolonnen vil automatisk endre størrelse i henhold til bredden av vinduet 
 
 -rowSpacing (-RS) avstanden i piksler mellom hver rad i kolonnen 
 
Trinn 14
 Jeg har funnet ut at inkludert noen instruksjoner eller avklaringer innenfor UI kan gjøre manuset mer brukbar. Legge til en tekstkontroll til skriptet: 
 tekst -l "Flytt Pivot Til:"; 
 
 label (l) selve teksten i kontroll 
 
 
 
Step 15
 Deretter ønsker vi å legge til en layout å holde knappene øverst i vinduet for å flytte de svinger rundt. En layout vi kan bruke er Gridlayout, noe som skaper et sett med jevnt fordelte celler som inneholder ett objekt hver 
 Gridlayout -cwh 60 24 -NRC 2 5;. 
 
-numberOfRowsColumns (-NRC) angir antall horisontale rader og vertikale kolonner i nettet
 
 
Trinn 16
 Hver celle i nettet kan inneholde en eneste kontroll. Disse blir automatisk fylt ut når du oppretter objektene under oppsettet. I vårt tilfelle ønsker vi å opprette ni knapper. Vi vil bruke -kommandoen flagget senere for å fortelle knappene hvilken prosedyre å ringe: 
 knappen -l "Center" -knappen -l "Y Min" -knappen -l "Y Max" -knappen -l "Origin"; knappen -l "Selected" -knappen -l "X Min" -knappen -l "X Max" -knappen -l "Z Min" -knappen -l "Z Max"; 
 
 label (-l ) teksten som vises på knappen 
 
 
 
Trinn 17
 Nå trenger vi en måte å fortelle Maya at vi er ferdig med Gridlayout , og vi ønsker å legge til flere elementer til columnLayout. For å gjøre det, vil vi bruke en MEL kommando for å sette den overordnede av Gridlayout 
 setParent ..;. 
 ..; indikerer at du ønsker å forelder til layout ett trinn opp i hierarkiet kjeden. Vi kan også bruke navnet på oppsettet, men dette er bare nyttig hvis alle oppsettene har eksplisitte navn: 
 setParent EPC_MainColumnLayout; 
Trinn 18
 Vår pivotControl script skal nå se som dette: 
 global proc pivotControl () {if (`vindu -exists PivotControlMain`) {deleteUI PivotControlMain; }; vindu -rtf en -t "Edw Pivot Control" -mnb en -mxb 1-w 200 h 350 PivotControlMain; columnLayout -adjustableColumn en -rowSpacing 0 EPC_MainColumnLayout, tekst -l "Flytt Pivot Til:"; Gridlayout -cwh 60 24 -NRC 2 5 -Ag 1; knappen -l "Center"; knappen -l "Y Min"; knappen -l "Y Max"; knappen -l "Origin"; knappen -Jeg "Selected"; knappen -l "X Min"; knappen -l "X Max"; knappen -l "Z Min"; knappen -l "Z Max"; setParent ..; Showwindow PivotControlMain;};. 
Step 19
 Akkurat som Gridlayout, den columnLayout må være lukket ved å sette sin forelder 
 setParent ..; 
< h2> Trinn 20
 Kilde i manuset og se hva du får! 
 
 
 
Trinn 22
 UI prosedyren er gjort 
 //Hoved Functionglobal proc EdW_PivotControl () {pivotControl;}; //Opprett UIglobal proc pivotControl () {if (`vindu -exists PivotControlMain`) {deleteUI PivotControlMain; }; vindu -rtf en -t "Edw Pivot Control" -mnb en -mxb 1-w 200 h 350 PivotControlMain; columnLayout -adjustableColumn en -rowSpacing 0 EPC_MainColumnLayout; tekst -Jeg "Flytt Pivot Til:"; Gridlayout -cwh 60 24 -NRC 2 5 -Ag 1; knappen -l "Center"; knappen -l "Y Min"; knappen -l "Y Max"; knappen -l "Origin"; knappen -Jeg "Selected"; knappen -l "X Min"; knappen -l "X Max"; knappen -l "Z Min"; knappen -l "Z Max"; setParent ..; setParent ..; Showwindow PivotControlMain;}; 
Step 23
 Nå må vi lage koden for faktisk å flytte et objekt dreiepunkt. For å gjøre dette, vi kommer til å lage to prosedyrer som vil fungere sammen. 
 
epc_movePivotLocal vil hente markeringsrammen informasjon ved hjelp epc_getBounds å flytte dreie steder
Step 24
 Legg ut pseudo-kode for epc_getBounds:. 
 
 
 velg objektet gått fra epc_movePivotLocal 
 
 skrive resultatet av en spørres XForm kommando til en rekke 
 
 få gjennomsnitt av x, y og z minimumskrav og maksimumsgrenser returnert fra XForm 
 
 tilføye gjennomsnitt på retur rekke 
 
 returnerer markeringsrammen matrise sammen med gjennomsnitt 
 
Step 25
< p> skape skjelettet for prosedyren, komplett med en returtype og bestått argument
global proc float [] epc_getBounds (string $ objSel) {};.
Trinn 26
 . velg objektet vedtatt som et argument, og få markeringsrammen informasjon 
 global proc float [] epc_getBounds (string $ objSel) {velge -r $ objSel; float $ getBoundArray [] = `XForm -q -ws -bb `;}; 
 
 -query (-q) spør kommandoen, i stedet for å faktisk forvandle noe 
 
 -worldSpace (-ws) sørge for at 
 
 -boundingBox (- bb) returnerer MIN og MAX posisjoner av markeringsrammen 
 
 -boundingBox flagg returnerer seks verdier i en matrise: x minimum, x maks, y minimum, y maksimum, z minimum, og z maksimum . 
 
Step 27
 beregne gjennomsnitt mellom minimumskrav og maksimumsgrenser. Husk at arrays alltid starte med en indeks på null 
 flyte $ bbXAv = (($ getBoundArray [3] + $ getBoundArray [0]) /2);. //Xmax pluss xmin delt twofloat $ bbYAv = (($ getBoundArray [4] + $ getBoundArray [1]) /2); //ymax pluss ymin dividert med twofloat $ bbZAv = (($ getBoundArray [5] + $ getBoundArray [2]) /2); //zmax plus zmin delt av to 
Step 28
 beregne gjennomsnitt mellom minimumskrav og maksimumsgrenser. Husk at arrays alltid starte med en indeks på null 
 flyte $ bbXAv = (($ getBoundArray [3] + $ getBoundArray [0]) /2);. //Xmax pluss xmin delt twofloat $ bbYAv = (($ getBoundArray [4] + $ getBoundArray [1]) /2); //ymax pluss ymin dividert med twofloat $ bbZAv = (($ getBoundArray [5] + $ getBoundArray [2]) /2); //zmax plus zmin delt med to 
Trinn 28
 Tilføy nyberegnede gjennomsnitt og returnere den endelige rekke 
 $ getBoundArray [6] = $ bbXAv;. $ getBoundArray [7] = $ bbYAv; $ getBoundArray [8] = $ bbZAv; returnere $ getBoundArray; 
Trinn 29
 Den endelige prosedyren skal se slik ut: 
 global proc float [] epc_getBounds (string $ objSel) {velg - r $ objSel; float $ 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; returnere $ getBoundArray;}; 
Step 30
 Nå kan vi sette denne koden for å jobbe inne i vårt epc_movePivotLocal prosedyre. Skriv ut pseudo-kode: 
 
 skrive en liste over utvalgte objekter til en rekke 
 
 få den informasjonen for hvert objekt valgte markeringsrammen, bruker epc_getBounds prosedyren 
 
 opprette en switch-case statement å kontrollere hvor dreie skal flytte til 
 
Trinn 31
 skape skjelettet for prosedyren. Sett opp en for-i loop slik at koden kjøres en gang for hvert objekt er valgt i scenen 
 global proc epc_movePivotLocal (string $ modus) {string $ sel [] = `ls -sl`.; for ($ thisObj i $ sel) {//kode går her};}; 
Step 32
 Bruk prosedyren retur-verdien fra epc_getBounds å skrive en dupp utvalg: 
 float $ pos [] = `epc_getBounds $ thisObj`; 
Step 32
 Nå vil vi bruke en switch-case statement å faktisk flytte pivot rundt. Den grunnleggende strukturen i en switch-case er dette: 
 switch ($ variabel) {//variabelen kan være alle typer, inkludert strenger og flyter saken variableValue: //om variabelen kamper variableValue //kjøre denne koden pause; case otherValue: //kode her break;}; 
 switch-case uttalelsen er en brusende system, noe som betyr at hvis du ikke tar med "break" kommandoen etter hvert tilfelle, vil resten av tilfellene utfører som godt. For vår prosedyre, vil vi legge til en switch-case som vil tillate oss å bruke samme fremgangsmåte for å flytte en pivot til mange forskjellige stillinger. Vår switch-case vil se slik ut: 
 switch ($ modus) {case "senter": CenterPivot $ thisObj; gå i stykker; case "YMin": flytt -a -rpr $ pos [6] $ pos [1] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; }; 
Step 33
 Fortsett å legge saker til manuset, slik at hver av våre UI knapper har en tilsvarende sak. Den fullstendige prosedyren skal se slik ut: 
 global proc epc_movePivotLocal (string $ modus) {string $ sel [] = `ls -sl`; for ($ thisObj i $ sel) {float $ pos [] = `epc_getBounds $ thisObj`; switch ($ modus) {case "senter": CenterPivot $ thisObj; gå i stykker; case "YMin": flytt -a -rpr $ pos [6] $ pos [1] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; case "ymax": flytt -a -rpr $ pos [6] $ pos [4] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; case "opprinnelse": flytte -a -rpr 0 0 0 ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; case "Xmin-": flytt -a -rpr $ pos [0] $ pos [7] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; case "Xmax": flytt -a -rpr $ pos [3] $ pos [7] $ pos [8] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; case "Zmin": flytt -a -rpr $ pos [6] $ pos [7] $ pos [2] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; case "zmax": flytt -a -rpr $ pos [6] $ pos [7] $ pos [5] ($ thisObj + ".rotatePivot") ($ thisObj + ".scalePivot"); gå i stykker; }; };}; 
Step 33
 Vår siste prosedyre følger stort sett den samme ideen 
 global proc epc_movePivotToObject () {string $ selLast [] = `ls-Sl tail en. `; string $ copyToObj = $ selLast [0]; velge -deselect $ copyToObj; string $ Selset [] =` ls -sl`; float $ pivotSel [] = `XForm -q -piv -ws $ copyToObj`; print $ pivotSel; for (hver $ i $ Selset) {flytte -a $ pivotSel [0] $ pivotSel [1] $ pivotSel [2] ($ hver + ".rotatePivot") ($ hver + ".scalePivot"); };}; 
 Det er bare to nye flagg i denne prosedyren: 
 
 tail (-tl) bare skriver det siste objektet valgt til array (ls kommandoen) 
 
 -pivot (-piv) spør den nåværende plasseringen av pivot på et objekt (XForm kommando) 
 
Trinn 35
 Nå er alt som gjenstår er å gjøre våre knapper i UI faktisk ringe prosedyrene vi har skrevet 
 knappen -l "Center" -c "epc_movePivotLocal center" -knappen -l "Y Min" -c "epc_movePivotLocal ymin."; knappen -l "Y Max" - c "epc_movePivotLocal ymax" -knappen -l "Origin" -c "epc_movePivotLocal opprinnelse" -knappen -l "Selected" -c "epc_movePivotToObject" -knappen -l "X Min" -c "epc_movePivotLocal xmin" -knappen -l "X Max "-c" epc_movePivotLocal xmax "; knappen -l" Z Min "-c" epc_movePivotLocal zmin "-knappen -l" Z Max "-c" epc_movePivotLocal zmax "; 
 
 -kommandoen (c) samtaler en kommando eller en liste over kommandoer når du trykker på knappen 
 
Step 35
 Og vi er ferdig! 
 
 
 

