Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Script Swell - MEL vodič za programiranje

MEL vodič za programiranje : Kako čitati tekstuelne fajlove

Ovo uputstvo će Vam pokazati kako da koristite MEL (Maya Embedded Language) za čitanje tekst fajlova i kako da podatke iz njih iskoristite u programu Maya (Autodesk 3D Graphics Software Maya). Za jednog programera ovo je neophodna veština. Često se javlja potreba za preuzmanjem podatka u fajl , a koji se nalaze se izvan vašeg programa . Fajl može da sadrži animacione podatke za pristup, podaci za poređenje omotača (kože), listu objekata potrebnih za scenu ili bilo koje druge podatake, koji može da sadrži tekst fajl. Ovo uputstvo pretpostavlja da već posedujete osnovno znanje o MEL sintaksi i kako startovati program u Maya programu.

Nivo veštine: početni do srednji

Za početak napravićemo fajl sa podacima , koji nam treba za testiranje. Otvorite vaš omiljeni tekst procesor ( poslužiće i notepad ukoliko nemate ništa drugo), kreirajte nov .TXT fajl i sačuvajte ga negde kao "myDataFile.txt". Za ovu lekciju preporučujem da sačuvate vaš fajl tako da ima jednostavnu putanju, npr. "C:\mel\myDataFile.txt".

Kopirajte i nalepite (copy-paste) sledeće podatke i sačuvajte fajl:
  1. //objectName,posX,posY,posZ,rotX,rotY,rotZ,scaleX,scaleY,scaleZ  
  2. pCube1,0,0,0,0,0,0,1,1,1  
  3. pSphere1,-5,10,-5,-90,90,-45,1,1,1  
  4. pCylinder1,2.5,2.342,4.2823,0,0,0,1,1,1  
  5. pPlane1,0,0,0,360,180,45,1,1,1  

-----------------------------------------------------------
Napomena: Nije neophodno da fajl koristi ekstenziju .TXT. Bilo koji fajl format baziran na tekstu će raditi na isti način.Možete čak da napravite svoju sopstvenu ekstenziju. Ja volim da koristim .RIG fajlove.
-----------------------------------------------------------

Sada kada imamo fajl za testiranje , pogledajmo šta je u njemu. Važno je znati sa kojim tipom podataka radimo , a na osnovu toga možemo da planiramo kako i u kom formatu su nam potrebni ovi podaci u Maya softveru.

U ovom slučaju postoji više redova teksta , pri čemu svaki red navodi deset različitih vrednosti odvojenih zarezima. Ovu vrstu podataka navodimo tako što se odvojaju zarezom (comma-separated). U naš primeru postoji naziv objekta i devet vrednosti za njegovu transformaciju (translacije X,Y,Z, rotacije X,Y,Z, skaliranje X,Y,Z). Obratite pažnju da prva linija nema nikakve stvarne podatke, već samo govori šta koji podatak predstavlja. Ovo je uobičajeno za data fajlove. Verovatno će biti potrebno da prilagodite vaš program tako da preskoči prvu liniju koja dolazi sa podacima.

Koristeći ove podatke nameravamo da pronađemo objekte u našoj Maya sceni i podesimo njihove transformacije. Hajde da ovo uradimo!

Prvi deo našeg programa dodeljuje putanju do fajla , koji smo upravo kreirali, u promenljivu tipa string.

  1. // Define Your File Path  
  2. string $filePath = "C:/mel/myDataFile.txt" ;  

-----------------------------------------------------------
Napomena: Za putanje fajlova u Maya (i većini programskih paketa) zahteva se korišćenje znakova za forward slash (/) umesto znakova za backslash (\). Ukoliko koristite backslashes (\) znakove pojaviće se greška.
-----------------------------------------------------------

Sada kada u promenljivoj $filePath imamo sačuvanu putanju, iskoristićemo MEL komandu pod nazivom fopen . Ova komanda govori Maya da pronađe i otvori fajl, ali i šta želimo da uradimo sa njim. Postoji opcioni string argument (preporučujem da ga uvek koristite) that will tell Maya if you're going to just read the file, write to it, or append to the end of the existing file. koji govori Maya da li želimo samo da pročitamo fajl, upisujemo u njega ili želimo da ga proširimo. Pogledajte u MEL dokumentaciju za detalje o tome kako ovo radi. Za sada samo obratite pažnju da ćemo koristiti "r" read.
  1. // Open Your File  
  2. $fileId = `fopen $filePath "r"` ;  

Sa programskom linijom iznad smo sačuvali otvoreni fajl u promenljivu $fileId. U svakom trenutku, kada želimo da pristupimo fajlu u našem kodu, možemo umesto toga da koristimo $fileId. Korišćenjem stringa "r" u komandi dozvolili smo Maya da samo čita fajl i ništa drugo. Na ovaj način ne moramo da brinemo da će fajl na bilo koji način biti promenjen.

-----------------------------------------------------------
Napomena: U fread komandi, osim "r" (read), možete takože koristiti "w" (write) ili "a" (append). Više o ovome u sledećem uputstvu.
-----------------------------------------------------------

Sada, kada je fajl otvoren, možemo da ga pratimo. U ovom uputstvu ćemo pogledati dve komande. Prva je fread. Ona se koristi na sledeći način:
  1. // Read The Data Using fread  
  2. string $data = `fread $fileId $data` ;  

