From 8acb8f5242ea213a467969dcc0764507cdafc976 Mon Sep 17 00:00:00 2001
From: Jean-Francois Remacle <jean-francois.remacle@uclouvain.be>
Date: Thu, 21 Apr 2005 09:26:11 +0000
Subject: [PATCH] *** empty log message ***

---
 Mesh/BDS.cpp        | 162 ++++++++++++++++++++++++++++++++++----------
 Mesh/BDS.h          |  47 +++++++------
 Parser/OpenFile.cpp |  29 +++++---
 3 files changed, 166 insertions(+), 72 deletions(-)

diff --git a/Mesh/BDS.cpp b/Mesh/BDS.cpp
index b334a1bf99..3b40069c01 100644
--- a/Mesh/BDS.cpp
+++ b/Mesh/BDS.cpp
@@ -168,7 +168,7 @@ BDS_Triangle * BDS_Mesh :: add_triangle  (int p1, int p2, int p3 )
     BDS_Edge *e2 = find_edge (p2,p3); 
     BDS_Edge *e3 = find_edge (p3,p1); 
     try {
-	BDS_Triangle *t  = new BDS_Triangle ( e1, e2, e3 ,find_point(p1));    
+	BDS_Triangle *t  = new BDS_Triangle ( e1, e2, e3 );    
 	triangles.push_back ( t );
         return t;
     }
@@ -260,6 +260,8 @@ BDS_Vector BDS_Triangle :: N () const
 
 void BDS_Mesh :: classify ( double angle )
 {
+
+  printf("  classifying \n");
  
     static BDS_GeomEntity EDGE_CLAS (0,1);
     {
@@ -269,6 +271,11 @@ void BDS_Mesh :: classify ( double angle )
 	{
 	    BDS_Edge &e = *((BDS_Edge *) *it);
 	    if ( e.numfaces() == 1) e.g = &EDGE_CLAS;
+	    else if (e.numfaces() == 2 && 
+		     e.faces[0]->g != e.faces[1]->g )
+	      {
+		e.g = &EDGE_CLAS;
+	      }
 	    else if (e.numfaces() == 2)
 	    {
 		BDS_Vector N0 = e.faces[0]->N();
@@ -289,27 +296,39 @@ void BDS_Mesh :: classify ( double angle )
 	    ++it;
 	}
     }
+
     {
-	int tag = 1;
-	while (1)
+      std::list<BDS_Triangle*>::iterator it  = triangles.begin();
+      std::list<BDS_Triangle*>::iterator ite = triangles.end();
+      while (it!=ite)
 	{
-	    std::list<BDS_Triangle*>::iterator it  = triangles.begin();
-	    std::list<BDS_Triangle*>::iterator ite = triangles.end();
-	    BDS_Triangle *start = 0;
-	    while (it!=ite)
+	  (*it)->g = 0;
+	  ++it;
+	}
+      geom.clear();
+    }
+
+    {
+      int tag = 1;
+      while (1)
+	{
+	  std::list<BDS_Triangle*>::iterator it  = triangles.begin();
+	  std::list<BDS_Triangle*>::iterator ite = triangles.end();
+	  BDS_Triangle *start = 0;
+	  while (it!=ite)
 	    {
-		if (!(*it)->deleted && !(*it)->g)
+	      if (!(*it)->deleted && !(*it)->g)
 		{
-		    start = (BDS_Triangle*) (*it);
+		  start = (BDS_Triangle*) (*it);
 		}
-		if (start)break;
-		++it;
+	      if (start)break;
+	      ++it;
 	    }
-	    if (!start)break;	  
-	    add_geom (tag, 2);
-	    BDS_GeomEntity *g = get_geom (tag,2);
-	    recur_tag ( start , g );
-	    tag++;
+	  if (!start)break;	  
+	  add_geom (tag, 2);
+	  BDS_GeomEntity *g = get_geom (tag,2);
+	  recur_tag ( start , g );
+	  tag++;
 	}
     }
 //    return;
@@ -368,6 +387,7 @@ void BDS_Mesh :: classify ( double angle )
 	    ++it;
 	}
     }
