Newer
Older
Import / research / 3d-z-maps / mview-0.3.3 / mview / gts_mesh.cpp
//
//    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);
}