Skocz do zawartości

[MEL] Drobne pytania


Destroyer

Rekomendowane odpowiedzi

Hej! tu będę Was męczył drobnymi pytaniami na które sam mimo ogromnych wysiłków nie znalazłem odpowiedzi :)

 

1. Mam zdefiniowaną zmienną vector np $vtr czy da się ten wektor przypisać do np transformacji przez setAtt?

i czy da się wydobyć tylko jedną liczbę z tego vectora?

 

2. Jaką komendą utworzyć w oknie skryptu pole w którym będzie się wyświetlała aktualna wartość jakiegoś parametru ale bez możliwości jego zmiany?

  • Like 1
Odnośnik do komentarza
Udostępnij na innych stronach

  • Odpowiedzi 80
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Ad. 1.

 

$pierwszaZmienna = $vtr.x

$drugaZmienna = $vtr.y

$trzeciaZmienna = $vtr.z

 

przez setAttr mozesz podpinac wektor jako array 3-ech elementow.

 

Ad. 2.

Wyjasnij dokladniej - gdzie i jak ma sie ta zmienna pojawiac. Jakim oknie skryptu? Wlasnym oknie czy zdefiniowanym juz przez Maya Script Editor?

Odnośnik do komentarza
Udostępnij na innych stronach

beny dzieki za odpowiedź

 

1 dzięki diała :) dziwne bo robiłem to samo ale nie chiało mi wchodzić :/ może coś się pomyliłem bo byłem zmęczony... :)

 

2 chodzi mi o okno które tworzy się ze skryptu

 

if ( `window -exists DoIt` )

{ deleteUI DoIt; }

 

justDoIt;)

 

showWindow DoIt;

 

--edit-- dobra zamotałem się :D

 

zmieniam pytanie, dlaczego nie mogę podpiąć np translacjiX boxa przez

attrFieldGrp -attribute

a

attrFieldSliderGrp -attribute

działa bez problemu?

 

 

i kolejne pytanie czy attrFieldSliderGrp może wyświetlać zmienną a nie atrybut? albo czy jest coś co będzie tak dzialać i aktualizować się wraz ze zmianą zmiennej?

Edytowane przez Destroyer
Odnośnik do komentarza
Udostępnij na innych stronach

Darek, attrFieldGrp to jest kombo skladajace sie z 3-ech zmiennych, to sa tak na prawde 3 textboxy i jeden label tylko ze czesto tego sie uzywa wiec zrobili takie o kombo dla nas uzytkownikow. Wymaga ono jednak podania wektora (np. atrybutu Translate, scale lub rotate), a translateX jest pojedyncza zmienna floatem. Wiec dlaetgo nie zadziala.

attrFieldSliderGrp natomiast dziala w druga strone - podajesz mu floata, czyli np. translateX i dlatego dziala.

 

Jak nie chcesz podpinac atrybutu tylko zmienna to uzywasz floatSliderGrp a nie attrFieldSliderGrp.

 

Pozdroofki,

Beny

Odnośnik do komentarza
Udostępnij na innych stronach

string $AllObjects[] = {""};

 

int $iloscObiektow = 10;

 

