Zawartość dodana przez lechoo
-
Kurs MAX Script - temat 3 - podsumowanie
Dzieki za zwrocenie uwagi. Juz poprawilem.
-
Kurs MAX Script - temat 3 - podsumowanie
Na koniec link do wszystkich skryptow: tematy03.zip W ciagu kilku dni nastepny temat ktory bedzie rozwinieciem tego, dodamy do skryptu kilka przydatnych rzeczy.
-
Kurs MAX Script - temat 3 - podsumowanie
Autor: VGTsXVII utility UtilityExample \"Zad 03\" ( --dane wstepne group \"wybor danych do zapisu\" ( checkbox nazwa \"Nazwa\" checked:true checkbox pozycja \"wspolrzedne\" checked:true checkbox kolor \"Kolor siatki\" checked:false checkbox vert \"Vertex\'y - ilosc\" checked:false checkbox face \"Face\'y - ilosc\" checked:false ) button zapis \"zapisz do pliku\" on zapis pressed do ( --przygotowanie zmiennych godz = 0 min = 0 sek = 0 --obliczenie aktualnego czasu sek = timestamp() / 1000 while sek > 60 do ( min = min+1 sek = sek-60 ) while min > 60 do ( godz = godz + 1 min = min-60 ) --stworzenie pliku i wpisywanie danych plik_nazwa = getsavefilename types:\"Spis obiektów|*.txt|\" if plik_nazwa != undefined then ( plik = createfile plik_nazwa zaznaczone = getcurrentselection() format \"Czas wygenerowania statystyki: %:%:%\\n\\n\" godz min sek to:plik format \"Zapisane dane o zaznaczonych obiektach:\\n\" to:plik format \"LICZBA PORZADKOWA\\n\" to:plik if nazwa.checked==true then format \"%\\n\" \"NAZWA\" to:plik if pozycja.checked==true then format \"%\\n\" \"WSPOLRZEDNE\" to:plik if kolor.checked==true then format \"%\\n\" \"KOLOR\" to:plik if vert.checked==true then format \"%\\n\" \"ILOSC VERTEX\'OW\" to:plik if face.checked==true then format \"%\\n\" \"ILOSC FACE\'OW\" to:plik format \"--------------------\\n\" \"kolor\" to:plik for i = 1 to zaznaczone.count do ( format \"%\\n\" i to:plik if nazwa.checked == true then (format \"%\\n\" zaznaczone.name to:plik) if pozycja.checked == true then (format \"%\\n\" zaznaczone.position to:plik) if kolor.checked == true then (format \"%\\n\" zaznaczone.wirecolor to:plik) if vert.checked == true or face.checked == true then kopia=snapshotasmesh zaznaczone if vert.checked == true then (format \"%\\n\" kopia.numverts to:plik) if face.checked == true then (format \"%\\n\" kopia.numfaces to:plik) format \"--------------------\\n\" to:plik ) close plik edit plik_nazwa ) ) ) W tym skrypcie jest zdecydowanie najwiecej ekstra dodatkow. Po pierwsze: plik_nazwa = getsavefilename types:\"Spis obiektów|*.txt|\" Polecenie to powoduje wyswietlenie zwyklego windowsowego dialogu umozliwiajacego wybor nazwy i katalogu dla pliku. Po drugie pierwsze polecenia umozliwiajace operacje na meshu numverts (ilosc vertexow) i numfaces (ilosc faceow). Tym zajmiemy sie jeszcze dokladnie w ktoryms z nastepnych tematow. Widze tu tylko jeden slaby punkt. Co bedzie jesli wsrod zaznaczonych obiektow bedzie np. swiatlo omni? Zwroccie uwage na sposob obliczania czasu stworzenia statystyki przy pomocy timestamp(), ktore to polecenie zwraca ilosc milisekund od polnocy. Musiales sie z tym niezle namordowac :)
-
Kurs MAX Script - temat 3 - podsumowanie
Autor: Sypo -- zapis do pliku summary_file = createFile \"C:\\dane.txt\" out_file = summary_file -- tekst w pliku format \"File Location: \" to:out_file format \"%\" out_file to:out_file format \"\\n\" to:out_file format \"\\n\" to:out_file format \"Lp. Name Position\" to:out_file format \"\\n\" to:out_file for i = 1 to selection.count do ( format \"%. %,%\" i selection.name selection.pos to:out_file format \"\\n\" to:out_file ) close out_file edit out_file Brak czasu wygenerowania statystyki. Co do nazwy pliku, w temacie chodzilo o plik ze scena a nie ze statystyka, ale to drobnostka. To co najwarzniejsze czyli statystyka tworzy sie dobrze. Na koncu podales zmienna o zlym typie w poleceniu edit. Zmienna out_file jest typu filestream (reprezentuje plik i umozliwia wykonywanie na nim operacji np. zamkniecia jak linijke wyrzej), natomiast edit potrzebuje zmiennej typu string, czyli sciezki do pliku wiec prawidlowo byloby np. edit \"C:\\dane.txt\"
-
Kurs MAX Script - temat 3 - podsumowanie
Autor: Bart utility Statystyka \"Statystyka\" ( label l1 \"\" edittext Sciezka \"Sciezka\" text:\"c:\\dane.txt\" label l2 \"\" button create \"Zapisz statystyke do pliku\" on create pressed do ( out_name = Sciezka.text out_file = createfile out_name indeks = \"Lp. Nazwa Pozycja\" spacja = \" \" format \"Nazwa pliku: \" to:out_file format \"%\\n\" maxFileName to:out_file format \"Czas i data: \" to:out_file format \"%\\n\\n\" localTime to:out_file format \"%\\n\" indeks to:out_file for i in 1 to selection.count do ( format \"%.\" i to:out_file format \"%\" spacja to:out_file format \"%\" selection.name to:out_file format \"%\" spacja to:out_file format \"%\\n\" selection.pos to:out_file ) close out_file edit out_name ) ) Wersja duzo bardziej przejrzysta niz w moim wykonaniu z prosty interfejsem umozliwiajacym podanie nazwy pliku. Na koncu bardzo fajna rzecz o ktorej nie pomyslalem czyli \"edit out_name\" ktore wyswietla w nowym oknie tresc nowoutworzonego pliku.
-
Kurs MAX Script - temat 3 - podsumowanie
No coz, tym razem frekwencja slabiutka :( Zobaczymy jak bedzie nastepnym razem. A ponizej moja wersja skryptu: summary_file = createFile \"C:\\summary.txt\" scene_file = maxFileName if scene_file == \"\" then scene_file = \"Untitled\" format \"File name: %\\n\" scene_file to:summary_file format \"Time & Date: %\\n\\n\" localTime to:summary_file format \"Lp.\\tName\\tPosition\\n\" to:summary_file for i in 1 to selection.count do ( format \"%.\\t%\\t%\\n\" i selection.name selection.pos to:summary_file ) close summary_file Mysle ze jesli chodzi o operacje na pliku czyli createFile i close to polecenia te nie wymagaja komentarza. Nazwe pliku ze scena zwraca polecenie maxFileName, jesli scene nie byla jeszcze zapisywana zwrocony zostanie lancuch o zerowej dlugosci. Date i czas zwraca polecenie localTime.
-
Kurs MAX Script - temat 3
Wiedzialem ze o czyms zapomnialem :D Poniedzialek, 10 listopada
-
Kurs MAX Script - temat 3
Tym razem cos lzejszego. Proponuje Wam napisanie skryptu ktory generuje cos w rodzaju statystyki sceny i zapisuje ja do pliku. Koncowy efekt moze wygladac np. tak: File name: test.max Time & Date: 2003-10-31 22:41:21 Lp. Name Position 1. Dummy01 [0,-60,10] 2. Box01 [0,0,0] 3. Omni01 [100,-100,100] 4. Curve01 [55.2338,71.132,0] 5. Plane01 [0,0,0] Najpierw nazwa pliku ze scena, potem data i czas wygenerowania statystyki i podstawowe dane (nazwa i pozycja) ZAZNACZONYCH obiektow. Moze to sprawic pewien problem wiec od razu napisze jak dostac sie do zaznaczonych obiektow. W max scripcie jest globalna tablica selection w ktorej znajduja sie wszystkie zaznaczone obiekty, jesli nic nie jest zaznaczone tablica jest pusta (ma zerowa dlugosc). Krotki przyklad: for i in 1 to selection.count do ( print selection.name ) Skrypt spowoduje wypisanie w oknie listenera nazw wszystkich zaznaczonych obiektow. count zwraca ilosc elementow w tablicy selection (oczywiscie analogicznie jest we wszystkich tablicach w scripcie). Potem juz tylko odwolujemy sie do kolejnych elementow w tablicy pobierajac ich nazwe. Co do zapisu do pliku zajrzyjcie do scriptowego helpa pod temat \"How To ... Output Geometry Data To Text File - Part One\". Znajdziecie tam wszystko co jest potrzebne do tego tematu. Skrypt jest narazie bardzo prosty, ale w nastepnym temacie dodamy do niego kilka bajerow. Gotowe skrypty slijcie na maila. Powodzenia!
-
Kurs MAX Script - temat 2 - podsumowanie
Faktycznie. Moj blad :( Nastepnym razem postaram sie oceniac skrypty na bierzaco jak przychodza (oczywiscie u siebie lokalnie, nie na forum), a nie wszystko na koniec, wtedy nie bedzie takich wpadek.
-
Jaki LCD 19\" i jaka grafika do niego
Moze Neovo F419 albo S19, tylko ze ten drugi dosc drogi. Ja uzywam Neovo S17 i bardzo sobie chwale. No i ten wyglad :D Dzieki szybie obraz jest fantastyczny, szczegolnie fotki. Zajrzyj sobie na www.monitor.pl. Maja tam kapitalna wyszukiwarke monitorow, mozna zdefiniowac mnostwo parametrow: cena, przekatna itp.
-
Plug-in do 3dsmaxa
W katalogu z max sdk jest kilka przykladow pluginow do exportu.
-
Kurs MAX Script - temat 1 - podsumowanie
Ponizej link do pliku ze wszystkimi skryptami. tematy01.zip
-
Kurs MAX Script - temat 2 - podsumowanie
Ponizej link do zipa ze skryptami z tego tematu. tematy02.zip
-
Kurs MAX Script - temat 2 - podsumowanie
I drugi temat za nami :) Temat wydaje mi sie dosc prosty choc czesc osob twierdzila przeciwnie, moze to wyjasnia slabsza frekwencje. Musze dobrze przemyslec nastepny , tak zeby byl lepiej wywazony. Do piatku wrzuce go na forum. Swoja droga ciekawe czy ustanowilem jakis rekord w dlugosci pojedynczego posta :)
-
Kurs MAX Script - temat 2 - podsumowanie
Autor: Warui utility czajnik_uti \"Czajnik (Kurs MAX Script 2)\" ( button utwoz \"Utworz Czajnik\" enabled:true group \"Parametry\" ( colorpicker kolor \"Kolor:\" color:(random black white) enabled:false align:#center width:90 spinner rozmiar \"Rozmiar:\" range:[0,100,20] type:#worldunits fieldwidth:40 enabled:false align:#center slider segmenty \"Segmantacja:\" range:[0,15,4] type:#integer enabled:false align:#center label lab1 \"Pokaz:\" align:#left enabled:false checkbox pokrywka \"Pokrywka\" checked:true across:2 enabled:false checkbox ucho \"Ucho\" checked:true offset:[10,0] enabled:false checkbox dziobek \"Dziobek\" checked:true across:2 enabled:false checkbox korpus \"Korpus\" checked:true offset:[10,0] enabled:false ) button skasuj \"Skasuj Czajnik\" enabled:false group \"O skrypcie\" ( label lab2 \"\"Czajnik\" by Warui\" label lab3 \"© 2003\" ) rollout ustawienia \"Ustawienia\" ( label lab4 \"Pozycja czajnika:\" align:#left spinner x \"x:\" range:[-1000,1000,0] type:#worldunits fieldwidth:40 align:#left across:3 spinner y \"y:\" range:[-1000,1000,0] type:#worldunits fieldwidth:40 align:#center spinner z \"z:\" range:[-1000,1000,0] type:#worldunits fieldwidth:40 align:#right button ok \"OK\" width:100 on ok pressed do ( czajnik = teapot radius:20 segs:4 wirecolor:kolor.color pos:[x.value,y.value,z.value] destroydialog ustawienia; ) ) function zmien_dostepnosc = ( utwoz.enabled = not utwoz.enabled skasuj.enabled = not skasuj.enabled kolor.enabled = not kolor.enabled rozmiar.enabled = not rozmiar.enabled segmenty.enabled = not segmenty.enabled lab1.enabled = not lab1.enabled pokrywka.enabled = not pokrywka.enabled ucho.enabled = not ucho.enabled dziobek.enabled = not dziobek.enabled korpus.enabled = not korpus.enabled ) on utwoz pressed do ( zmien_dostepnosc() createdialog ustawienia modal:true width:250 ) on skasuj pressed do ( zmien_dostepnosc() if(isvalidnode czajnik) then delete czajnik -- resetujemy do ustawien poczatkowych kolor.color = (random black white) rozmiar.value = 20 segmenty.value = 4 pokrywka.checked = true ucho.checked = true dziobek.checked = true korpus.checked = true ) on kolor changed nowy_kolor do czajnik.wirecolor = nowy_kolor on rozmiar changed nowy_rozmiar do czajnik.radius = nowy_rozmiar on segmenty changed nowa_segmentacja do czajnik.segs = nowa_segmentacja on pokrywka changed zmiana_pokrywki do czajnik.lid = zmiana_pokrywki on ucho changed zmiana_ucha do czajnik.handle = zmiana_ucha on dziobek changed zmiana_dziobka do czajnik.spout = zmiana_dziobka on korpus changed zmiana_korpusu do czajnik.body = zmiana_korpusu ) Chyba najciekawszy skrypt. Brak deklaracji zmiennej ale zwroccie uwage na dwie rzeczy: - funkcje createdialog ktora powoduje wyswietlenie wczesniej zdefiniowanego rolloutu jako osobnego okienka - sposob kasowania czajniczka if(isvalidnode czajnik) then delete czajnik Wlasciwie zawsze powinno sie tak robic. Funkcja IsValidNode sprawdza czy rzeczywiscie czajnik istnieje i dopiero wtedy mozliwe jest jego skasowanie. Bez tego zabezpieczenia skrypt wysypalby sie gdybym skasowal teapota klawiszem Del a potem probowal zrobic to jeszcze raz skryptem.
-
Kurs MAX Script - temat 2 - podsumowanie
Autor: VGTsXVII utility opcje \"VGTsXVII_Teapot\" ( global obiekt button przycisk01 \"Create\" colorpicker kolor \"Wire color:\" color:[255,255,255] align:#center enabled:false on kolor changed new_col do selection.wirecolor = new_col spinner wielkosc \"Wielkosc:\" range:[0,100,10] align:#center fieldwidth:25 type:#integer enabled:false on wielkosc changed val do selection.radius = val slider gestosc \"podzial:\" range:[1,32,4] ticks:16 align:#center enabled:false on gestosc changed val do obiekt.segs = val checkbox box1 \"pokrywka\" offset:[20,0] enabled:false checked:true on box1 changed val do obiekt.lid=val checkbox box2 \"dziobek\" offset:[20,0] enabled:false checked:true on box2 changed val do obiekt.spout=val checkbox box3 \"uchwyt\" offset:[20,0] enabled:false checked:true on box3 changed val do obiekt.handle=val checkbox box4 \"korpus\" offset:[20,0] enabled:false checked:true on box4 changed val do obiekt.body=val button przycisk02 \"Delete\" enabled:false on przycisk01 pressed do ( obiekt=teapot() obiekt.wirecolor=[255,255,255] obiekt.radius=10 obiekt.segs=4 select(obiekt) kolor.enabled=true wielkosc.enabled=true gestosc.enabled=true box1.enabled=true box2.enabled=true box3.enabled=true box4.enabled=true przycisk02.enabled=true ) on przycisk02 pressed do ( delete(obiekt) kolor.color=[255,255,255] kolor.enabled=false wielkosc.value=10 wielkosc.enabled=false gestosc.value=4 gestosc.enabled=false box1.checked=true box1.enabled=false box2.checked=true box2.enabled=false box3.checked=true box3.enabled=false box4.checked=true box4.enabled=false przycisk02.enabled=false ) Wszystko w porzadku. Tym razem obiekt zostal zadeklarowany jako globalny. Roznica polega na tym ze wtedy jest widziany tez przez inne skrypty, co pozwalaloby np. wymieniac im dane. Az sie prosi o jakies zadanie na ten temat :D
-
Kurs MAX Script - temat 2 - podsumowanie
Autor: Sypo utility skrypt \"Zadanko\" ( local pot rollout cre \"Create\" ( group \"Temat 2\" ( button tea \"Teapot\" width:45 height:20 button closet \"Close Teapot\" enabled:false offset:[1,5] spinner rad \"Radius: \" range:[1,50,20] width:80 height:25 enabled:false offset:[23,25] type:#float slider seg \"Segments: \" range:[4,32,12] enabled:false type:#integer colorpicker kol \"Kolor: \" color:[77,110,141] width:80 height:20 enabled:false offset:[13,5] ) group \"Fragmenty\" ( checkbox bod \"Body\" checked:true enabled:false checkbox han \"Handle\" checked:true enabled:false checkbox spo \"Spout\" checked:true enabled:false checkbox lid \"Lid\" checked:true enabled:false ) on tea pressed do ( pot = Teapot radius:20 pot.segs = seg.value pot.wirecolor = kol.color pot.name = \"Czaj\" closet.enabled = not closet.enabled rad.enabled = not rad.enabled seg.enabled = not seg.enabled kol.enabled = not kol.enabled bod.enabled = not bod.enabled han.enabled = not han.enabled spo.enabled = not spo.enabled lid.enabled = not lid.enabled ) on closet pressed do ( delete pot closet.enabled = not closet.enabled rad.value = 20 rad.enabled = not rad.enabled seg.enabled = not seg.enabled kol.enabled = not kol.enabled bod.enabled = not bod.enabled bod.checked = on han.enabled = not han.enabled han.checked = on spo.enabled = not spo.enabled spo.checked = on lid.enabled = not lid.enabled lid.checked = on ) on rad changed value do pot.radius=rad.value on seg changed value do pot.segs = seg.value on kol changed new_col do pot.wirecolor = kol.color on bod changed new_checked do pot.body = bod.checked on han changed new_checked do pot.handle = han.checked on spo changed new_checked do pot.spout = spo.checked on lid changed new_checked do pot.lid = lid.checked ) on skrypt open do ( addRollout cre ) on skrypt close do ( removeRollout cre ) ) Wszystko w najlepszym porzadku. Zwroccie uwage na tworzenie wlasnego rolloutu i zdarzenia on skrypt open do on skrypt close do ktore pozwalaja przygotowac sobie jakies dane i posprzatac po sobie gdy skrypt jest zamykany.
-
Kurs MAX Script - temat 2 - podsumowanie
Autor: leander utility czajnik \"Czajnik Manager v1.0\" ( button stworz \"Stwórz\" align:#left across:2 tooltip:\"Stwórz czajnik\" button skasuj \"Skasuj\" align:#right enabled:false tooltip:\"Skasuj czajnik\" spinner rozmiar \"Rozmiar:\" range:[0,100,25] type:#float enabled:false slider siatka \"Szczegolowosc siatki:\" range:[0,15,5] type:#integer enabled:false ticks:15 checkbox pokrywka \"Pokrywka\" enabled:false checked:true checkbox dziobek \"Dzióbek\" enabled:false checked:true checkbox uchwyt \"Uchwyt\" enabled:false checked:true checkbox korpus \"Korpus\" enabled:false checked:true on stworz pressed do ( myCZAJNIK = teapot() skasuj.enabled = true rozmiar.enabled = true siatka.enabled = true pokrywka.enabled = true dziobek.enabled = true uchwyt.enabled = true korpus.enabled = true ) on rozmiar changed val do myCZAJNIK.radius = val on siatka changed val do myCZAJNIK.segs = val on pokrywka changed STATUS do ( if STATUS == false then myCZAJNIK.lid = false else myCZAJNIK.lid = true ) on dziobek changed STATUS do ( if STATUS == false then myCZAJNIK.spout = false else myCZAJNIK.spout = true ) on uchwyt changed STATUS do ( if STATUS == false then myCZAJNIK.handle = false else myCZAJNIK.handle = true ) on korpus changed STATUS do ( if STATUS == false then myCZAJNIK.body = false else myCZAJNIK.body = true ) on skasuj pressed do ( delete(myCZAJNIK) -- \"zerowanie\" zmniennych: skasuj.enabled = false rozmiar.enabled = false siatka.enabled = false rozmiar.value = 25 siatka.value = 5 pokrywka.enabled = false dziobek.enabled = false uchwyt.enabled = false korpus.enabled = false pokrywka.state = true dziobek.state = true uchwyt.state = true korpus.state = true ) ) Poza brakiem deklaracji zmiennej przechowujacej tepot wszystko OK. Zwrocilem uwage na sposob ustawiania widocznosci poszczegolnych elementow czjniczka. on korpus changed STATUS do ( if STATUS == false then myCZAJNIK.body = false else myCZAJNIK.body = true ) Mozna duzo prosciej, przeciez w zmiennej STATUS jest juz potrzebna Ci wartosc. on korpus changed STATUS do CZAJNIK.body = STATUS
-
Kurs MAX Script - temat 2 - podsumowanie
Autor: BooM-Bel utility bmb \"BooM-Bel\" ( button tp \"czajniczek\" -- tworzenie czajniczka colorpicker wctp \"kolor\" color:[125,125,125] enabled:false-- określenie koloru siatki spinner rtp \"romiar\" range:[1,50,10] type:#integer enabled:false-- wielkość czajniczka slider stp \"siatka\" range:[1,12,6] type:#integer enabled:false-- szczegółowość siatki Group \"ukryj czesci dzbanka\" -- ukrywanie elementów ( checkbox cb1 \"przykrywka\" enabled:false checked:true-- przykrywka checkbox cb2 \"dziubek\" enabled:false checked:true-- dziubek checkbox cb3 \"uszko\" enabled:false checked:true-- uszko checkbox cb4 \"dzbanuszek\" enabled:false checked:true-- cały dzbanuszek ) button ktp \"kasuj\" enabled:false-- kasowanie czajniczka on tp pressed do --tworzenie dzbanka i udostępnianie pozostałych funkcjii ( tpo = teapot radius:rtp.value tpo.name = \"dzbanuszek\" tpo.wirecolor = wctp.color tpo.segs = stp.value wctp.enabled=true rtp.enabled=true stp.enabled=true cb1.enabled=true cb2.enabled=true cb3.enabled=true cb4.enabled=true ktp.enabled=true ) on wctp changed new_col do -- określenie koloru siatki ( tpo.wirecolor = wctp.color ) on rtp changed value do-- wielkość czajniczka ( tpo.radius=value ) on stp changed value do-- szczegółowość siatki ( tpo.segs=value ) on cb1 changed false do-- ukrywanie przykrywka ( tpo.lid=false ) on cb1 changed true do-- pokazywanie przykrywka ( tpo.lid=true ) on cb2 changed false do-- ukrywanie dziubek ( tpo.spout=false ) on cb2 changed true do-- pokazywanie dziubek ( tpo.spout=true ) on cb3 changed false do-- ukrywanie uszka- ( tpo.handle=false ) on cb3 changed true do-- pokazywanie uszka ( tpo.handle=true ) on cb4 changed false do-- ukrywanie dzbanka ( tpo.body=false ) on cb4 changed true do-- pokazywanie dzbanka ( tpo.body=true ) on ktp pressed do --kasowanie dzbanka i ukrywanie pozostałych funkcjii ( delete tpo wctp.enabled=false rtp.enabled=false stp.enabled=false cb1.enabled=false cb2.enabled=false cb3.enabled=false cb4.enabled=false ktp.enabled=false ) ) Jedyny problem to brak deklaracji zmiennej o ktorej pisalem post wczesniej. Dajcie znac ktorej wersji maxa uzywacie, ja mam 5.0 i u mnie bez tej deklaracji niestety nie chodzilo.
-
Kurs MAX Script - temat 2 - podsumowanie
Autor: Bartłomiej Cysewski utility Bart \"Temat 2\" ( --definicja elementów interfejsu button b1 \"Stwórz\" colorpicker b2 \"Kolor siatki\" spinner b3 \"Rozmiar\" range:[1,100,25] type:#integer slider b4 \"Szczegółowość siatki\" range:[3,20,4] checkbox c1 \"Dziobek\" checkbox c2 \"Pokrywka\" checkbox c3 \"Uchwyt\" checkbox c4 \"Korpus\" button b5 \"Usuń\" --tworzenie teapot\'a on b1 pressed do ( tea = teapot() ) --zmiana koloru siatki on b2 changed col do ( tea.wirecolor = col ) --zmiana rozmiaru teapot\'a on b3 changed rad do ( tea.radius = rad ) --zmiana gęstości siatki on b4 changed seg do ( tea.segs = seg ) --ukrycie dzióbka on c1 changed a1 do ( tea.spout = not tea.spout ) --ukrycie pokrywki on c2 changed a2 do ( tea.lid = not tea.lid ) --ukrycie uchwytu on c3 changed a3 do ( tea.handle = not tea.handle ) --ukrycie korpusu on c4 changed a4 do ( tea.body = not tea.body ) --usunięcie teapot\'a on b5 pressed do ( delete $teapot01 ) ) --koniec utility Tutaj pojawia sie problem ktory mialem z chyba polowa skryptow. Jesli spojrzycie na poprzedni skrypt zauwarzycie deklaracje w trzeciej linijce local pot Dzieki temu zmienna pot jest widoczna w calym skrypcie, natomiast tutaj zmienna tea czyli ta w ktorej przechowywany jest teapot jest widoczna tylko w zdarzeniu on b1 pressed do Efekt jest taki ze w momencie kiedy proboje zmienic jakis parametr script sie wywala bo w zdarzeniu np. on c3 changed a3 do ( tea.handle = not tea.handle ) nie ma deklaracji tej zmiennej i nie jest ona tu znana. Podejrzewam ze czesc z Was mogla pisac w maxie 3 gdzie wszystkie zmienne byly deklarowane domyslnie jako globalne i wtedy nie ma takiego problemu. Natomiast w maxie 4 i 5 zmienne domyslnie ustawiane sa na lokalne. Kiedy przesiadlem sie na maxa 4 nie wiedzialem o tym i mialem spore problemy bo nic mi nagle nie dzialalo. Musze jeszcze wspomniec o kasowaniu teapota on b5 pressed do ( delete $teapot01 ) Jak widac odwolanie do obiektu nastepuje przez jego nazwe, moze to rodzic problemy jesli w scenie juz byl inny czajnik o takiej samej nazwie.
-
Kurs MAX Script - temat 2 - podsumowanie
Autor: Bart Utility czajnik \"Czajnik\" ( local pot label l1 \"\" button tea \"Create Teapot\" label l2 \"\" colorpicker Pik \"Wire color:\" color:[0,0,255] enabled:false label l3 \"\" group \"Teapot parts\" ( checkbox Body \"Body\" checked:true enabled:false checkbox Handle \"Handle\" checked:true enabled:false checkbox Spout \"Spout\" checked:true enabled:false checkbox Lid \"Lid\" checked:true enabled:false ) group \"Parameters\" ( spinner Rad \"Radius \" range:[10,100,40]align:#left enabled:false slider Seg \"Segments \" range:[4,20,6] type:#integer enabled:false ) button del_pot \"Delete Teapot\" enabled:false on Pik changed kolor do ( pot.wirecolor = kolor ) on Body changed arg do ( pot.body=arg ) on Handle changed arg do ( pot.handle=arg ) on Spout changed arg do ( pot.spout=arg ) on Lid changed arg do ( pot.lid=arg ) on tea pressed do ( pot=teapot radius:40 segments:6 pot.wirecolor=[0,0,255] tea.enabled=false pik.enabled=true Body.enabled=true Handle.enabled=true Spout.enabled=true Lid.enabled=true Rad.enabled=true Seg.enabled=true del_pot.enabled=true ) on del_pot pressed do ( select pot delete selection Body.checked=true -- ponowne zaznaczenie wszystkich checkboxow Handle.checked=true Spout.checked=true Lid.checked=true Pik.color=[0,0,255] -- ustawienie colorpikera na defoultowy Rad.value=40 -- ustawienie spinnera i slidera na wart. defoultowe Seg.value=6 tea.enabled=true pik.enabled=false Body.enabled=false Handle.enabled=false Spout.enabled=false Lid.enabled=false Rad.enabled=false Seg.enabled=false del_pot.enabled=false ) on seg changed value do ( pot.segs=Seg.value ) on rad changed value do ( pot.radius=Rad.value ) )--End utility W temacie chcialem zebyscie zmieniali parametry czajniczka w momencie zmieniania ustawien w interfejsie. Dla wiekszosci elementow interfejsu robi sie to w ten sam sposob. on nazwa_elementu changed nowa_wartosc do ( --jakis kod np. jakis_parametr = nowa_wartosc ) Zasada dzialania jest bardzo prosta. W monencie zmiany ustawienia, wartosci kontrolki wykonywany jest kod pomiedzy nawiasami a wlasnie wprowadzona wartosc jest umieszczana w zmiennej nowa_wartosc. Jesli naszym elementem jest spiner bedzie tam liczba, jesli colorpicker bedzie to kolor a jesli checkbox nowa_wartosc bedzie mogla byc true lub false. W przypadku buttona nic nie jest przekazywane, wykonywany jest jedynie kod. Jedyne do czego moglbym sie \"przyczepic\" w tym skrypcie to sposob okreslenie parametrow czajniczka w momencie jego tworzenia. Eleganciej byloby zamiast pot.wirecolor=[0,0,255] pisac pot.wirecolor = Pik.color czyli od razu inicjalizowac wartoscia a interfejsu.
-
Kurs MAX Script - temat 2 - podsumowanie
Na poczatek moja wersja skryptu. W tym temacie chodzilo glownie o zapoznanie sie z interfejsem ale przy okazji wyniklo kilka innych ciekawych problemow. utility teapot_util \"Teapot\" ( local my_teapot button create_teapot \"Create teapot\" colorpicker teapot_color \"Teapot Color: \" color:[100,100,255] fieldwidth:50 title:\"Pick Teapot color\" align:#right enabled:false spinner teapot_radius \"Teapot size: \" type:#float range:[0,200,30] fieldwidth:40 enabled:false align:#right slider teapot_segments \"Segments\" type:#integer range:[1,20,5] enabled:false group \"Teapot Parts\" ( checkbox teapot_body \"Body\" checked:true across:2 enabled:false checkbox teapot_handle \"Handle\" checked:true across:1 enabled:false checkbox teapot_spout \"Spout\" checked:true across:2 enabled:false checkbox teapot_lid \"Lid\" checked:false across:1 enabled:false ) button delete_teapot \"Delete Teapot\" on create_teapot pressed do ( my_teapot = teapot() my_teapot.wirecolor = teapot_color.color my_teapot.radius = teapot_radius.value my_teapot.segments = teapot_segments.value my_teapot.body = teapot_body.checked my_teapot.handle = teapot_handle.checked my_teapot.spout = teapot_spout.checked my_teapot.lid = teapot_lid.checked teapot_color.enabled = true teapot_radius.enabled = true teapot_segments.enabled = true teapot_body.enabled = true teapot_handle.enabled = true teapot_spout.enabled = true teapot_lid.enabled = true ) on teapot_color changed val do my_teapot.wirecolor = val on teapot_radius changed val do my_teapot.radius = val on teapot_segments changed val do my_teapot.segments = val on teapot_body changed val do my_teapot.body = val on teapot_handle changed val do my_teapot.handle = val on teapot_spout changed val do my_teapot.spout = val on teapot_lid changed val do my_teapot.lid = val on delete_teapot pressed do ( teapot_color.enabled = false teapot_radius.enabled = false teapot_segments.enabled = false teapot_body.enabled = false teapot_handle.enabled = false teapot_spout.enabled = false teapot_lid.enabled = false delete my_teapot ) ) Co nowego? Przedewszystkim elementy interfejsu. Moze krotkie omowienie na przykladzie spinnera. spinner teapot_radius \"Teapot size: \" type:#float range:[0,200,30] fieldwidth:40 enabled:false align:#right spinner - typ kontrolki (moze tez byc button, slider, checkbox itd) teapot_radius - nazwa kontrolki przez ktora bedziemy sie potem do niej odwolywac. Odradzam uzywanie tu nazw typu spiner1 czy spiner2, kiedy jest ich kilkabardzo latwo wszystko pokrecic. \"Teapot size: \" - tekst ktory pojawi sie przy spinerze w menu type:#float - rodzaj liczb ktore beda wyswietlane w spinerze. Tutaj liczby rzeczywiste (pozatym sa tez #integer czyli liczby calkowite i #worldunits czyli maxowe unity) range:[0,200,30] - zakres liczb wyswietalnych w okienku spinera [min,max,wartosc_domyslna] fieldwidth:40 - szerokosc pola spinera enabled:false - ta wlasciwosc okresla czy element bedzie wlaczony align:#right - i na koniec wyrownanie do lewej Jak pewnie zauwarzyliscie czesc parametrow, jak np. enabled czy align jest wspolna dla wszystkich elementow interfejsu. Z przydatniejszych warto wspomniec tez o offset ktory ustawia dokladnie konkretny element. Jesli nasz button jest za wysoko wystarczy dodac offset:[0,-10] aby przesunac go o 10 pikseli w dol. Innym przydatnym parametrem jest across ktory umozliwia ustawianie elementow obok siebie. button guzik1 \"Opcja 1\" button guzik2 \"Opcja 2\" button guzik3 \"Opcja 3\" Tak zdefiniowane przyciski beda umieszczone jeden pod drugim. Drobna modyfikacja pozwala umiescic je obok siebie. button guzik1 \"Opcja 1\" across:3 button guzik2 \"Opcja 2\" across:2 button guzik3 \"Opcja 3\" across:1
-
Problem z przypisaniem parametrów obiektu do zmiennych....
Znalazlem tego skrypta http://mapage.noos.fr/phlam/mx4/MVMon/index.htm moze to cos Ci pomoze, bo sam jeszcze nie wiem jak to dziala.
-
Kurs MAX Script - temat 2
http://www.max3d.pl/forum/viewthread.php?tid=4405 tutaj jest skrypt ktory wykonuje sie po uruchomieniu maxa, w Twoim przypadku trzebaby zmienic #postSystemStartup na np. #nodePreDelete
-
Kurs MAX Script - temat 2
W skrypcie jest cos takiego jak \"General Event Callback Mechanism\" (pod takim haslem znajdziesz to w helpie). Dzieki temu mozna pisac skrypty reagujace na rozne zdarzenia w maxie np. przesuniecie time slidera czy wlasnie skasowanie obiektu. Mozesz to wykorzystac. A swoja droga temat o callbackach tez chcialem zrobic ale dopiero za jakis czas.