⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_om.cc

📁 penMesh is a generic and efficient data structure for representing and manipulating polygonal meshes
💻 CC
字号:
// ----------------------------------------------------------------------------// Test: Read an arbitrary mesh add custom properties//       with fundamental types and a custom type//       and store enhanced mesh in result.om and restore it again.//// ----------------------------------------------------------------------------#include <OpenMesh/Core/IO/MeshIO.hh>#include <OpenMesh/Core/Mesh/Types/TriMesh_ArrayKernelT.hh>#include <OpenMesh/Tools/Utils/getopt.h>typedef OpenMesh::TriMesh_ArrayKernelT<> Mesh;// ----------------------------------------------------------------------------// ----------------------------------------------------------------------------void usage_and_exit( int xcode ){  std::cout << "Usage: test_om -i <name>.om" << std::endl;  exit(xcode);}// ----------------------------------------------------------------------------struct my_data{    my_data()     : b_(true), l_(1), d_(3)   { }  bool operator == ( const my_data& _rhs )  {    return b_ == _rhs.b_ && l_ == _rhs.l_ && d_==_rhs.d_;  }  bool   b_;  long   l_;  double d_;};namespace OpenMesh {  namespace IO {    template <> struct binary< my_data >    {      typedef my_data value_type;      static const bool is_streamable = true;      static size_t size_of(void)      { return IO::size_of<bool>()+IO::size_of<long>()+IO::size_of<double>(); }      static size_t size_of( const value_type& _v) { return size_of(); }      static       size_t store( std::ostream& _os, const value_type& _v,		    bool _swap = false)      {	size_t bytes;	bytes  = IO::store( _os, _v.b_, _swap );	bytes += IO::store( _os, _v.l_, _swap );	bytes += IO::store( _os, _v.d_, _swap );	return bytes;      }            static       size_t restore( std::istream& _is, value_type& _v,		      bool _swap = false)      {	size_t bytes;	bytes  = IO::restore( _is, _v.b_, _swap );	bytes += IO::restore( _is, _v.l_, _swap );	bytes += IO::restore( _is, _v.d_, _swap );	return bytes;      }          };  }}// ----------------------------------------------------------------------------std::ostream& operator << ( std::ostream& _os, my_data& _d){  _os << "mydata[" << _d.b_ << ", " << _d.l_ << ", " << _d.d_ << std::endl;  return _os;}// ----------------------------------------------------------------------------int main(int argc, char *argv[]){  int         c;  std::string ifname;  // ---------------------------------------- command line parsing  while ( (c=getopt(argc,argv,"i:h")) != -1 )  {    switch(c)    {      case 'i': ifname = optarg; break;      case 'h': usage_and_exit(0);      default:  usage_and_exit(1);    }  }  // ---------------------------------------- prerequisites  if (ifname.empty())    usage_and_exit(1);  // ----------------------------------------    try  {    Mesh mesh;      std::clog << "+ read file " << ifname << std::endl;    OpenMesh::IO::read_mesh( mesh, ifname );    mesh.request_vertex_normals();    mesh.request_vertex_colors();    mesh.request_vertex_texcoords();    mesh.request_vertex_status();    mesh.request_halfedge_status();    mesh.request_edge_status();    mesh.request_face_normals();    mesh.request_face_colors();    mesh.request_face_status();    std::clog << "+ property info\n";    mesh.property_stats();    std::clog << "+ adding custom properties\n";    OpenMesh::VPropHandleT<float>   vprop_float;    OpenMesh::VPropHandleT<my_data> vprop_data;    OpenMesh::HPropHandleT<float>   hprop_float;    OpenMesh::EPropHandleT<float>   eprop_float;    OpenMesh::EPropHandleT<OpenMesh::Vec3f> eprop_vec3f;    OpenMesh::FPropHandleT<float>   fprop_float;    OpenMesh::FPropHandleT<bool>    fprop_bool;    OpenMesh::FPropHandleT<std::string>  fprop_string;    OpenMesh::MPropHandleT<float>   mprop_float;        mesh.add_property( vprop_float,  "vprop-float" );    mesh.add_property( vprop_data,   "vprop-data" );    mesh.add_property( hprop_float,  "hprop-float" );    mesh.add_property( eprop_float,  "eprop-float" );    mesh.add_property( eprop_vec3f,  "eprop-vec3f" );    mesh.add_property( fprop_float,  "fprop-float" );    mesh.add_property( fprop_bool,   "fprop-bool" );    mesh.add_property( fprop_string, "fprop-string" );    mesh.add_property( mprop_float,  "mprop-float" );    if ( vprop_data.is_valid() )    {      std::cout << "data is streamable: "                 << OpenMesh::IO::binary<my_data>::is_streamable                << std::endl;      Mesh::VertexIter vi;      my_data          d;      d.l_ = mesh.n_vertices();      for (vi = mesh.vertices_begin(); vi != mesh.vertices_end(); ++vi)      {        mesh.property( vprop_data, vi ) = d; --d.l_;      }    }    if ( vprop_float.is_valid())    {      Mesh::VertexIter vi;      float            f = 0.0;      for (vi = mesh.vertices_begin(); vi != mesh.vertices_end(); ++vi)        mesh.property( vprop_float, vi ) = (f+=1.1f);    }    if (fprop_float.is_valid()  ||        fprop_bool.is_valid()   ||         fprop_string.is_valid() )    {      Mesh::FaceIter   fi;      size_t           i = 0;      for (fi = mesh.faces_begin(); fi != mesh.faces_end(); ++fi)      {        if ( fprop_string.is_valid() )        {          char C[6];           C[0] = size_t('a')+ (i++ % 10);           C[1] = 'A';           C[2] = 'B';          C[3] = 'C';          C[4] = 'D';          C[5] = '\0';          mesh.property( fprop_string, fi ) = C;        }      }    }    std::clog << "+ make them persistent\n";          mesh.property(vprop_float).set_persistent(true);    mesh.property(vprop_data).set_persistent(true);    mesh.property(hprop_float).set_persistent(true);    mesh.property(eprop_float).set_persistent(true);    mesh.property(eprop_vec3f).set_persistent(true);    mesh.property(fprop_float).set_persistent(true);    mesh.property(fprop_bool).set_persistent(true);    mesh.property(fprop_string).set_persistent(true);    mesh.mproperty(mprop_float).set_persistent(true);    std::clog << "+ property info\n";    mesh.property_stats();    std::clog << "+ write file test.om\n";    OpenMesh::IO::Options opt;    opt += OpenMesh::IO::Options::VertexNormal;    opt += OpenMesh::IO::Options::FaceNormal;        mesh.update_face_normals();    mesh.update_vertex_normals();    if ( !OpenMesh::IO::write_mesh( mesh, "test.om", opt ) )      throw std::runtime_error("Could write file 'test.om'!");  }  catch( std::exception& x )  {    std::cerr << "Error: " << x.what() << std::endl;    return 1;  }  try  {    Mesh mesh;      std::clog << "--------------------------------------\n";    std::clog << "+ read file test.om\n";    OpenMesh::VPropHandleT<float>    vprop_float;    OpenMesh::VPropHandleT<my_data>  vprop_data;    OpenMesh::HPropHandleT<float>    hprop_float;    OpenMesh::EPropHandleT<float>    eprop_float;    OpenMesh::EPropHandleT<OpenMesh::Vec3f> eprop_vec3f;    OpenMesh::FPropHandleT<float>    fprop_float;    OpenMesh::FPropHandleT<bool>     fprop_bool;    OpenMesh::FPropHandleT<std::string>  fprop_string;    OpenMesh::MPropHandleT<float>    mprop_float;        mesh.add_property( vprop_float,  "vprop-float" );    mesh.add_property( vprop_data,   "vprop-data" );    mesh.add_property( hprop_float,  "hprop-float" );    mesh.add_property( eprop_float,  "eprop-float" );    mesh.add_property( eprop_vec3f,  "eprop-vec3f" );    mesh.add_property( fprop_float,  "fprop-float" );    mesh.add_property( fprop_bool,   "fprop-bool" );    mesh.add_property( fprop_string, "fprop-string" );    mesh.add_property( mprop_float,  "mprop-float" );    if ( !OpenMesh::IO::read_mesh( mesh, "test.om" ) )    {      std::clog << "Cannot load mesh!\n";      return 1;    }    if ( vprop_float.is_valid() )    {      Mesh::VertexIter vi;      for (vi = mesh.vertices_begin(); vi != mesh.vertices_end(); ++vi)      {	std::clog << "f = " << mesh.property( vprop_float, vi ) << std::endl;	break;      }    }    if ( vprop_data.is_valid() )    {      Mesh::VertexIter vi = mesh.vertices_begin();      std::clog << " data = " << mesh.property( vprop_data, vi ) << std::endl;    }  }  catch( std::exception& x )  {    std::cerr << "Error: " << x.what() << std::endl;    return 1;  }  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -