// This file is part of libigl, a simple c++ geometry processing library. // // Copyright (C) 2013 Alec Jacobson // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. #include "readMESH.h" template IGL_INLINE bool igl::readMESH( const std::string mesh_file_name, std::vector > & V, std::vector > & T, std::vector > & F) { using namespace std; FILE * mesh_file = fopen(mesh_file_name.c_str(),"r"); if(NULL==mesh_file) { fprintf(stderr,"IOError: %s could not be opened...",mesh_file_name.c_str()); return false; } return igl::readMESH(mesh_file,V,T,F); } template IGL_INLINE bool igl::readMESH( FILE * mesh_file, std::vector > & V, std::vector > & T, std::vector > & F) { using namespace std; #ifndef LINE_MAX # define LINE_MAX 2048 #endif char line[LINE_MAX]; bool still_comments; V.clear(); T.clear(); F.clear(); // eat comments at beginning of file still_comments= true; while(still_comments) { if(fgets(line,LINE_MAX,mesh_file) == NULL) { fprintf(stderr, "Error: couldn't find start of .mesh file"); fclose(mesh_file); return false; } still_comments = (line[0] == '#' || line[0] == '\n'); } char str[LINE_MAX]; sscanf(line," %s",str); // check that first word is MeshVersionFormatted if(0!=strcmp(str,"MeshVersionFormatted")) { fprintf(stderr, "Error: first word should be MeshVersionFormatted not %s\n",str); fclose(mesh_file); return false; } int one = -1; if(2 != sscanf(line,"%s %d",str,&one)) { // 1 appears on next line? fscanf(mesh_file," %d",&one); } if(one != 1) { fprintf(stderr,"Error: second word should be 1 not %d\n",one); fclose(mesh_file); return false; } // eat comments still_comments= true; while(still_comments) { fgets(line,LINE_MAX,mesh_file); still_comments = (line[0] == '#' || line[0] == '\n'); } sscanf(line," %s",str); // check that third word is Dimension if(0!=strcmp(str,"Dimension")) { fprintf(stderr,"Error: third word should be Dimension not %s\n",str); fclose(mesh_file); return false; } int three = -1; if(2 != sscanf(line,"%s %d",str,&three)) { // 1 appears on next line? fscanf(mesh_file," %d",&three); } if(three != 3) { fprintf(stderr,"Error: only Dimension 3 supported not %d\n",three); fclose(mesh_file); return false; } // eat comments still_comments= true; while(still_comments) { fgets(line,LINE_MAX,mesh_file); still_comments = (line[0] == '#' || line[0] == '\n'); } sscanf(line," %s",str); // check that fifth word is Vertices if(0!=strcmp(str,"Vertices")) { fprintf(stderr,"Error: fifth word should be Vertices not %s\n",str); fclose(mesh_file); return false; } //fgets(line,LINE_MAX,mesh_file); int number_of_vertices; if(1 != fscanf(mesh_file," %d",&number_of_vertices) || number_of_vertices > 1000000000) { fprintf(stderr,"Error: expecting number of vertices less than 10^9...\n"); fclose(mesh_file); return false; } // allocate space for vertices V.resize(number_of_vertices,vector(3,0)); int extra; for(int i = 0;i(3)); // triangle indices int tri[3]; for(int i = 0;i(4)); // tet indices int a,b,c,d; for(int i = 0;i #include "list_to_matrix.h" template IGL_INLINE bool igl::readMESH( const std::string mesh_file_name, Eigen::PlainObjectBase& V, Eigen::PlainObjectBase& T, Eigen::PlainObjectBase& F) { using namespace std; FILE * mesh_file = fopen(mesh_file_name.c_str(),"r"); if(NULL==mesh_file) { fprintf(stderr,"IOError: %s could not be opened...",mesh_file_name.c_str()); return false; } return readMESH(mesh_file,V,T,F); } template IGL_INLINE bool igl::readMESH( FILE * mesh_file, Eigen::PlainObjectBase& V, Eigen::PlainObjectBase& T, Eigen::PlainObjectBase& F) { using namespace std; #ifndef LINE_MAX # define LINE_MAX 2048 #endif char line[LINE_MAX]; bool still_comments; // eat comments at beginning of file still_comments= true; while(still_comments) { fgets(line,LINE_MAX,mesh_file); still_comments = (line[0] == '#' || line[0] == '\n'); } char str[LINE_MAX]; sscanf(line," %s",str); // check that first word is MeshVersionFormatted if(0!=strcmp(str,"MeshVersionFormatted")) { fprintf(stderr, "Error: first word should be MeshVersionFormatted not %s\n",str); fclose(mesh_file); return false; } int one = -1; if(2 != sscanf(line,"%s %d",str,&one)) { // 1 appears on next line? fscanf(mesh_file," %d",&one); } if(one != 1) { fprintf(stderr,"Error: second word should be 1 not %d\n",one); fclose(mesh_file); return false; } // eat comments still_comments= true; while(still_comments) { fgets(line,LINE_MAX,mesh_file); still_comments = (line[0] == '#' || line[0] == '\n'); } sscanf(line," %s",str); // check that third word is Dimension if(0!=strcmp(str,"Dimension")) { fprintf(stderr,"Error: third word should be Dimension not %s\n",str); fclose(mesh_file); return false; } int three = -1; if(2 != sscanf(line,"%s %d",str,&three)) { // 1 appears on next line? fscanf(mesh_file," %d",&three); } if(three != 3) { fprintf(stderr,"Error: only Dimension 3 supported not %d\n",three); fclose(mesh_file); return false; } // eat comments still_comments= true; while(still_comments) { fgets(line,LINE_MAX,mesh_file); still_comments = (line[0] == '#' || line[0] == '\n'); } sscanf(line," %s",str); // check that fifth word is Vertices if(0!=strcmp(str,"Vertices")) { fprintf(stderr,"Error: fifth word should be Vertices not %s\n",str); fclose(mesh_file); return false; } //fgets(line,LINE_MAX,mesh_file); int number_of_vertices; if(1 != fscanf(mesh_file," %d",&number_of_vertices) || number_of_vertices > 1000000000) { fprintf(stderr,"Error: expecting number of vertices less than 10^9...\n"); fclose(mesh_file); return false; } // allocate space for vertices V.resize(number_of_vertices,3); int extra; for(int i = 0;i > vV,vT,vF; // bool success = igl::readMESH(mesh_file_name,vV,vT,vF); // if(!success) // { // // readMESH already printed error message to std err // return false; // } // bool V_rect = igl::list_to_matrix(vV,V); // if(!V_rect) // { // // igl::list_to_matrix(vV,V) already printed error message to std err // return false; // } // bool T_rect = igl::list_to_matrix(vT,T); // if(!T_rect) // { // // igl::list_to_matrix(vT,T) already printed error message to std err // return false; // } // bool F_rect = igl::list_to_matrix(vF,F); // if(!F_rect) // { // // igl::list_to_matrix(vF,F) already printed error message to std err // return false; // } // assert(V.cols() == 3); // assert(T.cols() == 4); // assert(F.cols() == 3); // return true; //} #ifdef IGL_STATIC_LIBRARY // Explicit template instantiation // generated by autoexplicit.sh template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(FILE*, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); // generated by autoexplicit.sh template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(FILE*, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); // generated by autoexplicit.sh template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(std::basic_string, std::allocator >, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); // generated by autoexplicit.sh template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(std::basic_string, std::allocator >, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); // generated by autoexplicit.sh template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(std::basic_string, std::allocator >, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); // generated by autoexplicit.sh template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(std::basic_string, std::allocator >, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(std::basic_string, std::allocator >, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); template bool igl::readMESH(std::basic_string, std::allocator >, std::vector >, std::allocator > > >&, std::vector >, std::allocator > > >&, std::vector >, std::allocator > > >&); template bool igl::readMESH, Eigen::Matrix, Eigen::Matrix >(std::basic_string, std::allocator >, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&, Eigen::PlainObjectBase >&); #endif