Zawartość dodana przez lechoo
-
Kurs MAX Script - temat 7 - podsumowanie
Z malym poslizgiem ale podsumowanie jest. Biorac pod uwage frekwencje, mysle ze czas konczyc kurs, zatem uzaje tamat 7 za ostatni. A teraz moj skrypt. clearlistener() utility clock \"Clock\" ( local h,m pickbutton h_pointer \"Hour pointer\" width:100 pickbutton m_pointer \"Minute pointer\" width:100 radiobuttons rot_axis \"Rotation axis\" labels:#(\"X\",\"Y\",\"Z\") spinner hour \"Hour: \" type:#integer range:[0,23,14] fieldwidth:40 spinner minute \"Minute: \" type:#integer range:[0,59,25] fieldwidth:40 button set_time \"Set time\" width:140 button sys_time \"Set system time\" width:140 fn get_angles hrs mins = ( m = (mins/60.0) if (hrs >= 12) then h = hrs - 12 else h = hrs h = (h/12.0)*360.0 + (360.0/12.0*m) m *= 360.0 ) on h_pointer picked obj do ( h_pointer.text = obj.name ) on m_pointer picked obj do ( m_pointer.text = obj.name ) on set_time pressed do ( get_angles (hour.value) (minute.value) case rot_axis.state of ( 1: h_pointer.object.rotation = eulerangles h 0 0 2: h_pointer.object.rotation = eulerangles 0 h 0 3: h_pointer.object.rotation = eulerangles 0 0 h ) case rot_axis.state of ( 1: m_pointer.object.rotation = eulerangles m 0 0 2: m_pointer.object.rotation = eulerangles 0 m 0 3: m_pointer.object.rotation = eulerangles 0 0 m ) ) on sys_time pressed do ( time_str = filterString localtime \"- :\" get_angles (time_str[4] as integer) (time_str[5] as integer) case rot_axis.state of ( 1: h_pointer.object.rotation = eulerangles h 0 0 2: h_pointer.object.rotation = eulerangles 0 h 0 3: h_pointer.object.rotation = eulerangles 0 0 h ) case rot_axis.state of ( 1: m_pointer.object.rotation = eulerangles m 0 0 2: m_pointer.object.rotation = eulerangles 0 m 0 3: m_pointer.object.rotation = eulerangles 0 0 m ) ) ) Funkcja get_angles sluzy do przeliczania czasu na katy obrotu wskazowek. Mozna tam sporo uproscic ale dla jasnosci zapisu postanowilem to tak zostawic. Drugie ciekawe miejsce to odzyskiwanie godziny i minut z funkcji localTime. jesli zwrocony przez nia czas bedzie np. taki : 2004-01-13 08:42:22 to wystarczy podzielic tego stringa na czesci w miejscach gdzie pojawiaja sie \"-\", \":\" i spacja. W efekcie dostaniemy tablice stringow gdzie na pierwszej pozycji bedzie 2003, na drugiej 01 itd. Nas beda interesowaly pozycje 4 i 5. Sluzy do tego polecenie filterString. time_str = filterString localtime \"- :\"
-
Kurs MAX Script - temat 7
Tym razem chce zebyscie napisali skrypt ustawiajacy wskazowki zegara. Czyli np. cos takiego: mamy dwa spinery, w pierwszym ustawiamy 12, w drugim 30, naciskamy guziczek i dwa obiekty ustawiaja sie tak jak wskazowki pokazujace 12:30. Interfejs pozostawiam calkowicie waszemu uznaniu, mozna tez wykorzystac aktualny czas systemowy zamiast spinerow. Deadline w poniedzialek 12 stycznia. Skrypty oczywsicie wysylajcie na maila. powodzenia
-
Kurs MAX Script - temat 6 - podsumowanie
Tez mam taka nadzieje, zobaczymy w styczniu.
-
Kurs MAX Script - temat 6 - podsumowanie
I jeszcze plik ze skryptami: tematy06.zip Nastepny temat po nowym roku. Wesolych Swiat
-
Kurs MAX Script - temat 6 - podsumowanie
Autor: VGTsXVII macroscript copy_modifiers category:\"kurs maxscript\" tooltip:\"kopiowanie modyfikacji\" icon:#(\"MergeAnim\",4) ( --ustalenie obiektu zrodlowego zazn = getcurrentselection() obiekt = zazn[1] --przygotowanie tablic tab_mod = #() tab_zazn = #() --wstawienie danych do tablic for i = 1 to obiekt.modifiers.count do ( append tab_mod (obiekt.modifiers.name) append tab_zazn i ) rollout roll \"copy modifiers\" ( --wyswietlenie listy modyfikacji multilistbox lista_mod items:tab_mod selection:tab_zazn --wybor drugiego obiektu --###po wyborze automatycznie nastepuje skopiowanie wybranych modyfikacji pickbutton drugi \"pick\" width:75 height:30 on drugi picked obiekt2 do undo on ( for i = 1 to obiekt.modifiers.count do if lista_mod.selection[obiekt.modifiers.count-i+1] == true then if validmodifier obiekt2 obiekt.modifiers[obiekt.modifiers.count-i+1] then addmodifier obiekt2 obiekt.modifiers[obiekt.modifiers.count-i+1] destroydialog roll completeredraw() ) ) createdialog roll width:200 height:200 ) Tym razem wersja macroscriptowa. Sa tu dwa bardzo ciekawe elementy. on drugi picked obiekt2 do undo on ( --tu cos robimy ) Dzieki \"undo on\" wszystkie operacje pomiedzy nawiasami bedzie mozna cofnac przy pomocy maxowego undo. Defaultowo operacje wykonywane przez max script nie sa dopisywane do listy undo. Jesli zapis nie jest dla was do konca jasny mozna to przepisac tak: on drugi picked obiekt2 do ( undo on ( --tu cos robimy ) ) if validmodifier obiekt2 obiekt.modifiers[obiekt.modifiers.count-i+1] then addmodifier obiekt2 obiekt.modifiers[obiekt.modifiers.count-i+1] \"validmodifier\" sprawdza czy dany modyfikator mozna nalozyc na zadany obiekt. Na wszelki wypadek zawsze powinno sie to sprawdzac (o czym w swoim skrypcie zapomnialem :) ).
-
Kurs MAX Script - temat 6 - podsumowanie
A teraz moja wersja: utility copy_mod \"Copy modifiers\" ( local mod_list_arr = #() label lab1 \"Copy from:\" align:#left pickbutton source \"Pick object\" width:140 label lab2 \"Copy to:\" align:#left pickbutton targetP \"Pick object\" width:140 multiListBox mods_list \"Modifiers\" button copy_mods \"Copy selected modifiers\" width:140 on source picked obj do ( source.text = obj.name for i in 1 to obj.modifiers.count do ( append mod_list_arr ((classOf obj.modifiers) as string) ) mods_list.items = mod_list_arr ) on targetP picked obj do ( targetP.text = obj.name ) on copy_mods pressed do ( for i in mods_list.selection.count to 1 by -1 do ( if (mods_list.selection) then ( addModifier targetP.object source.object.modifiers ) ) ) ) W tym temacie tak naprawde chodzilo o nauczenie sie \"obslugi\" modyfikatorów przez max script wiec nie ma tu specjalnych fajerwerkow. Krotko opisze kilka ciekawszych fragmentow: classOf obj.modifiers W ten sposob sprawdzam klase modyfikatora (w tym wypadku jest ona jednoznaczna z nazwa) by pozniej wrzucic ja do tablicy. mods_list.items = mod_list_arr Parametr items listboxa i multilistboxa przechowuje tablicę wszystkich pozycji wyswietlanych w tym elemencie listy. Aby zmienic wszystkie wyswietlane elementy przypisuje mu tablice z nazwami modyfikatorow. for i in mods_list.selection.count to 1 by -1 do \"by -1\" oznacza ze przebiegam tablice od tylu a robie tak zeby zachowac wlasciwa kolejnosc modyfikatorow. Gdyby nie to pierwszy modyfikator po skopiowaniu bylby ostatni, drugi przedostatni itd. Na koniec ten sam skrypt w jednej linijce, bez interfejsu, wyboru modyfikatorow, samo kopiowanie. for i in $Box01.modifiers.count to 1 by -1 do addModifier $Box02 $Box01.modifiers
-
Kurs MAX Script - temat 6 - podsumowanie
Po pierwsze: tylko jedna osoba! Wstydzcie sie :( Jeszcze 4 tematy do konca to moze jakos dociagniemy.
-
Kurs MAX Script - temat 6
Dzieki, dzieki :) Tez bylem zaskoczony. Znajomy zaczal gratulowac mi pracy a ja kompletnie nie wiedzialem o co chodzi, dopiero zalapalem jak pokazal mi okladke. Musze poslac ja Adkowi do galerii, bo ciagle zapominam.
-
Kurs MAX Script - temat 6
Tym razem narzedzie dla leniwych. Skrypt do kopiowania modyfikatorow z jednego obiektu na drugi, tak zeby nie trzeba bylo recznie przepisywac wszystkich parametrow modyfikatorow. Koncepcja jest taka: dwa pickbuttony, pierwszym wybieramy obiekt z ktorego kopiujemy a drugim obiekt docelowy. Listbox w ktorym w momencie wybrania pierwszego obiektu pojawia sie spis jego wszystkich modyfikatorow. W listboxie zaznaczamy modyfikatory ktore chcemy skopiowac i naciskamy guzik ktory uruchamia kopiowanie. Do wypisania modyfikatorow wykorzystajcie multiListBox. W przeciwienstwie do zwyklego listboxa umozliwia on zaznaczanie wielu pozycji. Modyfikatory obiektu przechowywane sa we wlasnosci modifiers object.modifiers[1] --pierwszy modyfikator object.modifiers[2] --drugi itd. Jak widac jest to zwykla tablica, zeby przejsc przez wszystkie modyfikatory wystarczy napisac cos takiego: for i in 1 to object.modifiers.count do ( jakis_modyfikator = object.modifiers ) Jak dodawac modyfikatory mozecie podejrzec w moim skrypcie na temat 5. Dodawalem tam edit_mesh. Gdyby nie interfejs i mozliwosc wyboru kopiowanych modyfikatorow, skrypt moglby miec jedna linijke :D Powodzenia, tematy wysylajcie na maila. Deadline 22 grudnia.
-
Kurs MAX Script - temat 5 - podsumowanie
I jeszcze wszystkie skrypty: tematy05.zip Nastepny temat zamieszcze do piatku.
-
Kurs MAX Script - temat 5 - podsumowanie
Autor: VGTsXVII macroscript mesh_to_area_light category:\"Kurs maxscript\" tooltip:\"Area Light\" icon:#(\"Lights\",2) ( local kopia local i local pozycja grupa = getcurrentselection() obiekt = grupa[1] kopia = snapshotasmesh obiekt obiekt = omnilight name:\"Area_Light_01\" multiplier:0.1 castshadows:true obiekt.pos = (getvert kopia 1) for i = 2 to kopia.numverts do ( instance obiekt pozycja = (getvert kopia i) obiekt.pos = pozycja ) ) Krotko i skutecznie :D
-
Kurs MAX Script - temat 5 - podsumowanie
Autor: Sypo clearListener() global obiekt for i = 1 to selection.count do ( obiekt = convertToMesh(selection) ) num_verts = obiekt.numverts pierwsze = omnilight pos:(getVert obiekt 1) for v = 2 to 4 do ( vert = getVert obiekt v drugie = instance pierwsze drugie.pos = vert ) trzecie = targetDirectionalLight pos:(getVert obiekt 5) target:(targetObject pos:[0,0,200]) for v = 6 to num_verts do ( vert = getVert obiekt v czwarte = instance trzecie czwarte.pos = vert ) Sypo niestety nie mial czasu dokonczyc skryptu. Jak widac probowal eksperymentowac ze swiatlami target zamiast omni (i slusznie tez bedzie dzialac). Pojawil sie tylko problem z targetem ktory sie nie kopiuje (dwa siatla maja wspolny target), podobny problem jest z kamerami. W tym wypadku trzeba uzyc polecenia CloneNodes tab = #() maxOps.CloneNodes selection[1] cloneType:#instance newNodes:&tab Wtedu w tablicy tab beda dwa elementy: target i swiatlo.
-
Kurs MAX Script - temat 5 - podsumowanie
Autor: leander tmesh = snapshotAsMesh selection[1] a = omnilight() num_verts = tmesh.numverts for v = 1 to num_verts do ( vert = getVert tmesh v b = instance a pos:vert ) Leander jest absolutnym rekordzista jesli chodzi o zwiezlosc, ale jest wszystko co trzeba. Przydalby sie moze jakis symboliczy interface albo podpiecie do guziczka jako macroscript.
-
Kurs MAX Script - temat 5 - podsumowanie
Autor: leander tmesh = snapshotAsMesh selection[1] a = omnilight() num_verts = tmesh.numverts for v = 1 to num_verts do ( vert = getVert tmesh v b = instance a pos:vert ) Leander jest absolutnym rekordzista jesli chodzi o zwiezlosc, ale jest wszystko co trzeba. Przydalby sie moze jakis symboliczy interface albo podpiecie do guziczka jako macroscript.
-
Kurs MAX Script - temat 5 - podsumowanie
Autor: Bart Utility AreaLight \"Area Light\" ( local pozycja, sw, num_vert, kula, pierwsze, tablica, promien = 20, segmenty = 2, jasnosc = 1.0, kolor, czy_istnieje = 0 label l1 \"\" pickbutton light \"Wybierz swiatlo\" label l2 \"\" group \"Parametry Area Light\" ( spinner pr \"Promien\" range:[10,100,20] spinner gestosc \"Segmenty\" range:[1,6,2] type:#integer spinner jasn \"Jasnosc\" range:[0,100,1] colorpicker kol \"Kolor\" align:#center label l3 \"\" button create \"Utworz Area Light\" label l4 \"Progress\" progressBar progres ) label l5 \"\" button del \"Skasuj Area Light\" enabled:false label l6 \"\" on pr changed wartosc do promien = wartosc on gestosc changed wartosc do segmenty = wartosc on jasn changed wartosc do ( if czy_istnieje == 1 then ( jasnosc = wartosc pierwsze.multiplier = (jasnosc/num_vert) ) else jasnosc = wartosc ) on kol changed wartosc do ( if czy_istnieje == 1 then ( kolor = wartosc pierwsze.rgb = kolor ) else kolor = wartosc ) on light picked swiatlo do ( light.text = swiatlo.name sw = swiatlo select swiatlo pozycja = swiatlo.pos jasnosc = sw.multiplier jasn.value = jasnosc kolor = sw.rgb kol.color = kolor ) on create pressed do ( pr.enabled = false gestosc.enabled = false create.enabled = false del.enabled = true czy_istnieje = 1 kula = geosphere segments:segmenty radius:promien kula.pos = pozycja sw.enabled = false siatka = snapshotAsMesh kula num_vert = siatka.numverts poz = getVert siatka 1 pierwsze = omnilight pos:poz castShadows:true rgb:kolor pierwsze.multiplier = (jasnosc/num_vert) hide kula tablica = #() tablica[1] = pierwsze for i = 2 to num_vert do ( poz = getVert siatka i tablica = instance pierwsze tablica.pos = poz Tablica.multiplier = pierwsze.multiplier progres.value = i*100/num_vert ) ) on del pressed do ( pr.enabled = true gestosc.enabled = true create.enabled = true del.enabled = false czy_istnieje = 0 sw.enabled = true unhide kula select kula delete selection for i = 1 to num_vert do ( select tablica delete selection ) ) ) Jedyne zastrzerzenia jakie mam to z gory okreslony ksztalt area light, przydalaby sie mozliwosc wyboru obiektu na ktory sa tworzone swiatla. Bart jest jedyna osoba ktora zauwarzyla problem z multiplierem. Gratuluje.
-
Kurs MAX Script - temat 5 - podsumowanie
Moj skrypt na poczatek clearListener() utility kurs05 \"Area Light\" ( local lights_arr = #() pickbutton area_object \"Select object\" width:130 spinner nth_vertex \"Every nth vert: \" type:#integer range:[1,100,1] fieldwidth:40 button go \"GO\" width:130 button deletelights \"Delete lights\" width:130 on go pressed do ( disableSceneRedraw() addModifier area_object.object (edit_mesh()) first_light = omnilight pos:(getVert area_object.object 1) multiplier:(1.0/area_object.object.numVerts) append lights_arr first_light for i in 2 to area_object.object.numVerts by nth_vertex.value do ( next_light = instance first_light next_light.pos = getVert area_object.object i append lights_arr next_light ) deleteModifier area_object.object 1 enableSceneRedraw() ) on deletelights pressed do ( for i in 1 to lights_arr.count do ( delete lights_arr[lights_arr.count] deleteItem lights_arr lights_arr.count ) ) ) Teraz kilka ciekawszych miejsc. Petla on go pressed (czyli ta w ktorej tworze swiatla) zaczyna sie od disableSceneRedraw() a konczy enableSceneRedraw(). Dzieki temu max nie bedzie odswiezal viewportow po stworzeniu kazdego swiatla. Przy duzej ilosci obliczen i obiektow tak jest szybciej. Jesli zdarzy sie tak ze skrypt zwali sie gdzies pomiedzy tymi liniami trzeba pamietac o wywolaniu z osobnego skryptu enableSceneRedraw() inaczej viewporty pozostana wylaczone dlatego te dwie linijki dopisuje zawsze na koncu jak skrypt jest juz sprawdzony. Jesli obiekt nie jest typu editable mesh to nie mozna dobrac sie do jego vertexow. addModifier area_object.object edit_mesh()) deleteModifier area_object.object 1 Ja rozwiazalem to dodajac modyfikator edit mesh na czas obliczen. Wiekszosc z was wykorzystala snapshot. Wszystkie swiatla wrzucam do tablicy, dzieki temu mode je potem kasowac lub zrobic z nimi cos innego. local lights_arr = #() append lights_arr first_light first_light = omnilight pos:(getVert area_object.object 1) multiplier:(1.0/area_object.object.numVerts) Zwroccie uwage na wartosc multiplier. Gdybym zostawil ja na defaultowej wartosci 1 to przy np 100 swiatlach nasze area light mialoby multiplier 100, czyli wszystko byloby przepalone. Dzieki temu dzieleniu cale area light ma multiplier = 1.
-
Kurs MAX Script - temat 5
Kolejne zadanie bedzie polegac na napisaniu skryptu ktory bedzie tworzyl proste area light. Najprostsza metoda to umiescic w kazdym z wierzcholkow mesha po jednym swietle omni. Dodatkowo niech wszystkie swiatla beda tworzone jako instancje (czyli zmiana jakiegos parametru w jednym powoduje taka sama zmiane w pozostalych). Mozecie tez dodac mozliwosc tworzenia swiatla w co ktoryms wierzcholku lub okreslenia maksymalnej liczby swiatel, pozostawiam to Wam podobnie jak rodzaj interfejsu, moze byc utility, macroscript lub bez jakichkolwiek kontrolek. Jak zczytac po kolei pozycje wszystkich vertexow znajdziecie w helpie w rozdziale How To ... Output Geometry Data To Text File - Part One. Instancje obiektu tworzy sie analogicznie do kopiowania np. tak: a = omnilight() b = instance a Deadline 8 grudnia. Mysle ze tamat jest dosc prosty a przy okazji efektowny, takim prostym sposobem mozna osiagnac naprawde fajne efekty. Skrypty ja zwykle wysylajcie na maila. Powodzenia.
-
Exportowanie materiału (tektury) w max-scripcie.
Poszukaj na www.scriptspot.com, wydaje mi sie ze powinno tam cos takiego byc. Gdyby nie udalo sie znalesc moge taki skrypt napisac.
-
Exportowanie materiału (tektury) w max-scripcie.
Nie jestem pewien czy rozumiem pytanie. Chodzi o wyeksportowanie tekstury gotowej do mapowania? Cos jak texporter?
-
Kurs MAX Script - temat 4 - podsumowanie
Kolejny temat za nami, frekwencja sie nie zniejszyla, wiec chyba nie jest zle :D Nastepne tematy postaram sie wymyslac tak aby nie byly zbyt teoretyczne ale zeby stanowily jakas namiastke porzytecznych narzedzi. I jeszcze link do skryptow: tematy04.zip Nie kopiujcie tresci z forum bo czesc znakow sie nie wyswietla, chyba glownie slashe.
-
Kurs MAX Script - temat 4 - podsumowanie
Autor: VGTsXVII --VGTsXVII - zadanie #4 macroscript lista_obiektow category:\"kurs max script\" tooltip:\"Export listy zaznaczonych obiektow do pliku\" icon:#(\"compound\",1) ( --wpisanie nazwy pliku i czasu pod zmienne nazwa = maxFileName if nazwa == \"\" then nazwa = \"untitled\" czas = localtime --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 \"Nazwa pliku max\'a: %nCzas wygenerowania statystyki: %nn\" nazwa czas to:plik for i = 1 to zaznaczone.count do ( format \"%. %, %, %n\" i zaznaczone.name zaznaczone.pos ( classof zaznaczone ) to:plik ) close plik edit plik_nazwa ) ) O wlasnie, tutaj mozecie podejrzec sobie jak zrobic guziczek z ikonka. W tym wypadku jedna ze standardowych ikon maxowych.
-
Kurs MAX Script - temat 4 - podsumowanie
Autor: Sypo fn funkcja = ( -- zapis do pliku clearlistener() summary_file = getSaveFileName types:\"|*.txt|\" scene_file = maxFileName -- tekst w pliku if scene_file == \"\" then Scene_file = \"Untitled\" if summary_file != undefined then ( out_file = createFile summary_file format \"File Name: \" to:out_file format \"%\" scene_file to:out_file format \"n\" to:out_file format \"Time & Date: %\" localTime to:out_file format \"n\" to:out_file format \"n\" to:out_file format \"Lp.tNametPositiontClassn\" to:out_file format \"n\" to:out_file for i = 1 to selection.count do ( format \"%.t%t%t%\" i selection.name selection.pos (classOf selection) to:out_file format \"n\" to:out_file ) close out_file edit summary_file ) ) utility par \"Parametry\" ( label l1 \"\" button go \"Zapisz dane do pliku\" on go pressed do ( funkcja() ) ) macroScript Parametry category:\"Temat4\" tooltip:\"Parametry\" buttonText:\"Parametry\" ( on execute do ( funkcja() ) ) Ten skrypt to takie 2in1. Utility i macroscript, oba odwoluja sie do jednej funkcji realizujacej wlasciwe zadanie.
-
Kurs MAX Script - temat 4 - podsumowanie
Autor: Bart macroScript Statystyka category:\"Statystyka\" tooltip:\"Statysyka\" ( out_name = getSaveFileName types:\"Text files (*.txt)|*.txt|\" out_file = createfile out_name nazwaPliku = maxFileName if nazwaPliku == \"\" then nazwaPliku = \"Untitled\" indeks = \"Lp. Typ Nazwa Pozycja\" spacja = \" \" format \"Nazwa pliku: \" to:out_file format \"%n\" NazwaPliku to:out_file format \"Czas i data: \" to:out_file format \"%nn\" localTime to:out_file format \"%nn\" indeks to:out_file for i in 1 to selection.count do ( format \"%.\" i to:out_file format \"%\" spacja to:out_file format \"%\" selection.baseobject 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 ) Troche inaczej zostalo tu rozwiazane sprawdzanie rodzaju obiektu. Najlepiej wytlumacze to na przykladzie. Jesli zrobicie boxa i przypiszecie mu modyfikator Edit Mesh to classOf zwroci Editable_mesh a baseObject - Box (czyli obiekt podstawowy). Jak widac w pewnych sytuacjach roznica jest znaczaca jednak w przypadku naszego podsumowania to w zupelnosci wystarczy.
-
Kurs MAX Script - temat 4 - podsumowanie
Na poczatek moja wersja skryptu macroScript kurs04 category:\"Kurs max script\" buttonText:\"Summary\" ( summary_file_name = getSaveFileName caption:\"Summary file\" types:\"Text(*.txt)|*.txt|\" if (summary_file_name != undefined) then ( summary_file = createFile summary_file_name 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\\tObject type\\n\" to:summary_file for i in 1 to selection.count do ( format \"%.\\t%\\t%\" i selection.name selection.pos to:summary_file format \"\\t%\" (classOf selection) to:summary_file format \"\\n\" to:summary_file ) close summary_file ) ) Pierwsza nowa rzecz to macroscript. Dzieki temu mozemy podpiac nasz skrypt do guziczka w menu. Mysle ze opcje category i buttonText nie wymagaja wyjasnien. Dodatkowo, czego tu nie wykorzystalem, mozna przypisac guziczkowi ikone. W tym celu tworzymy 4 bitmapy np. takie: summary_16a summary_16i summary_24a summary_24i i umieszczamy je w katalogu \\\\ui\\\\icons. w 16i i 24i znajduja sie same ikony w rozmiarach 16 i 24 pikseli a w 16a i 24a ich kanaly alfa. Odwolanie do nich jest bardzo proste macroScript kurs04 category:\"Kurs max script\" buttonText:\"Summary\" icon:#(\"summary\", 1) Liczba oznacza numer ikony jesli w bitmapach jest ich kilka. Do sprawdzania klasy obiektu sluzy polecenie classOf obiekt. Jedno polecenie zalatwia cala sprawe. Rownie prosto jest w przypadku dialogu do zapisywania pliku. Najprostsza wersja moze wygladac tak: nazwa_pliku = getSaveFileName W skrypcie dodalem tytul okienka (caption) i zdefiniowalem jeden typ pliku.
-
Kurs MAX Script - temat 4
Moze wlasciwie temat powinien miec numer 3b, bo jest to kontynuacja poprzedniego tematu :) Tym razem chce zebyscie dokonali kilku ulepszen: -skrypt powinien dzialac jako Macro Script, czyli powinien miec mozliwosc dodania go jako guziczka do Toolbaru -wybor pliku statystyki nie poprzez sztywne ustawienie nazwy pliku w zmiennej ale w zwyklym windowsowym dialogu (jak to zrobic mozecie podejrzec w skrypcie VGTsXVII w temacie 3) -dodatkowa kolumna w pliku ze statystyka w ktorej bedzie wypisany rodzaj obiektu (czyli jesli to bedzie box to w ostatniej kolumnie bedzie napis Box, jesli swiatlo omni to Omnilight itd.) Dla ulatwienia dodam ze robi sie to jednym poleceniem ktore zwraca stringa z nazwa klasy obiektu. Deadline tradycyjnie w nastepny poniedzialek, czyli 24 listopada. Skrypty jak zwykle slijcie na maila. Powodzenia.