Gość ant-3d Napisano 21 Maj 2009 Napisano 21 Maj 2009 Hej Potrzebuje jakiegos przykladu dla ulomnych jak z maxscripta wypluc np takiego xmla: cos takiego i potem jak cos takiego sobie wczytac do maxscripta przyjmujac ze nie wiem ile jest elementow i czy wszystkie sa. No i zeby do odpowiednich zmiennych to wpadlo. Help bo juz duzo przeczytalem i marne efekty. Dzieki chlopaki.
pchela1313 Napisano 21 Maj 2009 Napisano 21 Maj 2009 Hej twoje pytanie rozbije na 2 posty, pierwszy będzie o zapisywaniu pliku xml a drugi o jego odczytywaniu. Zatem, na początku musimy załadować xml przy użyciu DotNet. Użyjemy do tego formuły: dotNet.loadAssembly "system.xml" Teraz tworzymy zmienna która będzie naszym dokumentem: plikXml=dotNetObject "system.xml.xmlDocument" Skoro mamy już stowrzony dokument xml, możemy zaczynać w nim pisanie. Na początek musimy strorzyć root'a (nazwa może być obojętnie jaka, ważne żeby był tylko jeden root w pliku). Teraz uwaga taka: do każdego elementu możemy przypisawać dowolne atrybuty: w Twoim przypadku atrybutami są:rootowy, cos1, cos2 itd. Do roota też można dodawać atrtybuty. Zatem całość wygląda następująco: --tworzymy element root root=plikXml.createElement "Root" --dodajemy atrybuty do root'a, pierwszy to atrybut drugi to jego wartosc root.setAttribute "rootowy" "12" plikXml.appendChild root teraz skoro mamy już roota, możemy dodawać do niego podgrupy. Robimy to w taki sam sposób jak wyżej: --tworzymy element drzewo drzewoElement=plikXml.createElement "drzewo" --dodajemy atrybuty drzewoElement.setAttribute "cos1" "32" drzewoElement.setAttribute "cos2" "23" root.appendChild drzewoElement Analogicznie dodajemy liście: --tworzymy element liscie liscieElement=plikXml.createElement "liscie" --dodajemy atrybuty liscieElement.setAttribute "xxx1" "23" liscieElement.setAttribute "xxx2" "32" liscieElement.setAttribute "kolor" "zielone" drzewoElement.appendChild liscieElement Na koniec zapisujemy plik na dysku: --plik zapisze sie w katalogu: 3ds Max 2009\Scripts\ plikXml.save ((getDir #scripts)+"\\test.xml") I możemy wpisac poniższą formułę, aby zobaczyć co nam wyszło: edit ((getDir #scripts)+"\\test.xml") Opis jak odczytywać taki plik xml za około godzinke Pozdrawiam
Gość ant-3d Napisano 21 Maj 2009 Napisano 21 Maj 2009 Dzieki wielkie pchela1313. Reputajca juz poleciala :) Czekam z niecierpliwoscia na druga czesc.
pchela1313 Napisano 21 Maj 2009 Napisano 21 Maj 2009 (edytowane) Zatem przejdźmy teraz do odczytywania plików xml. Wczytywanie może się wydawać o tyle dziwne, ponieważ aby to zrobić najpierw musimy stworzyć nowy plik xml, który będzie zawierał to co ten zapisany. --ladujemy obsluge xml za pomoca DotNet dotNet.loadAssembly "system.xml" --tworzymy plik xml plikXml=dotNetObject "system.xml.xmlDocument" Teraz musimy pokazać maxowi gdzie znajduje się ten zapisyny plik, oraz kazać mu go załadować do naszego dopiero co stworzonego pliku --ladujemy sciezke pliku do zmiennej sciezkaXml=((getDir #scripts)+"\\test.xml") --wczytujemy zawartosc zapisanego pliku plikXml.load sciezkaXml Teraz trochę objaśnienia. Xml ma to do siebie, że możemy w nim tworzyć grupy, podgrupy itd. Coś podobnego jak katalogi w windowsie. I dokładnie w taki sam sposób max może odczytywać te grupy. Zatem jesli chcemy oddzielić jakieś partie od siebie to robimy nową grupę. Aby to jeszcze jaśniej pokazać, posłużę się plikiem xml z nowej wersji Pchela_Transform_Holder 2.5 (kurczę wygadałem się, więcej info wkrótce;) ) Oto przykładowy kod: (wartości niektórych rzeczy pousuwałem, aby nie zaciemniać przykładu) Teraz możemy przeanalizować to dziwadło. Na samej górze mamy root'a. Niżej w hierarchii jest "Group", dla mnie są to grupy z zapisanimi pozami (ramie, dłoń, noga, cała postać itd). Czyli jest to odrębna całość i nie ma potrzeby skupiać się na innych elementach w tym poziomie. Dalej mam rzeczy takie jak: Numery,Ustawienia itd. Są to rzeczy stałe dla danej grupy. Dopiero na samym dole są faktyczne zapisane pozy "PoseName". Czyli całość opisowa wygląda tak: Root Grupy póz pierdy zbiór faktycznych póz pozy Patrząc na ten schemat, łątwo mozna zauwazyć, że aby odczytac pozy, muszę najpier przejść przez te elementy które są wyrzej w hierarchii. Teraz przejdźmy do tego co otrzymaliśmy u Ciebie: Zatem aby zacząć odczytywać elementy postępujemy nastepująco: --wczytujemy zawartosc zapisanego pliku plikXml.load sciezkaXml --utalamy zmienna jako Root rootEle=plikXml.documentElement --dla pewnosci mozemy sprawdzic czy nazwa naszej zmiennej nazywa sie "Root" if rootEle!=undefined and rootEle.name=="Root" then ( clearListener() format "Nazwa Roota: %\n\n" rootEle.name --teraz mozemy odczytac wszystkie childreny roota --nalezy pamietac ze zbiory w DotNet zaczynaja sie od zera a nie od 1. -- Z kolei jesli zapytamy sie o ilosc elementow z biorze podaje juz normalnie -- dlatego funckja for zaczyna sie od 0 a konczy na ilosci elementow w zbiorze -1 for i = 0 to rootEle.ChildNodes.count-1 do ( format format " Nazwa podgrupy: %\n\n" rootEle.ChildNodes.itemOf[i].name ) )else() A oto co otrzymamy w listenerze: Nazwa Roota: Root Nazwa podgrupy: drzewo Czyli nazwe odczytujemy korzystajac z polecenia "name". Teraz jeśli chcemy odczytać wartości lub atrybuty wpisujemy: for i = 0 to rootEle.ChildNodes.count-1 do ( format " Nazwa podgrupy: %\n\n" rootEle.ChildNodes.itemOf[i].name --sprawdzemy ile jest attrybutow w gurpue for x=0 to rootEle.ChildNodes.itemOf[i].attributes.count-1 do ( --aby odczytac atrybuty format " atrybuty: %\n" rootEle.ChildNodes.itemOf[i].attributes.itemOf[x].name --aby odczytac wartosci format " wartosci: %\n\n" rootEle.ChildNodes.itemOf[i].attributes.itemOf[x].value ) --Mozemy tez od razy znalezc wartosc danego atrybuty znajac jego nazwe format " wartosc atrubutu \"cos1\": %\n\n" (rootEle.ChildNodes.itemOf[0].GetAttributeNode "cos1").value format " wartosc atrubutu \"cos1\": %\n\n" (rootEle.ChildNodes.itemOf[0].GetAttributeNode "cos1").value ) A oto co pokaże listener: Nazwa Roota: Root Nazwa podgrupy: drzewo atrybuty: cos1 wartosci: 32 atrybuty: cos2 wartosci: 23 wartosc atrubutu "cos1": 32 wartosc atrubutu "cos1": 32 Teraz, możemy odczytać dowolną rzecz z pliku xml :) Zdaję sobie sprawę, że może się to wydawać skomplikowane, ale starałem się to ująć najprościej jak potrafię. Więcej tutoriali, skryptów o zagadnieniu riggowania i skryptowania w maxiem, zarówno w formie pisanej jak i video, już niedługo na mojej stronie. Musze jeszcze tylko napisać i narać te wszytkie rzeczy. Również po skończeniu strony pokaże się PTH 2.5 Pozdrawiam i rzyczę powodzenia w odszyfrowaniu tego co napisałem ;) Na koniec cały kod, który odczytuje twój plik xml: --ladujemy obsluge xml za pomoca DotNet dotNet.loadAssembly "system.xml" --tworzymy plik xml plikXml=dotNetObject "system.xml.xmlDocument" --ladujemy sciezke pliku do zmiennej sciezkaXml=((getDir #scripts)+"\\test.xml") --sprawdzamy czy plik istnieje if doesFileExist sciezkaXml then ( --wczytujemy zawartosc zapisanego pliku plikXml.load sciezkaXml --utalamy zmienna jako Root rootEle=plikXml.documentElement --dla pewnosci mozemy sprawdzic czy nazwa naszej zmiennej nazywa sie "Root" if rootEle!=undefined and rootEle.name=="Root" then ( clearListener() format "Nazwa Roota: %\n\n" rootEle.name --teraz mozemy odczytac wszystkie childreny roota --nalezy pamietac ze zbiory w DotNet zaczynaja sie od zera a nie od 1. -- Z kolei jesli zapytamy sie o ilosc elementow z biorze podaje juz normalnie -- dlatego funckja for zaczyna sie od 0 a konczy na ilosci elementow w zbiorze -1 for i = 0 to rootEle.ChildNodes.count-1 do ( format " Nazwa podgrupy: %\n\n" rootEle.ChildNodes.itemOf[i].name --sprawdzemy ile jest attrybutow w gurpue for x=0 to rootEle.ChildNodes.itemOf[i].attributes.count-1 do ( --aby odczytac atrybuty format " atrybuty: %\n" rootEle.ChildNodes.itemOf[i].attributes.itemOf[x].name --aby odczytac wartosci format " wartosci: %\n\n" rootEle.ChildNodes.itemOf[i].attributes.itemOf[x].value ) --Mozemy tez od razy znalezc wartosc danego atrybuty znajac jego nazwe format " wartosc atrubutu \"cos1\": %\n" (rootEle.ChildNodes.itemOf[0].GetAttributeNode "cos1").value format " wartosc atrubutu \"cos1\": %\n" (rootEle.ChildNodes.itemOf[0].GetAttributeNode "cos1").value ) )else() )else() Koniec... Uff ;) Edytowane 26 Maj 2009 przez pchela1313
Gość ant-3d Napisano 21 Maj 2009 Napisano 21 Maj 2009 pchela1313: Ogromne dzieki. Wiele mi to wyjasnilo rzeczy. Pomogles i to bardzo :)
Rekomendowane odpowiedzi
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ę