Upotreba je malo čudna, pošto istovremeno i definišemo string promenljivu i koristimo je kao argument u komandi , ali upravo je ovo načina na koji fread radi. Svi podaci iz fajla će biti preuzeti u jedan string. U ovom slučaju povratna vrednost stringa bi bila:
  1. // Result: objectName,polygonType,posX,posY,posZ,rotX,rotY,rotZ,scaleX,scaleY,scaleZ  
  2. pCube1,0,0,0,0,0,0,1,1,1  
  3. pSphere1,-5,10,-5,-90,90,-45,1,1,1  
  4. pCylinder1,2.5,2.342,4.2823,0,0,0,1,1,1  
  5. pPlane1,0,0,0,360,180,45,1,1,1//  

Lepo ! Svi podaci iz tekstualne datoteke su ubačeni u Maya! Uspeli smo!

Jedini problem je što su SVE informacije u jednom stringu.U ovom formatu to nije od velike koristi , pošto su aktuelni podaci zgusnuti i u više redova. Ako zaista želite da preuzmete string i razložite ga na sve potrebne podatke, ovo traži upotrebu više programskih petlji i komplikovanu upotrebu (MEL-ovih tokenize komandi)... ali ima i jednostavniji način za to. Postoji još jedna komanda, koju možemo iskoristiti, a zove se fgetline.

fgetline Komanda fgetline preuzima jedan red podataka iz datoteke i stavlja ga u string promenljivu. Ovo postaje korisno, jer sada možemo kreirati niz stringova (string array) i u njega upisati svaki red odvojeno. Dobijeni niz stringova će sadržati ceo tekst fajl..

Ono što koči je to što će fgetline preuzeti samo jednu liniju teksta i onda stati. Komanda nije dovoljno pametna da prođe kroz ceo tekst fajl u kontinuitetu, pa moramo ovo da tražimo posebno. Ovo činimo uz pomoć WHILE petlje. Proverite dole ... hajde da kombinujemo sve što smo do sada uradili:
  1. // Define Your File Path  
  2. string $filePath = "C:/mel/myDataFile.txt" ;  
  3.   
  4. // Open Your File  
  5. $fileId = `fopen $filePath "r"` ;  
  6.   
  7. // Get The First Line  
  8. string $nextLine = `fgetline $fileId` ;  
  9.   
  10. // Loop Until The String Size Is Zero (No Data)  
  11. while (size($nextLine) > 0) {  
  12.   
  13. // Strip Whitespace From The Beginning And End Of The Line  
  14. string $cleanLine = strip($nextLine) ;  
  15.   
  16. // Print Line  
  17. print ($cleanLine+"\n") ;  
  18.   
  19. // Get Next Line And Continue  
  20. $nextLine = `fgetline $fileId` ;  
  21.   
  22. }  

Ako pokrenete ovo, videćete kako Maya štampa pet linija našeg tekst fajla. U ovom primeru se svaki put štampa po jedna od tih linija. Konačni smo uspeli!

Hajde da napravimo još nekoliko dodataka i ubacimo ih u proceduru. Prvo želim da definišem niz sastavljen od stringova (string array) u koji će kasnije biti upisane sve linije iz tekst fajla, prilikom njegovog preuzimanja. Sledeće što želim je da dodam argument , koji govori da treba preskočiti prvi red. Ovo je korisno, pošto prvi red sadrži podatke koje ne želim. Na kraju, umesto kruto kodirane putanje u funkciji , želim da mojoj proceduri prosledim putanju do fajla preko argumenta. Ovako se putanja fajla može lakše prilagoditi.

Kada smo završili naša procedura izgleda ovako:
  1. // **********************************************************  
  2. // Reads A Text File And Returns A String Array Of Each Line  
  3. global proc string[] jgTextFileToStringArray (int $skipFirstLine, string $filePath) {  
  4.   
  5. // Open File  
  6. $fileId = `fopen $filePath "r"` ;  
  7.   
  8. // Define String Array  
  9. string $dataArray[] ;  
  10.   
  11. // Get The First Line  
  12. string $nextLine = `fgetline $fileId` ;  
  13.   
  14. // Loop Until The String Size Is Zero (No Data On That Line)  
  15. while (size($nextLine) > 0) {  
  16.   
  17. // Strip Whitespace From The Beginning And End Of The Line  
  18. string $cleanLine = strip($nextLine) ;  
  19.   
  20. // Add To Array  
  21. $dataArray[size($dataArray)] = $cleanLine ;  
  22.   
  23. // Get Next Line And Continue  
  24. $nextLine = `fgetline $fileId` ;  
  25.   
  26. }  
  27.   
  28. // Remove First Line  
  29. if($skipFirstLine) stringArrayRemoveAtIndex(0,$dataArray) ;  
  30.   
  31. // Return Array  
  32. return $dataArray ;  
  33.   
  34. }  

Pogledajte gotovu verziju ovde:
jgTextFileToStringArray.mel

Sledeće uputstvo će sve ovo proširiti i dalje pokazati kako upisivati u tekst fajl ili kako ga proširiti.

Ostavite komentar dole ukoliko mislite da je ovo bilo korisno ili ako imate bilo kakvih pitanja

Da li Vas interesuju druga uputstva? Pogledajte Script Swell-ovu Technical Artist Tutorials stranu.

 
Published (Last edited): 03-02-2013 , source: http://www.scriptswell.net/2010/09/mel-tutorial-how-to-read-text-file.html