Napisano 21 Maj 200915 l 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.
Napisano 21 Maj 200915 l 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
Napisano 21 Maj 200915 l Dzieki wielkie pchela1313. Reputajca juz poleciala :) Czekam z niecierpliwoscia na druga czesc.
Napisano 21 Maj 200915 l 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 200915 l przez pchela1313
Napisano 21 Maj 200915 l pchela1313: Ogromne dzieki. Wiele mi to wyjasnilo rzeczy. Pomogles i to bardzo :)
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto