Skocz do zawartości

Featured Replies

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
  • Wyświetleń 1,8k
  • Created
  • Ostatniej odpowiedzi

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

Napisano

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

Napisano

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

Napisano

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

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Powiadomienie o plikach cookie

Wykorzystujemy cookies. Przeczytaj więcej Polityka prywatności