Página principal | Jerarquía de la clase | Lista alfabética | Lista de componentes | Lista de archivos | Miembros de las clases | Archivos de los miembros | Páginas relacionadas

vtkload.C

Ir a la documentación de este archivo.
00001 //===========================================================================
00002 //= vtkload.C                                                 Marzo de 2002 =
00003 //=-------------------------------------------------------------------------=
00004 //= Sistema de lectura de archivos en formato de geometria VTK.             =
00005 //=-------------------------------------------------------------------------=
00006 //= ADVERTENCIA: ESTE SOFTWARE NO ESTA CONCEBIDO NI DISENNADO PARA EL USO   =
00007 //= EN EQUIPO DE CONTROL EN LINEA EN ENTORNOS PELIGROSOS QUE REQUIERAN UN   =
00008 //= DESEMPENNO LIBRE DE FALLAS, COMO LA OPERACION DE PLANTAS NUCLEARES,     = 
00009 //= SISTEMAS DE NAVEGACION O COMUNICACION EN AVIONES, TRAFICO AEREO,        =
00010 //= EQUIPO MEDICO DEL CUAL DEPENDAN VIDAS HUMANAS O SISTEMAS DE ARMAMENTO,  =
00011 //= EN LOS CUALES UNA FALLA EN EL SOFTWARE PUEDA IMPLICAR DIRECTAMENTE LA   =
00012 //= MUERTE, DANNOS PERSONALES O DANNOS FISICOS Y/O AMBIENTALES GRAVES       =
00013 //= ("ACTIVIDADES DE ALGO RIESGO").                                         =
00014 //=-------------------------------------------------------------------------=
00015 //= Modificado por Oscar J. Chavarro G.           oscarchavarro@hotmail.com =
00016 //===========================================================================
00017 
00018 #include <stdio.h>
00019 #include <stdlib.h>
00020 #include <string.h>
00021 #include <ctype.h>
00022 #include "toolkits/util/vtkload.h"
00023 #include "matriz4.h"
00024 #include "arreglo.cc"
00025 
00026 //===========================================================================
00027 //= Constantes y macros                                                     =
00028 //===========================================================================
00029 
00030 //#define DEBUG_VTK 1
00031 
00032 #define TAM_BUFFER 256
00033 
00034 #define COMPARAR_MM()                           \
00035         if ( v.x < Min->x ) Min->x = v.x;       \
00036         if ( v.y < Min->y ) Min->y = v.y;       \
00037         if ( v.z < Min->z ) Min->z = v.z;       \
00038         if ( v.x > Max->x ) Max->x = v.x;       \
00039         if ( v.y > Max->y ) Max->y = v.y;       \
00040         if ( v.z > Max->z ) Max->z = v.z;
00041 
00042 #define LEER_LINEA()                                                     \
00043     if ( !fgets(buffer, TAM_BUFFER, fd) ) {                              \
00044         fprintf(stderr, "<ESCENA_VTK> Fin de archivo prematuro leyendo " \
00045                 "VTK.\n");                                               \
00046         fflush(stderr);                                                  \
00047         return FALSE;                                                    \
00048     }
00049 
00050 
00051 //===========================================================================
00052 
00053 ESCENA_VTK::ESCENA_VTK(char *archivo)
00054 {
00055     _nombre_de_archivo = new char[strlen(archivo) + 1];
00056     strcpy(_nombre_de_archivo, archivo);
00057     modo_binario = FALSE;
00058 }
00059 
00060 ESCENA_VTK::~ESCENA_VTK()
00061 {
00062     delete _nombre_de_archivo;
00063 }
00064 
00065 void
00066 ESCENA_VTK::lower_case(char *cad)
00067 {
00068     int i;
00069     char *ptr;
00070 
00071     for ( i = 0, ptr = cad; *ptr != '\0' && i < 256; ptr++,i++ ) {
00072         *ptr = tolower(*ptr);
00073     }
00074 }
00075 
00076 void
00077 ESCENA_VTK::leer_float_BE(FILE *fd, float *f)
00078 {
00079     DWORD o, d;
00080 
00081     fread(&o, sizeof(DWORD), 1, fd);  
00082 
00083 #ifndef AQZ_BIG_ENDIAN
00084     BYTE *a, *b;
00085 
00086     a = (BYTE*)(&o);
00087     b = (BYTE*)(&d);
00088 
00089     b[0] = a[3];
00090     b[1] = a[2];
00091     b[2] = a[1];
00092     b[3] = a[0];
00093 #endif
00094 #ifdef AQZ_BIG_ENDIAN
00095     d = o;
00096 #endif
00097 
00098     (*f) = *((float *)(&d));
00099   #ifdef DEBUG_VTK
00100     #ifdef AQZ_BIG_ENDIAN
00101     BYTE *a = (BYTE *)(&o);
00102     #endif
00103     printf("%02X%02X %02X%02X -> %f\n", a[0], a[1], a[2], a[3], *f);
00104   #endif
00105 }
00106 
00107 void
00108 ESCENA_VTK::leer_DWORD_BE(FILE *fd, DWORD *i)
00109 {
00110     DWORD o;
00111 
00112     fread(&o, sizeof(DWORD), 1, fd);  
00113 
00114 #ifndef AQZ_BIG_ENDIAN
00115     BYTE *a, *b;
00116 
00117     a = (BYTE*)(&o);
00118     b = (BYTE*)(i);
00119 
00120     b[0] = a[3];
00121     b[1] = a[2];
00122     b[2] = a[1];
00123     b[3] = a[0];
00124 #endif
00125 
00126 #ifdef AQZ_BIG_ENDIAN
00127     BYTE *a, *b;
00128 
00129     a = (BYTE*)(&o);
00130     b = (BYTE*)(i);
00131 
00132     b[0] = a[0];
00133     b[1] = a[1];
00134     b[2] = a[2];
00135     b[3] = a[3];
00136 #endif
00137 
00138   #ifdef DEBUG_VTK
00139     printf("%02X%02X %02X%02X ", a[0], a[1], a[2], a[3]);
00140   #endif
00141 }
00142 
00143 BOOLEAN
00144 ESCENA_VTK::leer_pd(FILE *fd, long int tam, MESH *Geometria)
00145 {
00146     //-----------------------------------------------------------------------
00147     VECTOR n;
00148     float f;
00149     char buffer[TAM_BUFFER];
00150     long int i;
00151     VERTICE_GL *Vector;
00152     long int tv;
00153 
00154     if ( !fgets(buffer, TAM_BUFFER, fd) ) {
00155         return FALSE;
00156     }
00157 
00158     if ( !strstr(buffer, "normals float") ) {
00159         fprintf(stderr, "<ESCENA_VTK> Atributos distintos a normales en "
00160                 "float\n    no se soportan!\n"); fflush(stderr);
00161         return FALSE;
00162     }
00163 
00164     Geometria->get_vertices(&Vector, &tv);
00165 
00166     VECTOR nn;
00167 
00168     for ( i = 0; i < tam && tam <= tv; i++ ) {
00169         leer_float_BE(fd, &f);   n.x = f;
00170         leer_float_BE(fd, &f);   n.z = -f;
00171         leer_float_BE(fd, &f);   n.y = f;
00172 
00173         nn.x = (float)n.x;
00174         nn.y = (float)n.y;
00175         nn.z = (float)n.z;
00176         //nn.z = nn.z / 9;
00177         nn.normalizar();
00178 
00179         Vector[i].nx = (float)nn.x;
00180         Vector[i].ny = (float)nn.y;
00181         Vector[i].nz = (float)nn.z;
00182 
00183     }
00184     fseek(fd, 1, SEEK_CUR);
00185 
00186     //-----------------------------------------------------------------------
00187 
00188     return TRUE;
00189 }
00190 
00191 BOOLEAN
00192 ESCENA_VTK::leer_tiras(FILE *fd, long int /*a*/, long int b, MESH *Geometria)
00196 {
00197     //-----------------------------------------------------------------------
00198     if ( !modo_binario ) {
00199         fprintf(stderr, "<ESCENA_VTK> - Modo ASCII no soportado.\n");
00200         fflush(stderr);
00201         return FALSE;
00202     }
00203 
00204     //- Leer los datos ------------------------------------------------------
00205     DWORD k;
00206     int i;
00207     ARREGLO <DWORD> data(100);
00208 
00209     for ( i = 0; i < b; i++ ) {
00210         //printf("%04d -> [ ", i+1); 
00211         leer_DWORD_BE(fd, &k);
00212         //printf("]: %ld\n", k); fflush(stdout);
00213         if ( (long int)k > Geometria->num_vertices() ) {
00214             fprintf(stderr, "<ESCENA_VTK> Dato fuera de rango!");
00215             fflush(stdout);
00216             return FALSE;
00217         }
00218         data.anx(k);
00219     }
00220     fseek(fd, 1, SEEK_CUR);
00221 
00222     //- Procesar los datos --------------------------------------------------
00223     DWORD delta_tam;
00224     #ifdef DEBUG_VTK
00225     DWORD acum = 0;
00226     #endif
00227     //TRIANGULO_GL dummy;
00228     COLOR ambient, diffuse, specular;
00229 
00230     //- Felizmente es barato tener oro en la realidad virtual :-)
00231     ambient.r = ambient.g = ambient.b = 0.2f;
00232     diffuse.r = 0.85f;    diffuse.g = 0.85f;    diffuse.b = 0.1f;
00233     specular.r = specular.g = specular.b = 1.0;
00234     ambient.alpha = diffuse.alpha = specular.alpha = 1.0;
00235     Geometria->anx_material(ambient, diffuse, specular, "WG_DEFAULT", "", 1);
00236     //Geometria->anx_triangle(dummy, "WG_DEFAULT");
00237     void anx_material(COLOR, COLOR, COLOR, char *, char *, int);
00238 
00239     for ( i = 0; i < data.tam(); i++ ) {
00240         delta_tam = data[i];
00241       #ifdef DEBUG_VTK
00242         acum++;
00243         printf("       . Tira %ld: %ld elementos.\n", acum, delta_tam);
00244         fflush(stdout);
00245       #endif
00246         for ( k = 0; k < delta_tam; k++ ) {
00247             i++;
00248             Geometria->anx_indice_tira(data[i]);
00249         }
00250         Geometria->anx_tira();
00251     }
00252     return TRUE;
00253 }
00254 
00255 BOOLEAN
00256 ESCENA_VTK::leer_puntos(FILE *fd, char *tipo, long int n, MESH *Geometria, 
00257                         VECTOR *Min, VECTOR *Max)
00258 {
00259     //-----------------------------------------------------------------------
00260     int i;
00261     VERTICE_GL v;
00262     float f;
00263 
00264     lower_case(tipo);
00265 
00266     if ( strcmp(tipo, "float") == 0 ) {
00267         if ( !modo_binario ) {
00268             fprintf(stderr, "<ESCENA_VTK> El modo ASCII "
00269                   "aun no se soporta!\n"); 
00270             fflush(stderr);
00271             return FALSE;
00272         }
00273       #ifdef DEBUG_VTK
00274         printf("      . Leo %ld vertices float en modo binario!\n", n);
00275       #endif
00276         
00277         for ( i = 0; i < n; i++ ) {
00278             //printf("[%04d] ", i+1);
00279             leer_float_BE(fd, &f);   v.x = f/100;
00280             leer_float_BE(fd, &f);   v.z = -f/100;
00281             leer_float_BE(fd, &f);   v.y = f/100;
00282             v.nx = 0;
00283             v.ny = 0;
00284             v.nz = 1;
00285 
00286             //v.z *= 9;
00287 
00288             COMPARAR_MM();
00289             Geometria->anx_vertex(v);
00290 
00291 
00292             //printf(" - < %.2f %.2f %.2f >\n", v.x, v.y, v.z);
00293 
00294         }
00295         fseek(fd, 1, SEEK_CUR);
00296       }
00297       else {
00298         fprintf(stderr, "<ESCENA_VTK> El tipo de datos \"%s\" para "
00299           "vertices aun no se soporta!\n", tipo); 
00300         fflush(stderr);
00301         return FALSE;
00302       }
00303     ;
00304 
00305     //-----------------------------------------------------------------------
00306     return TRUE;
00307 
00308 #ifdef NONONO
00309 
00310     vtkDataArray *array;
00311 
00312     if ( ! strncmp(tipo, "bit", 3) )
00313     {
00314         array = vtkBitArray::New();
00315         array->SetNumberOfComponents(numComp);
00316         unsigned char *ptr=((vtkBitArray *)array)->WritePointer(0,numTuples*numComp);
00317         if ( this->FileTipo == VTK_BINARY )
00318         {
00319             char line[256];
00320             this->IS->getline(line,256);
00321             this->IS->read((char *)ptr,sizeof(unsigned char)*(numTuples*numComp+7)/8);
00322             if (this->IS->eof())
00323             {
00324                 vtkErrorMacro(<<"Error reading binary bit array!");
00325                 free(tipo);
00326                 return NULL;
00327             }
00328         }
00329         else 
00330         {
00331             int b;
00332             for (int i=0; i<numTuples; i++)
00333             {
00334                 for (int j=0; j<numComp; j++)
00335                 {
00336                     if ( !this->Read(&b) )
00337                     {
00338                         vtkErrorMacro(<<"Error reading ascii bit array! tuple: " << i << ", component: " << j);
00339                         free(tipo);
00340                         return NULL;
00341                     }
00342                     else
00343                     {
00344                         ((vtkBitArray *)array)->SetValue(i*numComp+j,b);
00345                     }
00346                 }
00347             }
00348         }
00349     }
00350   
00351     else if ( ! strncmp(tipo, "char", 4) )
00352     {
00353         array = vtkCharArray::New();
00354         array->SetNumberOfComponents(numComp);
00355         char *ptr = ((vtkCharArray *)array)->WritePointer(0,numTuples*numComp);
00356         if ( this->FileTipo == VTK_BINARY )
00357         {
00358             ReadBinaryData(this->IS, ptr, numTuples, numComp);
00359         }
00360         else 
00361         {
00362             ReadASCIIData(this, ptr, numTuples, numComp);
00363         }
00364     }
00365   
00366     else if ( ! strncmp(tipo, "unsigned_char", 13) )
00367     {
00368         array = vtkUnsignedCharArray::New();
00369         array->SetNumberOfComponents(numComp);
00370         unsigned char *ptr = ((vtkUnsignedCharArray *)array)->WritePointer(0,numTuples*numComp);
00371         if ( this->FileTipo == VTK_BINARY )
00372         {
00373             ReadBinaryData(this->IS, ptr, numTuples, numComp);
00374         }
00375         else 
00376         {
00377             ReadASCIIData(this, ptr, numTuples, numComp);
00378         }
00379     }
00380   
00381     else if ( ! strncmp(tipo, "short", 5) )
00382     {
00383         array = vtkShortArray::New();
00384         array->SetNumberOfComponents(numComp);
00385         short *ptr = ((vtkShortArray *)array)->WritePointer(0,numTuples*numComp);
00386         if ( this->FileTipo == VTK_BINARY )
00387         {
00388             ReadBinaryData(this->IS, ptr, numTuples, numComp);
00389             vtkByteSwap::Swap2BERange(ptr,numTuples*numComp);
00390         }
00391         else 
00392         {
00393             ReadASCIIData(this, ptr, numTuples, numComp);
00394         }
00395     }
00396   
00397     else if ( ! strncmp(tipo, "unsigned_short", 14) )
00398     {
00399         array = vtkUnsignedShortArray::New();
00400         array->SetNumberOfComponents(numComp);
00401         unsigned short *ptr = ((vtkUnsignedShortArray *)array)->WritePointer(0,numTuples*numComp);
00402         if ( this->FileTipo == VTK_BINARY )
00403         {
00404             ReadBinaryData(this->IS, ptr, numTuples, numComp);
00405             vtkByteSwap::Swap2BERange((short *)ptr,numTuples*numComp);
00406         }
00407         else 
00408         {
00409             ReadASCIIData(this, ptr, numTuples, numComp);
00410         }
00411     }
00412   
00413     else if ( ! strncmp(tipo, "int", 3) )
00414     {
00415         array = vtkIntArray::New();
00416         array->SetNumberOfComponents(numComp);
00417         int *ptr = ((vtkIntArray *)array)->WritePointer(0,numTuples*numComp);
00418         if ( this->FileTipo == VTK_BINARY )
00419         {
00420             ReadBinaryData(this->IS, ptr, numTuples, numComp);
00421             vtkByteSwap::Swap4BERange(ptr,numTuples*numComp);
00422         }
00423         else 
00424         {
00425             ReadASCIIData(this, ptr, numTuples, numComp);
00426         }
00427     }
00428   
00429     else if ( ! strncmp(tipo, "unsigned_int", 12) )
00430     {
00431         array = vtkUnsignedIntArray::New();
00432         array->SetNumberOfComponents(numComp);
00433         unsigned int *ptr = ((vtkUnsignedIntArray *)array)->WritePointer(0,numTuples*numComp);
00434         if ( this->FileTipo == VTK_BINARY )
00435         {
00436             ReadBinaryData(this->IS, ptr, numTuples, numComp);
00437             vtkByteSwap::Swap4BERange((int *)ptr,numTuples*numComp);
00438         }
00439         else 
00440         {
00441             ReadASCIIData(this, ptr, numTuples, numComp);
00442         }
00443     }
00444   
00445     else if ( ! strncmp(tipo, "long", 4) )
00446     {
00447         array = vtkLongArray::New();
00448         array->SetNumberOfComponents(numComp);
00449         long *ptr = ((vtkLongArray *)array)->WritePointer(0,numTuples*numComp);
00450         if ( this->FileTipo == VTK_BINARY )
00451         {
00452             ReadBinaryData(this->IS, ptr, numTuples, numComp);
00453             vtkByteSwap::Swap4BERange((int *)ptr,numTuples*numComp);
00454         }
00455 
00456         else 
00457         {
00458             ReadASCIIData(this, ptr, numTuples, numComp);
00459         }
00460     }
00461   
00462     else if ( ! strncmp(tipo, "unsigned_long", 13) )
00463     {
00464         array = vtkUnsignedLongArray::New();
00465         array->SetNumberOfComponents(numComp);
00466         unsigned long *ptr = ((vtkUnsignedLongArray *)array)->WritePointer(0,numTuples*numComp);
00467         if ( this->FileTipo == VTK_BINARY )
00468         {
00469             ReadBinaryData(this->IS, ptr, numTuples, numComp);
00470             vtkByteSwap::Swap4BERange((int *)ptr,numTuples*numComp);
00471         }
00472         else 
00473         {
00474             ReadASCIIData(this, ptr, numTuples, numComp);
00475         }
00476     }
00477   
00478     else if ( ! strncmp(tipo, "float", 5) )
00479     {
00480         array = vtkFloatArray::New();
00481         array->SetNumberOfComponents(numComp);
00482         float *ptr = ((vtkFloatArray *)array)->WritePointer(0,numTuples*numComp);
00483         if ( this->FileTipo == VTK_BINARY )
00484         {
00485             ReadBinaryData(this->IS, ptr, numTuples, numComp);
00486             vtkByteSwap::Swap4BERange(ptr,numTuples*numComp);
00487         }
00488         else 
00489         {
00490             ReadASCIIData(this, ptr, numTuples, numComp);
00491         }
00492     }
00493   
00494     else if ( ! strncmp(tipo, "double", 6) )
00495     {
00496         array = vtkDoubleArray::New();
00497         array->SetNumberOfComponents(numComp);
00498         double *ptr = ((vtkDoubleArray *)array)->WritePointer(0,numTuples*numComp);
00499         if ( this->FileTipo == VTK_BINARY )
00500         {
00501             ReadBinaryData(this->IS, ptr, numTuples, numComp);
00502                 //      vtkByteSwap::Swap4BERange(ptr,numTuples*numComp);
00503         }
00504         else 
00505         {
00506             ReadASCIIData(this, ptr, numTuples, numComp);
00507         }
00508     }
00509   
00510     else 
00511     {
00512         vtkErrorMacro(<< "Unsupported data tipo: " << tipo);
00513         free(tipo);
00514         return NULL;
00515     }
00516 
00517     free(tipo);
00518 #endif
00519 }
00520 
00521 BOOLEAN
00522 ESCENA_VTK::leer_dataset(FILE *fd, MESH *Geometria, double *Escala_optima)
00523 {
00524     //-----------------------------------------------------------------------
00525     // Esto es para calcular el factor de escala optima
00526     VECTOR min, max;
00527 
00528     min.x = INFINITO;
00529     min.y = INFINITO;
00530     min.z = INFINITO;
00531     max.x = -INFINITO;
00532     max.y = -INFINITO;
00533     max.z = -INFINITO;
00534 
00535     //-----------------------------------------------------------------------
00536     char *ptr;
00537     char buffer[TAM_BUFFER];
00538     long int num_elems1;
00539     long int num_elems2;
00540 
00541     ptr = strtok(NULL, " \t\n\r");
00542     if ( !ptr ) {
00543         fprintf(stderr,"<ESCENA_VTK> - Parse error (init).\n"); fflush(stderr);
00544         return FALSE;
00545     }
00546     lower_case(ptr);
00547 
00548     if ( strcmp(ptr, "polydata") != 0 ) {
00549         fprintf(stderr,"<ESCENA_VTK> - Parse error (polydata).\n");
00550         fflush(stderr);
00551         return FALSE;
00552     }
00553 
00554     while ( fgets(buffer, TAM_BUFFER, fd) ) {
00555         ptr = strtok(buffer, " \t\n\r");
00556         if ( !ptr ) {
00557             fprintf(stderr,"<ESCENA_VTK> - Parse error (data) en [%s].\n",
00558                     buffer);
00559             fflush(stderr); 
00560             break;
00561             //return FALSE;
00562         }
00563         lower_case(ptr);
00564 
00565         if ( strcmp(ptr, "field") == 0 ) {
00566             // 1
00567           #ifdef DEBUG_VTK
00568             printf("    - Leyendo segmento field\n");
00569           #endif
00570             fprintf(stderr,"<ESCENA_VTK> Segmento FIELD no soportado.\n");
00571             fflush(stderr);
00572             exit(1);
00573           }
00574           else if ( strcmp(ptr, "points") == 0 ) {
00575             // 2
00576           #ifdef DEBUG_VTK
00577             printf("    - Leyendo segmento points\n");
00578           #endif
00579             ptr = strtok(NULL, " \t\n\r");
00580             if ( !ptr ) {
00581                 fprintf(stderr,"<ESCENA_VTK> - Parse error (points).\n");
00582                 fflush(stderr); return FALSE;
00583             }
00584             num_elems1 = atol(ptr);
00585             ptr = strtok(NULL, " \t\n\r");
00586             if ( !ptr ) {
00587                 fprintf(stderr,"<ESCENA_VTK> - Parse error (points).\n");
00588                 fflush(stderr); return FALSE;
00589             }
00590           #ifdef DEBUG_VTK
00591             printf("      . Leyendo %ld vertices de tipo %s\n", 
00592                    num_elems1, ptr);
00593           #endif
00594             if ( !leer_puntos(fd, ptr, num_elems1, Geometria, &min, &max) ) {
00595                 return FALSE;
00596             }
00597           }
00598           else if ( strcmp(ptr, "vertices") == 0 ) {
00599             // 3
00600           #ifdef DEBUG_VTK
00601             printf("    - Leyendo segmento \n");
00602           #endif
00603             fprintf(stderr,"<ESCENA_VTK> Segmento VERTICES no soportado.\n");
00604             fflush(stderr);
00605             exit(1);
00606           }
00607           else if ( strcmp(ptr, "lines") == 0 ) {
00608             // 4
00609           #ifdef DEBUG_VTK
00610             printf("    - Leyendo segmento lines\n");
00611           #endif
00612             fprintf(stderr,"<ESCENA_VTK> Segmento LINES no soportado.\n");
00613             fflush(stderr);
00614             exit(1);
00615           }
00616           else if ( strcmp(ptr, "polygons") == 0 ) {
00617             // 5
00618           #ifdef DEBUG_VTK
00619             printf("    - Leyendo segmento polygons\n");
00620           #endif
00621             fprintf(stderr,"<ESCENA_VTK> Segmento POLYGONS no soportado.\n");
00622             fflush(stderr);
00623             exit(1);
00624           }
00625           else if ( strcmp(ptr, "triangle_strips") == 0 ) {
00626             // 6
00627           #ifdef DEBUG_VTK
00628             printf("    - Leyendo segmento triangle_strips\n");
00629           #endif
00630             ptr = strtok(NULL, " \t\n\r");
00631             if ( !ptr ) {
00632                 fprintf(stderr,"<ESCENA_VTK> - Parse error (tstrips).\n");
00633                 fflush(stderr); return FALSE;
00634             }
00635             num_elems1 = atol(ptr);
00636             ptr = strtok(NULL, " \t\n\r");
00637             if ( !ptr ) {
00638                 fprintf(stderr,"<ESCENA_VTK> - Parse error (tstrips).\n");
00639                 fflush(stderr); return FALSE;
00640             }
00641             num_elems2 = atol(ptr);
00642           #ifdef DEBUG_VTK
00643             printf("      . Leyendo %ld tiras de triangulos (con %ld "
00644                    "referencias a vertices)\n", 
00645                    num_elems1, num_elems2);
00646           #endif
00647             if ( !leer_tiras(fd, num_elems1, num_elems2, Geometria) ) {
00648                 return FALSE;
00649             }
00650           }
00651           else if ( strcmp(ptr, "cell_data") == 0 ) {
00652             // 7
00653           #ifdef DEBUG_VTK
00654             printf("    - Leyendo segmento cell_data\n");
00655           #endif
00656             fprintf(stderr,"<ESCENA_VTK> Segmento CELL_DATA no soportado.\n");
00657             fflush(stderr);
00658             exit(1);
00659           }
00660           else if ( strcmp(ptr, "point_data") == 0 ) {
00661             // 8
00662           #ifdef DEBUG_VTK
00663             printf("    - Leyendo segmento point_data\n");
00664           #endif
00665             ptr = strtok(NULL, " \t\n\r");
00666             if ( !ptr ) {
00667                 fprintf(stderr,"<ESCENA_VTK> - Parse error (tstrips).\n");
00668                 fflush(stderr); return FALSE;
00669             }
00670             num_elems1 = atol(ptr);
00671           #ifdef DEBUG_VTK
00672             printf("      . Leyendo %ld grupos de atributos de vertice.\n", 
00673                    num_elems1);
00674           #endif
00675             if ( !leer_pd(fd, num_elems1, Geometria) ) {
00676                 return FALSE;
00677             }
00678           }
00679           else {
00680             // 9
00681             fprintf(stderr,
00682                     "<ESCENA_VTK> - Parse error (segmento [%s] invalido).\n",
00683                     ptr);
00684             fflush(stderr); return FALSE;
00685           }
00686         ;
00687     }
00688     
00689     //-----------------------------------------------------------------------
00690     VECTOR factor;
00691     factor = max - min;
00692     (*Escala_optima) = 5/factor.norma();
00693   #ifdef DEBUG_VTK
00694     printf("Min:  < %.2f %.2f %.2f >\n", min.x, min.y, min.z);
00695     printf("Max:  < %.2f %.2f %.2f >\n", max.x, max.y, max.z);
00696     printf("Escala optima = %.2f\n", *Escala_optima); fflush(stdout);
00697   #endif
00698     return TRUE;
00699 }
00700 
00701 BOOLEAN
00702 ESCENA_VTK::leer(FILE *fd, MESH *Geometria, double *Escala_optima)
00703 {
00704     //- Lea el encabezado VTK -----------------------------------------------
00705     char buffer[TAM_BUFFER];
00706     char *ptr;
00707 
00708   #ifdef DEBUG_VTK
00709     printf("<ESCENA_VTK> - Leyendo archivo VTK:\n");
00710     printf("  - Leyendo encabezado VTK:\n");
00711   #endif
00712 
00713     LEER_LINEA();
00714     if ( strncmp ("# vtk DataFile Version", buffer, 20) ) {
00715         fprintf(stderr, "<ESCENA_VTK> Formato de archivo VTK desconocido.\n");
00716         fflush(stderr);
00717         return FALSE;
00718     }
00719   #ifdef DEBUG_VTK
00720     printf("    - Formato reconocido.\n");
00721   #endif
00722 
00723     LEER_LINEA();
00724     ptr = strchr(buffer, '\n');
00725     if ( ptr ) ptr[0] = '\0';
00726   #ifdef DEBUG_VTK
00727     printf("    - El titulo de los datos es \"%s\".\n", buffer);
00728   #endif
00729 
00730     LEER_LINEA();
00731     lower_case(buffer);
00732     if ( strstr(buffer, "ascii") ) {
00733         modo_binario = FALSE;
00734       }
00735       else if ( strstr(buffer, "binary") ) {
00736         modo_binario = TRUE;
00737       }
00738       else {
00739         fprintf(stderr, "<ESCENA_VTK> Formato de archivo invalido "
00740                 "<binario/ascci>.\n");
00741         fflush(stderr);
00742         return FALSE;
00743       }
00744     ;
00745   #ifdef DEBUG_VTK
00746     printf("    - El formato de representacion de datos es %s.\n", 
00747            modo_binario?"binario":"ascii");
00748   #endif
00749 
00750     //-----------------------------------------------------------------------
00751     LEER_LINEA();
00752 
00753     ptr = strtok(buffer, " \t\n\r");
00754     lower_case(ptr);
00755     if ( strcmp(ptr, "dataset") == 0 ) { 
00756       #ifdef DEBUG_VTK
00757         printf("  - Leyendo un archivo VTK con informacion tipo DATASET:\n");
00758       #endif    
00759         return leer_dataset(fd, Geometria, Escala_optima);
00760       }
00761       else if ( strcmp(ptr, "cell_data") == 0 ) { 
00762       #ifdef DEBUG_VTK
00763           printf("  - Leyendo un archivo VTK tipo CELL_DATA:\n"); 
00764       #endif    
00765       }
00766       else if ( strcmp(ptr, "point_data") == 0 ) { 
00767       #ifdef DEBUG_VTK
00768           printf("  - Leyendo un archivo VTK tipo POINT_DATA:\n");
00769       #endif    
00770       }
00771       else { 
00772         fprintf(stderr, "<ESCENA_VTK> - Error, bloque \"%s\" invalido.\n",
00773                 ptr);
00774         fflush(stderr);
00775       }
00776     ;
00777 
00778     //-----------------------------------------------------------------------
00779     return TRUE;
00780 }
00781 
00782 //===========================================================================
00783 
00784 void
00785 importar_VTK(ESCENA_VTK *Lector, MESH *Geometria, double *Escala_optima)
00794 {
00795     Geometria->set_nombre_de_archivo(Lector->_nombre_de_archivo);
00796 
00797     //- Exporte la geometria y la topologia de la malla ----------------------
00798   #ifdef DEBUG_VTK
00799     clrscr();
00800     printf("<ESCENA_VTK> -> Leyendo archivo VTK [%s]\n",
00801            Lector->_nombre_de_archivo); 
00802     fflush(stdout);
00803   #endif
00804  
00805     FILE *fd;
00806 
00807     fd = fopen(Lector->_nombre_de_archivo, "rb");
00808     if ( !fd ) {
00809         fprintf(stderr, "<importar_VTK> - Error leyendo VTK\n"); 
00810         fprintf(stderr, "  - No puedo abrir el archivo \"%s\".\n", 
00811                 Lector->_nombre_de_archivo); 
00812         fflush(stderr);
00813         exit(1);
00814     }
00815 
00816     if ( !Lector->leer(fd, Geometria, Escala_optima) ) {
00817         fprintf(stderr, "<importar_VTK> - Error leyendo VTK\n"); 
00818         fflush(stderr);
00819         //exit(1);
00820     }
00821     fclose(fd);
00822 
00823     Geometria->init();
00824 }
00825 
00826 //===========================================================================
00827 //= EOF                                                                     =
00828 //===========================================================================
00829 

Este archivo HTML ha sido generado automáticamente a partir del código fuente AQUYNZA. NO LO EDITE. Para mayor información contacte al autor.