00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
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
00028
00029
00030
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
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 , 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
00205 DWORD k;
00206 int i;
00207 ARREGLO <DWORD> data(100);
00208
00209 for ( i = 0; i < b; i++ ) {
00210
00211 leer_DWORD_BE(fd, &k);
00212
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
00223 DWORD delta_tam;
00224 #ifdef DEBUG_VTK
00225 DWORD acum = 0;
00226 #endif
00227
00228 COLOR ambient, diffuse, specular;
00229
00230
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
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
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
00287
00288 COMPARAR_MM();
00289 Geometria->anx_vertex(v);
00290
00291
00292
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
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
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
00562 }
00563 lower_case(ptr);
00564
00565 if ( strcmp(ptr, "field") == 0 ) {
00566
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
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
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
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
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
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
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
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
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
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
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
00820 }
00821 fclose(fd);
00822
00823 Geometria->init();
00824 }
00825
00826
00827
00828
00829