for($i=0; $i

{

$newlyCreatedOne = `polySphere`;

appendStringArray($AllObjects, $newlyCreatedOne, 1);

}

 

print $AllObjects;

 

Prosze bardzo. Jak chcesz sie dobrac do shejpow tych obiektow rowniez to zamiast "1" w loopie wpisz 2.

 

Pozdrawiam,

Beny

Odnośnik do komentarza
Udostępnij na innych stronach

select $AllObjects Ci nie zadziała w Maya, w Max Scrypcie tak , ale niestety MEL troche kuleje w stosunku do Max Scripta :(( (chodzi o forme oczywiscie) i tutaj musisz zaznaczac obiekty pojedynczo.

 

Zeby zaznaczyc wszystkie obiekty z arraya powyzej odpal taki skrypcik:

 

select -clear;

 

for ($object in $AllObjects)

{

select -add $object;

}

Odnośnik do komentarza
Udostępnij na innych stronach

tak tylko że jak zrobisz recznie array i dodasz do niego kilka obiektów to za pomocą select $array; możesz go zaznaczyć bez problemu, gdzieś nawet w książce o mel-u to wyczytałem i na necie, ale ten array utworzony za pomocą tego kodu nie chce współpracować a co dziwne jestem niemal przekonany(ale teraz już trochę mniej) że raz udało mi się ten array zaznaczyć właśnie w ten sposób

maya czasami nie działa "coherent" ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Spoko, jak Ci sie uda to napisz jak to zrobiles, bo z tego co wiem "select" dziala tylko na DAG obiektach a nie na zmiennych, ale jezeli cos sie zmienilo to by bylo super! Bo generalnie select musialby byc przeciazony i sprawdzac co jest DAG obiektem a co nie a to mogloby byc dosc skomplikowane, ale fakt ze fajnie by bylo zeby to dzialalo jak w Maxie, ale tam nie ma struktury DG tylko wszystko jest w formie wodospadowej, wiec maja zadanie ulatwione.

 

ps. Moze z Maxem Ci sie pomylilo?

Odnośnik do komentarza
Udostępnij na innych stronach

z maxa nie korzystam więc nie mogo mi się pomylić :P

 

czytaj tu:

klik

 

if the array string &bill_nodes[] defined above had contained all the nodes in ... you can select these nodes with the comand

select $bill_nodes;

 

zrób sobie polysphere i skopiuj 3 razy

potem ręczenie robisz array

string $array[] = {"pSphere1", "pSphere2", "pSphere3", "pSphere4"};

print $array;

select $array;

 

i select $array; zaznacza wszystkie kulki ale ten array utworzony z Twojego kodu jakoś się opiera tej komendzie :)

 

ale pytanie pozostaje: whyyyy? :)

Odnośnik do komentarza
Udostępnij na innych stronach

Już wiele razy sie nacinałem na to że w MEL'u niby nie trzeba tak dokładnie deklarować zmiennych a jak przychodzi co do czego to się wykrzacza. Ale też ciekawostką jest fakt że to może nie działać jak nie zamkniesz kodu w klamrach. Ogólnie to od jakiegoś czasu uskuteczniam pythona jednak w Maya.

Odnośnik do komentarza
Udostępnij na innych stronach

aj Panowie Wy się bawicie Phytonami a ja nawet mel-em nie potrafię :)

 

 

i kolejne pytanie :)

mam array floatów jak z niech wybrać najmniejszą/ najwiekszą?

 

-Edit-

ok już sobie poradziłem ^^

 

// max value

float $array[] = {1,2,3,4};

float $test = 0;

 

for($value in $array)

{

 

if ($value > $test)

{

$test = $value;

}

};

print $test;

Edytowane przez Destroyer
Odnośnik do komentarza
Udostępnij na innych stronach

heh można i tak :)

 

btw a jak to będzie dla max value :) tzn ciekawy jestem czy jest jakiś kod który sprawdza ile jest obiektów w arrayu żeby wybrać ostatni bo ja bym to zrobił pewnie naokoło znowu :D

można sortować w descending order albo flipnąć arraya? :)

Odnośnik do komentarza
Udostępnij na innych stronach

oki mam kolejny problem

tworzę onko

dodaję części do usuwania okna jesli okno istnieje itd.

 

if ( `window -exists pfxx` ) {

deleteUI pfxx; // delete window when it exists

} ;

 

wszystko cacy tylko jak zmnieniam height/ width to okno się nie aktualizuje!? zmieniam nazwę okna i dziala, o co chodzi?! jak zaktualizować okno? nawet po zresetowaniu majki pozostają te same wartości sprzed resetu!?

jaka szalona logika za tym stoi? :)

Odnośnik do komentarza
Udostępnij na innych stronach

if ( `window -exists pfxx` )

deleteUI pfxx; // delete window when it exists

 

 

