//
// File: gts_mesh.cc
//
// (C) 2000-2008 Helmut Cantzler
//
// Licensed under the terms of the Lesser General Public License.
//
#include "gts_mesh.h"
void GTSMesh::skipComment(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 GTSMesh::read(FILE *f, int (*updateProgress)(int pos),
void (*setTotal)(int size))
{
list<Triangle*> *shapeTriangles;
list<Vertex*> *shapeVertices;
vector<Vertex*> vertexIndex;
vector<Edge*> edgeVector;
Triangle *tri;
Vertex *v;
Edge *e;
int i, p1, p2, p3;
int vNr, eNr, tNr;
float x, y, z;
fseek(f, 0, SEEK_END);
(*setTotal)(ftell(f));
fseek(f, 0, SEEK_SET);
skipComment(f);
if (fscanf(f,"%d %d %d", &vNr, &eNr, &tNr) != 3) // Read header
{
FILE_ERROR(f, "GTS header format error");
return 2;
}
while (fgetc(f) != '\n') // Reads till end of the line
;
shapeTriangles = new list<Triangle*>;
shapeVertices = new list<Vertex*>;
for (i=0; i < vNr; i++) // Reads the vertices
{
skipComment(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);
addVertex(v);
// save in a vector for the edges and shape
vertexIndex.push_back(v);
if ((*updateProgress)(ftell(f)))
return 90;
}
for (i=0; i < eNr; i++) /* Reads the edges */
{
skipComment(f);
if (fscanf(f,"%d %d\n",&p1,&p2) != 2)
{
FILE_ERROR(f, "GTS file format error: e");
return 4;
}
e = new Edge(vertexIndex[p1-1], vertexIndex[p2-1]);
addEdge(e);
// save in a vector for the triangles
edgeVector.push_back(e);
if ((*updateProgress)(ftell(f)))
return 90;
}
for (i=0; i < tNr; i++) /* Reads the triangles */
{
skipComment(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(edgeVector[p1-1], edgeVector[p2-1],
edgeVector[p3-1]);
addTriangle(tri);
// save in a list for the shape
shapeTriangles->push_back(tri);
if ((*updateProgress)(ftell(f)))
return 90;
}
// copy the vertices of this shape over
shapeVertices->insert(shapeVertices->begin(),
vertexIndex.begin(), vertexIndex.end());
shapes->push_back(new Shape(shapeTriangles, shapeVertices));
return 0;
}
void GTSMesh::write(FILE *f, const char *comment)
{
int n;
list<Triangle*>::iterator it;
list<Edge*>::iterator ie;
list<Vertex*>::iterator iv;
Vertex v;
// create edges
if (edgeNr == 0)
createEdges();
// header
fprintf(f,"%d %d %d\n", verNr, edgeNr, triNr);
// vertex::number == vertex::name ???
n=0; // vertices
for (iv=vertices->begin(); iv != vertices->end(); iv++)
{
calcOriginalCoordinates(*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);
}