Skocz do zawartości

XML a maxscript


Rekomendowane odpowiedzi

Gość ant-3d
Napisano

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.

  • Odpowiedzi 4
  • Created
  • Ostatniej odpowiedzi

Top Posters In This Topic

Popular Days

Top Posters In This Topic

Napisano

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

Dzieki wielkie pchela1313. Reputajca juz poleciala :) Czekam z niecierpliwoscia na druga czesc.

Napisano (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 przez pchela1313
Gość ant-3d
Napisano

pchela1313: Ogromne dzieki. Wiele mi to wyjasnilo rzeczy. Pomogles i to bardzo :)

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