if (`windowPref -exists pfxx`)

windowPref -remove pfxx;

 

 

Ciekawostka - jak masz komendę warunkową if to nie musisz stawiać klamerek jeżeli chcesz w niej wykonać tylko jedną komendę.

Pozdro

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki wielkie Kroopson!

ale dziwi mnie to że nawet po zresetowaniu majki okno nadal miało stare ustawienia, jak to się dzieje, gdzie to się zapisuje i jaka za tym stoi zasada? :) w sumie drobiaz ale nie daje mi to spokoju i chciałbym wiedzieć jaki mechanizm za tym stoi :)

 

bartolomeo na szczęście Kroopson czuwa ;)

 

 

i przy okazji proste pytanie mam dwie kule jedna w grupie druga nie jak próbuję zaznaczyć kulkę po nazwie wywala błąd

 

select pSphere1;

 

// Error: More than one object matches name: pSphere1 //

 

żeby zaznaczyć kulke w grupie wystarczy dać

 

select group1|pSphere1;

 

a moje pytanie brzmi jak wybrać tą kulkę która nie jest w grupie tylko siedzi sobie spokojnie w scenie? :)

Odnośnik do komentarza
Udostępnij na innych stronach

dzięki Kroopson! że też sam na to nie wpadłem :P

 

i mam kolejne pytanie, a własciwie kilka :)

 

1. przy tworzeniu okna z przyciskami sliderami i takimi tam czy da się ustawić jakoś globalnie kolor tła

 

2. czy da się w kolorze tła -bgc uzyc vectora? bo jak próbuję color.x color.y color.z to mi nie wchodzi ale jak zorbię pojedyncze floaty z tylmi wartościami float $kolorR = color.x; itd. to działa. a chciałbym zrobic to tak żeby było mniej kodu. teraz mi przeszło przez myśl że mozna zrobić arraya to bedzie tylko jedna linijka a nie 4 ale może da się prościej :)

 

3. Zrobiłem sobie expresję do przełączania metriałów za pomocą:

 

if (global_move_scale.Material ==0)

sets -forceElement ball_SG ball_geo ;

else if (global_move_scale.Material ==1)

sets -forceElement crossSG ball_geo ;

 

ale geometria do której materaił jest przypisywany ma parent constarit i dotaję warna:

 

// Warning: Cannot add the following items to the set since the set has restrictions on membership: ball_geo_parentConstraint1 //

 

da się jakoś to obejść żeby nie wieć ostrzeżenia, albo czy jest jakaś inna metoda na przypisane materiału do obiektu? próbowałem hypershade -assign ale to wymaga seleckcji, i jak się powróci do selekcji sprzed wykoana expresii to już jest za dużo kodu :)

 

na razie tyle :)

Odnośnik do komentarza
Udostępnij na innych stronach

Ja tu raczej nic nie pomoge, ale moge sie o cos zapytac :)

Da sie jakos zrobic zeby jakims skrotem klawiszowym albo chociaz na shelfie mozna bylo przelaczac przesuwanie np vertexow "World/Normals average"? -najlepiej tab'em :P

 

Pozdrawiam :)

Odnośnik do komentarza
Udostępnij na innych stronach

mpta tak na szybko machnięty, pewnie można łatwiej ale działa :)

 

int $mode = `manipMoveContext -q -mode Move`;

if ($mode == 2)

manipMoveContext -e -mode 9 Move;

else if ($mode == 9)

manipMoveContext -e -mode 2 Move;

else

manipMoveContext -e -mode 2 Move;

 

możesz rzucić na shelfa, markingmenu albo przypiąc do klawisza jadnakoż nie wiem czy do tab-u się da najpewniej nie :)

Odnośnik do komentarza
Udostępnij na innych stronach

hej mam kolejne pytanie: jak sprawdzić jaki materiał ma zaznaczony obiekt?

próbowałem jakoś przez pickWalk, listconection itd ale i tak się nie udało :/

 

