diff --git a/Mesh/BDS.cpp b/Mesh/BDS.cpp index 38ff6e8295f9f5e4a62a832bcd63394a1a4c4416..310b1b7d48248a6b64efc66afde28c876e819439 100644 --- a/Mesh/BDS.cpp +++ b/Mesh/BDS.cpp @@ -1,4 +1,4 @@ -// $Id: BDS.cpp,v 1.56 2006-08-19 08:26:47 remacle Exp $ +// $Id: BDS.cpp,v 1.57 2006-08-19 20:51:44 geuzaine Exp $ // // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle // @@ -1376,316 +1376,6 @@ void BDS_Mesh::classify(double angle, int NB_T) double PointLessThanLexicographic::t = 0; double BDS_Vector::t = 0; -bool BDS_Mesh::read_stl(const char *filename, const double tolerance) -{ - // add 'b' for pure Windows programs, since some of these files - // contain binary data - FILE *f = fopen(filename, "rb"); - if(!f) - return false; - char buffer[256], name[256]; - - PointLessThanLexicographic::t = tolerance; - - fgets(buffer, 255, f); - - std::set < BDS_Point *, PointLessThanLexicographic > pts; - - sscanf(buffer, "%s", name); - // ASCII STL - if(!strcmp(name, "solid")) { - rewind(f); - fgets(buffer, 255, f); - - Min[0] = Min[1] = Min[2] = 1.e12; - Max[0] = Max[1] = Max[2] = -1.e12; - - double XCG = 0; - double YCG = 0; - double ZCG = 0; - - int Nf = 0; - while(!feof(f)) { - char s1[256], s2[256]; - float x, y, z; - fgets(buffer, 255, f); - sscanf(buffer, "%s", s1); - if(!strcmp(s1, "endsolid")) - break; - sscanf(buffer, "%s %s %f %f %f", s1, s2, &x, &y, &z); - fgets(buffer, 255, f); - fgets(buffer, 255, f); // 1st point - sscanf(buffer, "%s %f %f %f", s2, &x, &y, &z); - BDS_Point P1(0, x, y, z); - fgets(buffer, 255, f); // 2nd point - sscanf(buffer, "%s %f %f %f", s2, &x, &y, &z); - BDS_Point P2(0, x, y, z); - fgets(buffer, 255, f); // 3rd point - sscanf(buffer, "%s %f %f %f", s2, &x, &y, &z); - BDS_Point P3(0, x, y, z); - fgets(buffer, 255, f); // end loop - fgets(buffer, 255, f); // end facet - - Nf++; - - if(P1.X < Min[0]) - Min[0] = P1.X; - if(P2.X < Min[0]) - Min[0] = P2.X; - if(P3.X < Min[0]) - Min[0] = P3.X; - - if(P1.Y < Min[1]) - Min[1] = P1.Y; - if(P2.Y < Min[1]) - Min[1] = P2.Y; - if(P3.Y < Min[1]) - Min[1] = P3.Y; - - if(P1.Z < Min[2]) - Min[2] = P1.Z; - if(P2.Z < Min[2]) - Min[2] = P2.Z; - if(P3.Z < Min[2]) - Min[2] = P3.Z; - - if(P1.X > Max[0]) - Max[0] = P1.X; - if(P2.X > Max[0]) - Max[0] = P2.X; - if(P3.X > Max[0]) - Max[0] = P3.X; - - if(P1.Y > Max[1]) - Max[1] = P1.Y; - if(P2.Y > Max[1]) - Max[1] = P2.Y; - if(P3.Y > Max[1]) - Max[1] = P3.Y; - - if(P1.Z > Max[2]) - Max[2] = P1.Z; - if(P2.Z > Max[2]) - Max[2] = P2.Z; - if(P3.Z > Max[2]) - Max[2] = P3.Z; - - XCG += (P1.X + P2.X + P3.X); - YCG += (P1.Y + P2.Y + P3.Y); - ZCG += (P1.Z + P2.Z + P3.Z); - } - - XCG /= (3 * Nf); - YCG /= (3 * Nf); - ZCG /= (3 * Nf); - - Min[0] -= XCG; - Min[1] -= YCG; - Min[2] -= ZCG; - Max[0] -= XCG; - Max[1] -= YCG; - Max[2] -= ZCG; - - 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])); - - // printf("LC = %g\n",LC); - - PointLessThanLexicographic::t = LC * tolerance; - - rewind(f); - fgets(buffer, 255, f); - while(!feof(f)) { - char s1[256], s2[256]; - float x, y, z; - fgets(buffer, 255, f); - sscanf(buffer, "%s", s1); - if(!strcmp(s1, "endsolid")) - break; - sscanf(buffer, "%s %s %f %f %f", s1, s2, &x, &y, &z); - fgets(buffer, 255, f); - fgets(buffer, 255, f); // 1st point - sscanf(buffer, "%s %f %f %f", s2, &x, &y, &z); - BDS_Point P1(0, x - XCG, y - YCG, z - ZCG); - fgets(buffer, 255, f); // 2nd point - sscanf(buffer, "%s %f %f %f", s2, &x, &y, &z); - BDS_Point P2(0, x - XCG, y - YCG, z - ZCG); - fgets(buffer, 255, f); // 3rd point - sscanf(buffer, "%s %f %f %f", s2, &x, &y, &z); - BDS_Point P3(0, x - XCG, y - YCG, z - ZCG); - fgets(buffer, 255, f); // end loop - fgets(buffer, 255, f); // end facet - BDS_Point *p1 = 0; - BDS_Point *p2 = 0; - BDS_Point *p3 = 0; - std::set < BDS_Point *, PointLessThanLexicographic >::iterator it1 = - pts.find(&P1); - if(it1 != pts.end()) { - p1 = *it1; - } - else { - MAXPOINTNUMBER++; - p1 = add_point(MAXPOINTNUMBER, P1.X, P1.Y, P1.Z); - pts.insert(p1); - } - std::set < BDS_Point *, PointLessThanLexicographic >::iterator it2 = - pts.find(&P2); - if(it2 != pts.end()) { - p2 = *it2; - } - else { - MAXPOINTNUMBER++; - p2 = add_point(MAXPOINTNUMBER, P2.X, P2.Y, P2.Z); - pts.insert(p2); - } - std::set < BDS_Point *, PointLessThanLexicographic >::iterator it3 = - pts.find(&P3); - if(it3 != pts.end()) { - p3 = *it3; - } - else { - MAXPOINTNUMBER++; - p3 = add_point(MAXPOINTNUMBER, P3.X, P3.Y, P3.Z); - pts.insert(p3); - } - add_triangle(p1->iD, p2->iD, p3->iD); - } - } - // BINARY STL - else { - rewind(f); - char DUMMY[80]; - fread(DUMMY, 1, 80, f); - - unsigned long int Nf; - size_t x = fread(&Nf, sizeof(unsigned long int), 1, f); - char *DATA = new char[Nf * 50 * sizeof(char)]; - x = fread(DATA, sizeof(char), Nf * 50, f); - - Msg(INFO, "BINARY STL data read, %ld facets", Nf); - - Min[0] = Min[1] = Min[2] = 1.e12; - Max[0] = Max[1] = Max[2] = -1.e12; - - double XCG = 0; - double YCG = 0; - double ZCG = 0; - - for(unsigned int i = 0; i < Nf; ++i) { - float *X = (float *)&DATA[i * 50 * sizeof(char)]; - - if(X[3] < Min[0]) - Min[0] = X[3]; - if(X[6] < Min[0]) - Min[0] = X[6]; - if(X[9] < Min[0]) - Min[0] = X[9]; - - if(X[4] < Min[1]) - Min[1] = X[4]; - if(X[7] < Min[1]) - Min[1] = X[7]; - if(X[10] < Min[1]) - Min[1] = X[10]; - - if(X[5] < Min[2]) - Min[2] = X[5]; - if(X[8] < Min[2]) - Min[2] = X[8]; - if(X[11] < Min[2]) - Min[2] = X[11]; - - if(X[3] > Max[0]) - Max[0] = X[3]; - if(X[6] > Max[0]) - Max[0] = X[6]; - if(X[9] > Max[0]) - Max[0] = X[9]; - - if(X[4] > Max[1]) - Max[1] = X[4]; - if(X[7] > Max[1]) - Max[1] = X[7]; - if(X[10] > Max[1]) - Max[1] = X[10]; - - if(X[5] > Max[2]) - Max[2] = X[5]; - if(X[8] > Max[2]) - Max[2] = X[8]; - if(X[11] > Max[2]) - Max[2] = X[11]; - XCG += (X[3] + X[6] + X[9]); - YCG += (X[4] + X[7] + X[10]); - ZCG += (X[5] + X[8] + X[11]); - } - - XCG /= (3 * Nf); - YCG /= (3 * Nf); - ZCG /= (3 * Nf); - - Min[0] -= XCG; - Min[1] -= YCG; - Min[2] -= ZCG; - Max[0] -= XCG; - Max[1] -= YCG; - Max[2] -= ZCG; - 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])); - - PointLessThanLexicographic::t = LC * tolerance; - - for(unsigned int i = 0; i < Nf; ++i) { - float *X = (float *)&DATA[i * 50 * sizeof(char)]; - // printf("%g %g %g %g %g %g %g %g %g %g %g %g\n", - // X[0],X[1],X[2],X[3],X[4],X[5],X[6],X[7],X[8],X[9],X[10],X[11]); - BDS_Point P1(0, X[3] - XCG, X[4] - YCG, X[5] - ZCG); - BDS_Point P2(0, X[6] - XCG, X[7] - YCG, X[8] - ZCG); - BDS_Point P3(0, X[9] - XCG, X[10] - YCG, X[11] - ZCG); - BDS_Point *p1 = 0; - BDS_Point *p2 = 0; - BDS_Point *p3 = 0; - std::set < BDS_Point *, PointLessThanLexicographic >::iterator it1 = - pts.find(&P1); - if(it1 != pts.end()) { - p1 = *it1; - } - else { - MAXPOINTNUMBER++; - p1 = add_point(MAXPOINTNUMBER, P1.X, P1.Y, P1.Z); - pts.insert(p1); - } - std::set < BDS_Point *, PointLessThanLexicographic >::iterator it2 = - pts.find(&P2); - if(it2 != pts.end()) { - p2 = *it2; - } - else { - MAXPOINTNUMBER++; - p2 = add_point(MAXPOINTNUMBER, P2.X, P2.Y, P2.Z); - pts.insert(p2); - } - std::set < BDS_Point *, PointLessThanLexicographic >::iterator it3 = - pts.find(&P3); - if(it3 != pts.end()) { - p3 = *it3; - } - else { - MAXPOINTNUMBER++; - p3 = add_point(MAXPOINTNUMBER, P3.X, P3.Y, P3.Z); - pts.insert(p3); - } - add_triangle(p1->iD, p2->iD, p3->iD); - } - delete[]DATA; - } - fclose(f); - // classify(M_PI); - return true; -} - bool BDS_Mesh::import_view(Post_View *view, const double tolerance) { // imports all the tris+quads from a post-processing view @@ -1743,197 +1433,6 @@ bool BDS_Mesh::import_view(Post_View *view, const double tolerance) return true; } -// 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) { - - while(!feof(f)) { - fgets(buffer, 255, f); - 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); - 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); - } - - // NORMALIZE HERE - - 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])); - - std::set < BDS_Point *, PointLessThan >::iterator it = points.begin(); - std::set < BDS_Point *, PointLessThan >::iterator ite = points.end(); - - while(it != ite) - { - (*it)->X /= LC; - (*it)->Y /= LC; - (*it)->Z /= LC; - ++it; - } - Min[0]/=LC;Min[1]/=LC;Min[2]/=LC; - Max[0]/=LC;Max[1]/=LC;Max[2]/=LC; - LC = 1; - - MAXPOINTNUMBER = nbv + 1; - } - else if(!strcmp(name, "Triangles")) { - int nbt, cl, n1, n2, n3; - fgets(buffer, 255, f); - sscanf(buffer, "%d", &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->status = cl; - } - } - else if(!strcmp(name, "Quadrilaterals")) { - int nbt, cl, n1, n2, n3, n4; - fgets(buffer, 255, f); - sscanf(buffer, "%d", &nbt); - for(int i = 0; i < nbt; i++) { - fgets(buffer, 255, f); - sscanf(buffer, "%d %d %d %d %d", &n1, &n2, &n3, &n4, &cl); - BDS_Triangle *t1 = add_triangle(n1, n2, n3); - // pas 12 - // pas 13 - BDS_Triangle *t2 = add_triangle(n1, n3, n4); - t1->status = cl; - t2->status = cl; - } - } - } - } - - - - } - else { - throw; - } - - return true; -} - -void BDS_Mesh::save_gmsh_format(const char *filename) -{ - cleanup(); - - int nbModelVertex = 0; - - FILE *f = fopen(filename, "w"); - { - std::set < BDS_Point *, PointLessThan >::iterator it = points.begin(); - std::set < BDS_Point *, PointLessThan >::iterator ite = points.end(); - - fprintf(f, "$NOD\n"); - fprintf(f, "%d\n", (int)points.size()); - while(it != ite) { - if((*it)->g && (*it)->g->classif_degree == 0) - nbModelVertex++; - fprintf(f, "%d %g %g %g\n", (*it)->iD, (*it)->X, (*it)->Y, (*it)->Z); - ++it; - } - fprintf(f, "$ENDNOD\n"); - } - { - fprintf(f, "$ELM\n"); - - int nbClasEdges = 0; - { - std::list < BDS_Edge * >::iterator it = edges.begin(); - std::list < BDS_Edge * >::iterator ite = edges.end(); - while(it != ite) { - if((*it)->g && (*it)->g->classif_degree == 1) - nbClasEdges++; - ++it; - } - } - - fprintf(f, "%d\n", nbClasEdges + nbModelVertex + triangles.size()); - - int k = 1; - { - std::set < BDS_Point *, PointLessThan >::iterator it = points.begin(); - std::set < BDS_Point *, PointLessThan >::iterator ite = points.end(); - while(it != ite) { - if((*it)->g && (*it)->g->classif_degree == 0) { - fprintf(f, "%d %d %d %d %d %d\n", - k++, 15, (*it)->g->classif_tag, (*it)->g->classif_tag, 1, - (*it)->iD); - } - ++it; - } - } - { - std::list < BDS_Edge * >::iterator it = edges.begin(); - std::list < BDS_Edge * >::iterator ite = edges.end(); - while(it != ite) { - if((*it)->g && (*it)->g->classif_degree == 1) - fprintf(f, "%d %d %d %d %d %d %d\n", - k++, 1, (*it)->g->classif_tag, (*it)->g->classif_tag, 2, - (*it)->p1->iD, (*it)->p2->iD); - ++it; - - } - } - { - std::list < BDS_Triangle * >::iterator it = triangles.begin(); - std::list < BDS_Triangle * >::iterator ite = triangles.end(); - while(it != ite) { - if((*it)->deleted) { - Msg(GERROR, "Error in BDS"); - throw; - } - BDS_Point *nod[3]; - (*it)->getNodes(nod); - if((*it)->g) - fprintf(f, "%d %d %d %d %d %d %d %d\n", - k++, 2, (*it)->g->classif_tag, (*it)->g->classif_tag, 3, - nod[0]->iD, nod[1]->iD, nod[2]->iD); - else - fprintf(f, "%d %d %d %d %d %d %d %d\n", - k++, 2, 1, 1, 3, nod[0]->iD, nod[1]->iD, nod[2]->iD); - ++it; - - } - } - fprintf(f, "$ENDELM\n"); - } - fclose(f); -} - template < class IT > void DESTROOOY(IT beg, IT end) { while(beg != end) { diff --git a/Mesh/BDS.h b/Mesh/BDS.h index 9940da7fad971eabb6777311adf0002fb1fd315e..e331480e049ce3c2d704d044bdd8f9a66badcdd3 100644 --- a/Mesh/BDS.h +++ b/Mesh/BDS.h @@ -257,7 +257,7 @@ public: void getTriangles(std::list<BDS_Triangle *> &t) const; void compute_curvature(); BDS_Point(int id, double x=0, double y=0, double z=0) - : X(x),Y(y),Z(z),u(0),v(0),iD(id),radius_of_curvature(1.e22),g(0) + : radius_of_curvature(1.e22),X(x),Y(y),Z(z),u(0),v(0),iD(id),g(0) { } }; @@ -720,13 +720,7 @@ public: void cleanup(); bool extractVolumes(); // io's - // STL - bool read_stl(const char *filename, const double tolerance); - // INRIA MESH - bool read_mesh(const char *filename); - bool read_vrml(const char *filename); bool import_view(Post_View *view, const double tolerance); - void save_gmsh_format(const char *filename); void applyOptimizationPatterns(); };