+  printf("  end classifying \n");
 }
 double PointLessThanLexicographic::t = 0;
 
@@ -648,6 +668,89 @@ bool BDS_Mesh :: read_stl ( const char *filename , const double tolerance)
     fclose (f);    
 }
 
+// INRIA FORMAT
+bool BDS_Mesh :: read_mesh ( const char *filename )
+{
+  FILE *f = fopen ( filename, "r");
+  if (!f)return false;
+  char buffer [256], name[256];
+  
+  fgets (buffer,255,f);
+  
+  int format;
+  
+  sscanf (buffer,"%s %d",name,&format);
+  // ASCII MESH  
+  if (format == 1)
+    {      
+
+      printf("format = 1\n");
+      while (!feof(f))
+	{
+	  fgets (buffer,255,f);
+	  printf("%s\n",buffer);
+	  if (buffer[0] != '#') // skip comments
+	    {
+	      sscanf(buffer,"%s",name);
+
+	      if (!strcmp (name,"Dimension"))
+		fgets (buffer,255,f);
+	      else if (!strcmp (name,"Vertices"))
+		{
+		  Min[0] = Min[1] = Min[2] = 1.e12;
+		  Max[0] = Max[1] = Max[2] = -1.e12;
+		  int nbv,cl;
+		  double x,y,z;
+		  fgets (buffer,255,f);
+		  sscanf (buffer,"%d",&nbv);
+		  printf("%d Vertices\n",nbv);
+		  for (int i=0;i<nbv;i++)
+		    {
+		      fgets (buffer,255,f);
+		      sscanf (buffer,"%lf %lf %lf %d",&x,&y,&z,&cl);
+		      Min[0] = (Min[0] < x)?Min[0]:x;
+		      Min[1] = (Min[1] < y)?Min[1]:y;
+		      Min[2] = (Min[2] < z)?Min[2]:z;
+		      Max[0] = (Max[0] > x)?Max[0]:x;
+		      Max[1] = (Max[1] > y)?Max[1]:y;
+		      Max[2] = (Max[2] > z)?Max[2]:z;
+		      add_point (i+1 , x,y,z );
+		    }
+		  MAXPOINTNUMBER = nbv+1;
+		}
+	      else if (!strcmp (name,"Triangles"))
+		{
+
+		  int nbt,cl,n1,n2,n3;
+		  fgets (buffer,255,f);
+		  sscanf (buffer,"%d",&nbt);
+		  printf("%d Triangles\n",nbt);
+		  for (int i=0;i<nbt;i++)
+		    {
+		      fgets (buffer,255,f);
+		      sscanf (buffer,"%d %d %d %d",&n1,&n2,&n3,&cl);
+		      BDS_Triangle *t = add_triangle(n1,n2,n3);
+		      t->g = get_geom  (cl,2);
+		      if (!t->g)
+			{
+			  add_geom (cl,2);
+			  t->g = get_geom  (cl,2);
+			}
+		    }
+		}
+	    }
+	}
+      
+      LC = sqrt ((Min[0]-Max[0])*(Min[0]-Max[0])+
+		 (Min[1]-Max[1])*(Min[1]-Max[1])+
+		 (Min[2]-Max[2])*(Min[2]-Max[2]));
+    }
+  else
+    {
+      throw;
+    }
+}
+
 void BDS_Mesh :: save_gmsh_format ( const char *filename )
 {
     cleanup();
@@ -826,10 +929,10 @@ bool BDS_Mesh ::split_edge ( BDS_Edge *e, double coord)
     edges.insert ( mid_op2 );
 
 //    printf("split ends 1 %d (%d %d) %d %d \n",p1_op1->numfaces(), p1->iD, op[0]->iD, op1_mid->numfaces(),p1_mid->numfaces());
-    BDS_Triangle*t1 =  new BDS_Triangle ( p1_op1, op1_mid, p1_mid ,op[0] );
-    BDS_Triangle*t2 =  new BDS_Triangle ( op2_p2, mid_op2, mid_p2 ,op[1] );
-    BDS_Triangle*t3 =  new BDS_Triangle ( op1_p2, op1_mid, mid_p2 ,p2);
-    BDS_Triangle*t4 =  new BDS_Triangle ( p1_op2, mid_op2, p1_mid ,p1);
+    BDS_Triangle*t1 =  new BDS_Triangle ( p1_op1, op1_mid, p1_mid );
+    BDS_Triangle*t2 =  new BDS_Triangle ( op2_p2, mid_op2, mid_p2 );
+    BDS_Triangle*t3 =  new BDS_Triangle ( op1_p2, op1_mid, mid_p2 );
+    BDS_Triangle*t4 =  new BDS_Triangle ( p1_op2, mid_op2, p1_mid );
     
     t1->g = g1;
     t2->g = g2;
@@ -889,23 +992,8 @@ bool BDS_Mesh ::swap_edge ( BDS_Edge *e)
     BDS_Edge *op1_op2 = new BDS_Edge ( op[0], op[1] );
     edges.insert ( op1_op2 );
 
-    BDS_Point *first_in_0 = 0;
-    for (int k=0;k<3;k++)
-	if (pts1[k] == p1)
-	{
-	    if (pts1[(k+1)%3] == op[0])first_in_0 = p1;
-	    else first_in_0 = op[0];
-	}
-    BDS_Point *first_in_1 = 0;
-    for (int k=0;k<3;k++)
-	if (pts2[k] == p2)
-	{
-	    if (pts2[(k+1)%3] == op[1])first_in_1 = p2;
-	    else first_in_1 = op[1];
-	}
-
-    BDS_Triangle*t1 =  new BDS_Triangle ( p1_op1, p1_op2, op1_op2 , first_in_0 );
-    BDS_Triangle*t2 =  new BDS_Triangle ( op2_p2, op1_op2, op1_p2 , first_in_1 );
+    BDS_Triangle*t1 =  new BDS_Triangle ( p1_op1, p1_op2, op1_op2  );
+    BDS_Triangle*t2 =  new BDS_Triangle ( op2_p2, op1_op2, op1_p2  );
     
     t1->g = g1;
     t2->g = g2;
diff --git a/Mesh/BDS.h b/Mesh/BDS.h
index e025e51172..4ef115473a 100644
--- a/Mesh/BDS.h
+++ b/Mesh/BDS.h
@@ -30,6 +30,7 @@ public:
 class BDS_Edge;
 class BDS_Triangle;
 class BDS_Mesh;
+void print_face (BDS_Triangle *t);
 
 class BDS_Vector
 {
@@ -113,12 +114,24 @@ public:
 	    if (faces[0]) return 1;
 	    return 0;
 	}
+    inline BDS_Point * commonvertex ( const BDS_Edge *other ) const
+      {
+	if (p1 == other->p1 || p1 == other->p2) return p1;
+	if (p2 == other->p1 || p2 == other->p2) return p2;
+	return 0;
+      }
+
     inline void addface ( BDS_Triangle *f)
 	{
 	    if (faces[1])
 	    {
-		printf("Non Manifold model not done yet\n");
-		throw 1;
+	      printf("Non Manifold model not done yet\n");
+	      print_face (f);
+	      print_face (faces[0]);
+	      print_face (faces[1]);
+	      
+
+	      throw 1;
 	    }
 	    if(faces [0])faces[1] = f;
 	    else faces[0] = f;
@@ -130,7 +143,7 @@ public:
 	    if (*other.p2 < *p2) return true;
 	    return false;
 	}
-    inline BDS_Triangle * otherFace ( BDS_Triangle *f)
+    inline BDS_Triangle * otherFace ( const BDS_Triangle *f) const
       {
 	if (f == faces[0]) return faces[1];
 	if (f == faces[1]) return faces[0];
@@ -175,34 +188,18 @@ class BDS_Triangle
 {
 public:
     bool deleted;
-    int ori_first_edge;
     BDS_Edge *e1,*e2,*e3;
     BDS_Vector N() const ;
     BDS_GeomEntity *g;
     inline void getNodes (BDS_Point *n[3]) const
 	{
-	    if (ori_first_edge == 1)
-	    {
-		n[0] = e1->p1;
-		n[1] = e1->p2;
-	    }
-	    else
-	    {
-		n[0] = e1->p2;
-		n[1] = e1->p1;
-	    }
-	    if (e2->p1 != n[0] && e2->p1 != n[1])n[2] = e2->p1;
-	    else n[2] = e2->p2;
+	  n[0] = e1->commonvertex (e3);
+	  n[1] = e1->commonvertex (e2);
+	  n[2] = e2->commonvertex (e3);
 	}
-    BDS_Triangle ( BDS_Edge *A, BDS_Edge *B, BDS_Edge *C, BDS_Point *first_vertex)
+    BDS_Triangle ( BDS_Edge *A, BDS_Edge *B, BDS_Edge *C)
 	: deleted (false) , e1(A),e2(B),e3(C),g(0)
 	{	
-	    if (first_vertex == A->p1) 
-		ori_first_edge = 1;
-	    else  if (first_vertex == A->p2) 
-		ori_first_edge = -1;
-	    else
-		throw;
 	    e1->addface(this);
 	    e2->addface(this);
 	    e3->addface(this);
@@ -278,8 +275,10 @@ class BDS_Mesh
     int adapt_mesh(double);
     void cleanup();
     // io's 
+    // STL
     bool read_stl  ( const char *filename, const double tolerance);
-    bool read_tri  ( const char *filename);
+    // INRIA MESH
+    bool read_mesh  ( const char *filename);
     bool read_vrml ( const char *filename);
     void save_gmsh_format (const char *filename);
 };
diff --git a/Parser/OpenFile.cpp b/Parser/OpenFile.cpp
index 59d7a6cb23..c7d1083e09 100644
--- a/Parser/OpenFile.cpp
+++ b/Parser/OpenFile.cpp
@@ -1,4 +1,4 @@
-// $Id: OpenFile.cpp,v 1.75 2005-04-19 16:03:15 remacle Exp $
+// $Id: OpenFile.cpp,v 1.76 2005-04-21 09:26:11 remacle Exp $
 //
 // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle
 //
@@ -278,17 +278,24 @@ int MergeProblem(char *name, int warn_if_missing)
 #endif
     status = 0;
   }
-  else if(!strcmp(ext, ".stl")|| !strcmp(ext, ".STL")) 
+  else if(!strcmp(ext, ".stl")|| !strcmp(ext, ".STL")|| !strcmp(ext, ".mesh")) 
   {
-      // STEREO LITOGRAPHY (STL) FILE
-      if (THEM->bds)delete THEM->bds;
-      THEM->bds = new BDS_Mesh;
-      THEM->bds->read_stl ( name , 1.e-6 );
-      THEM->bds->save_gmsh_format ( "1.msh" );
-      THEM->bds->classify ( M_PI / 6 );
-      THEM->bds->save_gmsh_format ( "2.msh" );
-      BDS_To_Mesh (THEM);
-      SetBoundingBox();
+    if (THEM->bds)delete THEM->bds;
+    THEM->bds = new BDS_Mesh;
+    if(!strcmp(ext, ".mesh"))
+    {
+      THEM->bds->read_mesh ( name );
+    }
+    else       
+      {
+	// STEREO LITOGRAPHY (STL) FILE
+	THEM->bds->read_stl ( name , 1.e-6 );
+      }
+    THEM->bds->save_gmsh_format ( "1.msh" );
+    THEM->bds->classify ( M_PI / 6 );
+    THEM->bds->save_gmsh_format ( "2.msh" );
+    BDS_To_Mesh (THEM);
+    SetBoundingBox();
   }
   else {
     fpos_t position;
-- 
GitLab