To nie jest juz takie "Drobne pytanie" :)) Ogolnie to nie ma czegos takiego jak przypisanie Materialu do Obiektu jak to dziala w Maxie i mimo ze to tak wyglada, to tak na prawde przypisujesz obiekt do shading grupy do ktorej sa podpiete shadery. Dlaczego tak glupio teoretyzuje? Poniewaz dzieki temu mozesz sprawdzic "Jaki jest material na obiekcie?".

 

Tutaj masz kodzik ktory Ci wypluje shading grupy do ktorych podpiete sa komponenty danego obiektu (poszczegolne facy moga byc gdzie indziej popodpinane):

 

string $allOutputs[] = (`listHistory -f true pSphere1` );
string $node = "";
for ($node in $allOutputs){
   if(`nodeType $node` == "shadingEngine") print ($node + "\n");
}

Majac juz dostep do $node bez problemu mozesz sprawdzic co jest popodpinane w shading grupach na inputach przez co znajdziesz swojego Świetego Grala :))

 

 

ps. Jak ktos (Krupson? :) ) zna szybszy sposob, prosze niech sie podzieli, bo ja od lat stosuje powyzsza metode i nie chcialbym jakis archaizmów szerzyć :)

Odnośnik do komentarza
Udostępnij na innych stronach

{
for ($selected in (`ls -sl`)) 	
for ($child in (`listRelatives -c -s $selected`))   
	for ($SG in (`listConnections -t "shadingEngine" $child`))
		print `listConnections -d 0 -s 1 ($SG + ".ss")`;
}

 

hmmm - u mnie dziala, moze u was tez zadziala. Listuje materialy przypisane do obiektu. Jak obiekt ma poprzypisywane rozne materialy do face'ow to sie kwasi i kilka razy listuje ten sam shader.

Edytowane przez Kroopson
Odnośnik do komentarza
Udostępnij na innych stronach

for ($selected in (`ls -sl`)){ 	
for ($child in (`listRelatives -c -s $selected`)){
$sets = `listSets -t 1 -o $child`;
for ($SG in $sets)
		print `listConnections -d 1 -s 1 ($SG + ".ss")`;
}
}

 

Ok - inne podejscie, nie tak zgrabnie chociaz by sie dalo ale mi sie nie chce. To mi listowalo wszystkie materialy przypisane do obiektu.

pozdroweczki.

Kroops

 

(jade na urlopas)

Odnośnik do komentarza
Udostępnij na innych stronach

for ($selected in (`ls -sl`))

for ($child in (`listRelatives -c -s $selected`))

for ($SG in (`listSets -t 1 -o $child`))

print `listConnections -d 1 -s 1 ($SG + ".ss")`;

Wyczyscilem :))

 

 

Milego urlopu :)

Odnośnik do komentarza
Udostępnij na innych stronach

To prawda że nie moge w ten sposób wczytać materiałów do zmiennej ale ta " comanda" ;) zaznacza materiały przypisane do obiektu i żeby dodać je do zmniennej to już prosta droga :)

 

hyperShade -shaderNetworksSelectMaterialNodes

$test = `ls -sl`;

print $test

Odnośnik do komentarza
Udostępnij na innych stronach

Dwa pytania:

 

1. czy mogę dodawać do arraya jakieś wartości tj floaty/ int w taki sposów jak za pomocą appendstringarray przy stringach? :)

 

2. czy da się za pomocą buttona w oknie zmienić kolor tła i/lub logo w tymże oknie interaktywnie i bez przeładowania okna? :) nie interaktywnie i z przeładowaniem też nie wiem jak zrobić :D

Odnośnik do komentarza
Udostępnij na innych stronach

1. Dobre pytanie, sam bym sie dowiedzial. Napisalem sobie kiedys taka funkcje i zawsze z niej korzystam, bo dziala, ale jezeli jest jakas funkcja MELowa to by bylo fajnie :)

 

proc float[] appendFloatArrays(float $masterArray[], float $arrayToAdd[])

