// // File: gts_mesh.cc // // (C) 2000-2006 Helmut Cantzler // // Licensed under the terms of the Lesser General Public License. // #include "gts_mesh.h" void GTS_Mesh::skip_comment(FILE *f) { unsigned char c; if(!(feof(f))){ c = fgetc(f); } else { return; } while(c == '#'){ while ((fgetc(f) != '\n') && (!(feof(f)))) // Reads till end of the line ; if(!(feof(f))){ c = fgetc(f); } } if(!(feof(f))){ ungetc(c, f); } return; } int GTS_Mesh::read(FILE *f, int (*update_progress)(int pos), void (*set_total)(int size)) { list *shape_triangles; list *shape_vertices; vector vertex_index; vector edge_vector; Triangle *tri; Vertex *v; Edge *e; int i, p1, p2, p3; int v_nr, e_nr, t_nr; float x, y, z; fseek(f, 0, SEEK_END); (*set_total)(ftell(f)); fseek(f, 0, SEEK_SET); skip_comment(f); if (fscanf(f,"%d %d %d", &v_nr, &e_nr, &t_nr) != 3) // Read header { FILE_ERROR(f, "GTS header format error"); return 2; } while (fgetc(f) != '\n') // Reads till end of the line ; shape_triangles = new list; shape_vertices = new list; for (i=0; i < v_nr; i++) // Reads the vertices { skip_comment(f); if (fscanf(f,"%f %f %f\n",&x,&y,&z) != 3) { FILE_ERROR(f, "GTS file format error: v"); 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; } for (i=0; i < e_nr; i++) /* Reads the edges */ { skip_comment(f); if (fscanf(f,"%d %d\n",&p1,&p2) != 2) { FILE_ERROR(f, "GTS file format error: e"); return 4; } e = new Edge(vertex_index[p1-1], vertex_index[p2-1]); add_edge(e); // save in a vector for the triangles edge_vector.push_back(e); if ((*update_progress)(ftell(f))) return 90; } for (i=0; i < t_nr; i++) /* Reads the triangles */ { skip_comment(f); if (fscanf(f,"%d %d %d\n",&p1,&p2,&p3) != 3) { FILE_ERROR(f, "GTS file format error: t"); return 5; } tri = new Triangle(edge_vector[p1-1], edge_vector[p2-1], edge_vector[p3-1]); add_triangle(tri); // save in a list for the shape shape_triangles->push_back(tri); 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 GTS_Mesh::write(FILE *f, const char *comment) { int n; list::iterator it; list::iterator ie; list::iterator iv; Vertex v; // create edges if (edge_nr == 0) create_edges(); // header fprintf(f,"%d %d %d\n", ver_nr, edge_nr, tri_nr); // vertex::number == vertex::name ??? n=0; // vertices 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()); n++; (*iv)->number=n; } // edge::number == edge::name ??? n=0; // edges for (ie=edges->begin(); ie != edges->end(); ie++) { fprintf(f,"%d %d\n", (*ie)->vertices[0]->number, (*ie)->vertices[1]->number); n++; (*ie)->number=n; } for (it=triangles->begin(); it != triangles->end(); it++) fprintf(f,"%d %d %d\n", (*it)->edges[2]->number, (*it)->edges[1]->number, (*it)->edges[0]->number); }