// // File: vtk_mesh.cc // // (C) 2006 Toby Breckon // // Licensed under the terms of the Lesser General Public License. // #include "vtk_mesh.h" int VTK_Mesh::read(FILE *f, int (*update_progress)(int pos), void (*set_total)(int size)) { list *shape_triangles; list *shape_vertices; vector vertex_index; Triangle *tri; Vertex *v; char buffer[21]; int vertex_count = 0; int polygon_count = 0; int tmp, p1, p2, p3; float x, y, z; fseek(f, 0, SEEK_END); (*set_total)(ftell(f)); fseek(f, 0, SEEK_SET); shape_triangles = new list; shape_vertices = new list; // skip first two lines while (fgetc(f) != '\n') // Reads all of the 1st line ; while (fgetc(f) != '\n') // Reads all of the 2nd line ; // process rest of file while ((fscanf(f,"%20s ", buffer) != 0) && (!(feof(f)))) { if (strcasecmp(buffer, "BINARY") == 0) { // check file is ASCII FILE_ERROR(f, "VTK file format error: VTK ASCII support only."); return 3; } else if (strcasecmp(buffer, "DATASET") == 0) { // check DATASET is type POLYDATA if ((fscanf(f,"%20s ", buffer) != 1) || (strcasecmp(buffer, "POLYDATA") != 0)) { FILE_ERROR(f, "VTK file format error: POLYDATA data set support only."); return 3; } } else if (strcasecmp(buffer, "POINTS") == 0) { // get points if (fscanf(f,"%d float", &vertex_count) != 1) { FILE_ERROR(f, "VTK file format error: vertex/point count"); return 3; } for (int i = 1; i <= vertex_count; i++) { if ((fscanf(f,"%f %f %f",&x,&y,&z) != 3) && (!(feof(f)))) { FILE_ERROR(f, "VTK file format error: vertex value"); return 3; } v = new Vertex(x,y,z); add_vertex(v); // save in a vector for the edges and shape vertex_index.push_back(v); if ((*update_progress)(ftell(f))) return 90; } } else if (strcasecmp(buffer, "POLYGONS") == 0) { // get polygons if (fscanf(f,"%d %d", &polygon_count, &tmp) != 2) { FILE_ERROR(f, "VTK file format error: polygon count"); return 3; } while (fgetc(f) != '\n') // Reads all of the line ; for (int i=0; i < polygon_count; i++) /* Reads the triangles */ { if (fscanf(f,"3 %d %d %d\n",&p1,&p2,&p3) == 3) { if ((p1 >= vertex_count) || (p2 >= vertex_count) || (p3 >= vertex_count)){ FILE_ERROR(f, "VTK file format error: vertex index out of range"); return 8; } else { tri = new Triangle(vertex_index[p1], vertex_index[p2], vertex_index[p3]); add_triangle(tri); // save in a list for the shape shape_triangles->push_back(tri); } } else { // ignore polygons of > 3 vertices } if ((*update_progress)(ftell(f))) return 90; } } else { // ignore everything else in file } } if ((*update_progress)(ftell(f))) return 90; // copy the vertices of this shape over shape_vertices->insert(shape_vertices->begin(), vertex_index.begin(), vertex_index.end()); shapes->push_back(new Shape(shape_triangles, shape_vertices)); return 0; } void VTK_Mesh::write(FILE *f, const char *comment) { int n; list::iterator it; list::iterator iv; Vertex v; fprintf(f, "# vtk DataFile Version 2.0\n"); fprintf(f, "Generated by mview VTK exporter : %s\n", comment); fprintf(f, "ASCII\n"); fprintf(f, "DATASET POLYDATA\n"); n=0; // vertices fprintf(f, "POINTS %i float\n", vertices->size()); for (iv=vertices->begin(); iv != vertices->end(); iv++) { calc_original_coordinates(*iv, &v); fprintf(f,"%f %f %f\n", v.x(), v.y(), v.z()); (*iv)->number=++n; } // triangles fprintf(f, "POLYGONS %i %i\n", triangles->size(), triangles->size() * 4); for (it=triangles->begin(); it != triangles->end(); it++) fprintf(f,"3 %d %d %d\n", ((*it)->vertices[0]->number) -1 , ((*it)->vertices[1]->number) -1, ((*it)->vertices[2]->number) -1); }