{

int $i = 0;

int $counter = 0;

 

for($i = size($masterArray), $counter = 0; $counter

 

return $masterArray;

}

 

 

2. Odswiezanie okien w Maya mocno kuleje. Czasami musze stosowac glupie tricki, jak wysuniecie okna poza ekran i jego powrot spowrotem w to samo miejsce zeby sie odswiezylo (zdaje egzamin ale to dosc malo eleganckie rozwiazanie), ale z bgc okna Ci nie pomoge. To jest jakis bug i tyle.

Odnośnik do komentarza
Udostępnij na innych stronach

funkcji chyba nie ma - wymyslilem cos takiego

 

{
//definiowanie array'ow - arrS: z niego bedziemy kopiowac
// arrD - on jest celem kopiowania

int $arrS[] = {1, 2, 3, 4, 5};
int $arrD[] = {6,7,8,9,10};

// kopiowanie z jednego w drugiego
for ($Sors in $arrS) $arrD[size($arrD)] = $Sors;

print $arrD;
}

 

Dzieki temu nie trzeba pisac dodatkowej funkcji.

Pozdrowka

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki wielkie chłopaki za pomoc! :) świetny sposób

 

ale ... mam kolejny problem:

 

jeeezus fucken christ! powiedzcie czy mam tu coś źle bo nie mogę zaznaczyć w żaden sposób tego arraya?

przez select nie mogę, przez jedną i drugą pętle for też nie wchodzi wywalając error:

 

// Error: No object matches name: //

 

wyprinowanie całego array nie jest problemem i zaznaczenie pojedyńczego elementu też dziala, ale w petli nie widzi zmiennej tak jak prze select mimo, że array został zdefiniowany wczesniej?! wtf? gdzie jest błąd?

 

global string $all[];

clear$all;

string $allPFXBrushes[] = `ls -type brush`;

for ($obj in $allPFXBrushes)

{

$objtrans =`listConnections -d 1 -s 0 $obj `;

appendStringArray($all, $objtrans, 1 );

}

 

print $all;

int $x = size ($all);

select -clear;

for ($i=0; $i

{

select -add $all[$i];

}

 

------------------------------------------------------------

 

i przy okazji co zrobić kiedy hurotowo łączę coś z czymś ale kilka obiektów już jest połączonych w dokładnie ten sposób jaki chcę połączyć i wywala mi błąd:

 

Warning: 'ramp1.outColor' is already connected to 'Tubes1.color1'. //

 

czy jest jakaś prosta opcja ignorowanai tego i kontynowania pętli czy tylko przez if..?

 

--------------------------------------------

i ostatnie

mam floatSliderGrp mogę sobie zmienić długośc lebela i fielda ale czemu slider nie daje się zmienić?

 

 

i btw czy mel to momentami taka nieprzewidywalna padaka czy mi się wydaje? :D

Odnośnik do komentarza
Udostępnij na innych stronach

Pewnie nie zwrociles uwagi ale print $all printuje Ci najpierw pusty znak, poniewaz zdefiniowales $all na poczatku z pustym znakiem na czele. Append Ci go nie nadpisal i zaczal dodawac na kolejne pozycje stringi pozostawiajac Twoj index "0" jako null. Print sobie z tym poradzi ale select juz nie. Zmien sobie $i =0 na $i=1 i po sprawie, albo rozwiaz sobie na swoje potrzeby ten problem zgodnie z tym co napisalem powyzej.

 

Co do warningow i "expected errors" uzywaj catch lub catchQuiet.

 

Co do floatSliderGroup HGW, ja robie zawsze swoje grupy, chyba ze na szybko cos buduje, wiec tu Ci nie pomoge :(

 

Tak, MEL czasami is a bitch i trzeba miec do niego cierpliwosc. Ogolnie unikaj zmiennych i funkcji globalnych, usuwaj wszystko co stworzyles a juz nie bedziesz korzystal, czysc kontrolowanie arraye to wiekszosc problemow Cie ominie.

 

Pozdrawiam! :)

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się



×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności