MC_io_off.cpp

Go to the documentation of this file.
00001 
00002 #include <MC_v3d_vector.hpp>
00003 #include <MC_connectivity_index.hpp>
00004 #include <MC_string_helper.hpp>
00005 #include <MC_mesh_index_vector.hpp>
00006 
00007 #include <MC_io_off.hpp>
00008 
00009 namespace mesh_conv
00010 {
00011 
00012     std::pair <MC_v3d_vector,MC_connectivity_index> MC_io_off::read_off(std::istream& stream)
00013     {
00014         if(stream.good()==false)
00015         {std::cout<<"Error in MC_io_off::read_off(istream), file cannot be read"<<std::endl;exit(-1);}
00016 
00017         const int SIZE_BUFFER=2048;
00018         std::vector <char> c_buffer(SIZE_BUFFER);
00019         std::string buffer;
00020 
00021         int N_vertex=0,N_polygon=0,N_edge=0;
00022 
00023         // look for *OFF*
00024         bool is_loop=true;
00025         while(stream.good() && is_loop==true)
00026         {
00027             std::getline(stream,buffer);
00028             if(buffer.length()>0
00029                && buffer[0]!='#'
00030                && buffer.find("OFF")!=std::string::npos)
00031                 is_loop=false;
00032         }
00033         if(stream.good()==false && is_loop==true)
00034         {std::cout<<"ERROR in MC_io_off::read_off(istream), cannot find OFF header"<<std::endl;exit(-1);}
00035 
00036         // look for N_vertex N_polygon N_edges
00037         is_loop=true;
00038         while(stream.good() && is_loop==true)
00039         {
00040             std::getline(stream,buffer);
00041 
00042             //std::cout<<buffer<<std::endl;
00043             if(buffer.length()>0 && buffer[0]!='#')
00044             {
00045                 std::vector <std::string> token=MC_string_tokenizer::tokenize(buffer);
00046                 if(token.size()>=3)
00047                 {
00048                     bool vertex_converted=false;
00049                     bool polygon_converted=false;
00050                     bool edge_converted=false;
00051                     N_vertex  = MC_string_converter::value_of<int>(token[0],&vertex_converted);
00052                     N_polygon = MC_string_converter::value_of<int>(token[1],&polygon_converted);
00053                     N_edge    = MC_string_converter::value_of<int>(token[2],&edge_converted);
00054 
00055                     if(vertex_converted==true && polygon_converted==true && edge_converted==true)
00056                         is_loop=false;
00057                 }
00058             }
00059         }
00060         if(stream.good()==false && is_loop==true)
00061         {std::cout<<"ERROR in MC_io_off::read_off(istream), cannot read N_vertex/N_polygon/N_edge <<"<<buffer<<std::endl;exit(-1);}
00062 
00063 
00064         if(N_vertex<=0 || N_polygon<=0)
00065         {std::cout<<"Something wrong in MC_io_off::read_off(istream), N_vertex="<<N_vertex<<", N_polygon="<<N_polygon<<std::endl;exit(-1);}
00066 
00067 
00068         MC_v3d_vector point_set;
00069 
00070         //now read N_vertex positions
00071         for(int k_vertex=0;k_vertex<N_vertex;++k_vertex)
00072         {
00073             if(stream.good()==false)
00074             {std::cout<<"Error in MC_io_off::read_off(istream) at vertex"<<k_vertex<<" EOF found"<<std::endl;exit(-1);}
00075 
00076             std::getline(stream,buffer);
00077             if(buffer.size()>0 && buffer[0]!='#')
00078             {
00079                 std::vector<std::string> v_token=MC_string_converter::delete_empty(MC_string_tokenizer::tokenize(buffer));
00080                 if(v_token.size()<3)
00081                 {std::cout<<"Error in MC_io_off::read_off(istream), something wrong at vertex "<<k_vertex<<", size of token="<<v_token.size()<<", "<<buffer<<std::endl;exit(-1);}
00082 
00083                 bool converted_x0=false,converted_x1=false,converted_x2=false;
00084                 double x0=MC_string_converter::value_of<double>(v_token[0],&converted_x0);
00085                 double x1=MC_string_converter::value_of<double>(v_token[1],&converted_x1);
00086                 double x2=MC_string_converter::value_of<double>(v_token[2],&converted_x2);
00087 
00088                 if(converted_x0==false || converted_x1==false || converted_x2==false)
00089                 {std::cout<<"Something wrong in MC_io_off::read_off(istream), cannot convert at vertex "<<k_vertex<<","<<buffer<<std::endl;exit(-1);}
00090 
00091                 point_set.add(MC_v3d(x0,x1,x2));
00092             }
00093             else
00094                 --k_vertex;
00095         }
00096 
00097         
00098         MC_connectivity_index connectivity;
00099         //now read N_polygons
00100         for(int k_polygon=0;k_polygon<N_polygon;++k_polygon)
00101         {
00102             std::getline(stream,buffer);
00103             if(buffer.size()>0 && buffer[0]!='#')
00104             {
00105                 std::vector <std::string> v_token=MC_string_tokenizer::tokenize(buffer);
00106                 if(v_token.size()>=4)
00107                 {
00108                     // get the size
00109                     bool poly_size_convert=false;
00110                     int poly_size=MC_string_converter::value_of<int>(v_token[0],&poly_size_convert);
00111                     if(poly_size_convert==false)
00112                     {std::cout<<"Something wrong in MC_io_off::read_off(istream), cannot load polygon size at polygon "<<k_polygon<<" polygon of size<3 "<<buffer<<std::endl;exit(-1);}
00113 
00114                     if(poly_size<3)
00115                     {std::cout<<"Something wrong in MC_io_off::read_off(istream), cannot load polygon size at polygon "<<k_polygon<<" polygon size="<<poly_size<<"<3 "<<buffer<<std::endl;exit(-1);}
00116 
00117                     MC_int_vector temp_poly;
00118                     if(int(v_token.size()-1)<poly_size)
00119                     {std::cout<<"Error in MC_io_off::read_off(istream), incompatible token and poly size at k_poly="<<k_polygon<<", "<<buffer<<std::endl;exit(-1);}
00120 
00121                     int counter=0;
00122                     for(int k_current_polygon=0;k_current_polygon<poly_size;++k_current_polygon)
00123                     {
00124                         ++counter;
00125 
00126                         bool index_converted=false;
00127                         if(v_token[counter]!="")
00128                         {
00129                             temp_poly.add(MC_string_converter::value_of<int>(v_token[counter],&index_converted));
00130                             if(index_converted==false)
00131                             {std::cout<<"Something wrong in MC_io_off::read_off(istream), cannot load polygon at polygon "<<k_polygon<<" polygon for index "<<k_current_polygon<<" ,"<<buffer<<std::endl;exit(-1);}
00132                         }
00133                         else
00134                             k_current_polygon--;
00135                     }
00136                     connectivity.add(temp_poly);
00137                 }
00138                 else
00139                 {std::cout<<"Something wrong in MC_io_off::read_off(istream), cannot load at polygon "<<k_polygon<<" polygon of size<3 "<<buffer<<std::endl;exit(-1);}
00140 
00141             }
00142             else
00143                 --k_polygon;
00144 
00145         }
00146 
00147         return std::pair <MC_v3d_vector,MC_connectivity_index> (point_set,connectivity);
00148     }
00149 
00150     std::ostream& MC_io_off::write_off(std::ostream& stream,const MC_mesh_index_vector& to_write)
00151     {
00152         stream<<"OFF"<<std::endl;
00153         stream<<to_write.vertex_number()<<" "<<to_write.polygon_number()<<" 0"<<std::endl;
00154         int N_vertex=to_write.vertex_number();
00155         for(int k_vertex=0;k_vertex<N_vertex;++k_vertex)
00156             stream<<to_write.point_set()(k_vertex)(0)<<" "<<to_write.point_set()(k_vertex)(1)<<" "<<to_write.point_set()(k_vertex)(2)<<std::endl;
00157         int N_polygon=to_write.polygon_number();
00158 
00159         for(int k_poly=0;k_poly<N_polygon;++k_poly)
00160         {
00161             MC_int_vector index=to_write.connectivity()(k_poly);
00162             int N_current=index.size();
00163 
00164             stream<<N_current<<" ";
00165             for(int k=0;k<N_current;++k)
00166                 stream<<index[k]<<" ";
00167             stream<<std::endl;
00168         }
00169 
00170         return stream;
00171     }
00172     const MC_mesh_index_vector& MC_io_off::write_off_file(const std::string& string_file,const MC_mesh_index_vector& to_write)
00173     {
00174         std::ofstream ofile(string_file.c_str());
00175         if(ofile.good()!=true)
00176         {std::cout<<"Error in MC_io_off::write_off_file("<<string_file<<",MC_mesh_index_vector), cannot open the file"<<std::endl;exit(-1);}
00177 
00178         MC_io_off::write_off(ofile,to_write);
00179         ofile.close();
00180         return to_write;
00181     }
00182 
00183     std::pair <MC_v3d_vector,MC_connectivity_index> MC_io_off::read_off_file(const std::string& string_file)
00184     {
00185         std::ifstream ifile(string_file.c_str());
00186         if(ifile.good()!=true)
00187         {std::cout<<"Error in MC_io_off::read_off_file("<<string_file<<"), cannot open the file"<<std::endl;exit(-1);}
00188 
00189         std::pair <MC_v3d_vector,MC_connectivity_index> input=MC_io_off::read_off(ifile);
00190         ifile.close();
00191 
00192         return input;
00193     }
00194 
00195 
00196 
00197 
00198 }

Generated on Sun Apr 18 20:24:47 2010 by  doxygen 1.6.1