43 #define FILEMANAGERT_CC
53 #include <OpenVolumeMesh/Geometry/VectorT.hh>
54 #include <OpenVolumeMesh/Mesh/PolyhedralMesh.hh>
56 #include "FileManager.hh"
66 template <
class MeshT>
68 bool _topologyCheck,
bool _computeBottomUpIncidences)
const {
70 std::ifstream iff(_filename.c_str(), std::ios::in);
73 std::cerr <<
"Error: Could not open file " << _filename <<
" for reading!" << std::endl;
78 std::stringstream sstr;
82 typedef typename MeshT::PointT Point;
83 Point v = Point(0.0, 0.0, 0.0);
89 _mesh.enable_bottom_up_incidences(
false);
95 bool header_found =
true;
98 getCleanLine(iff, line);
103 std::transform(s_tmp.begin(), s_tmp.end(), s_tmp.begin(), ::toupper);
106 header_found =
false;
107 std::cerr <<
"The specified file might not be in OpenVolumeMesh format!" << std::endl;
113 std::transform(s_tmp.begin(), s_tmp.end(), s_tmp.begin(), ::toupper);
114 if(s_tmp ==
"BINARY") {
116 std::cerr <<
"Binary files are not supported at the moment!" << std::endl;
127 getCleanLine(iff, line);
133 std::transform(s_tmp.begin(), s_tmp.end(), s_tmp.begin(), ::toupper);
134 if(s_tmp !=
"VERTICES") {
136 std::cerr <<
"No vertex section defined!" << std::endl;
141 getCleanLine(iff, line);
147 for(uint64_t i = 0u; i < c; ++i) {
149 getCleanLine(iff, line);
162 getCleanLine(iff, line);
166 std::transform(s_tmp.begin(), s_tmp.end(), s_tmp.begin(), ::toupper);
167 if(s_tmp !=
"EDGES") {
169 std::cerr <<
"No edge section defined!" << std::endl;
174 getCleanLine(iff, line);
180 for(uint64_t i = 0u; i < c; ++i) {
184 getCleanLine(iff, line);
196 getCleanLine(iff, line);
200 std::transform(s_tmp.begin(), s_tmp.end(), s_tmp.begin(), ::toupper);
201 if(s_tmp !=
"FACES") {
203 std::cerr <<
"No face section defined!" << std::endl;
208 getCleanLine(iff, line);
214 for(uint64_t i = 0u; i < c; ++i) {
216 getCleanLine(iff, line);
220 std::vector<HalfEdgeHandle> hes;
227 for(
unsigned int e = 0; e < val; ++e) {
234 _mesh.add_face(hes, _topologyCheck);
241 getCleanLine(iff, line);
245 std::transform(s_tmp.begin(), s_tmp.end(), s_tmp.begin(), ::toupper);
246 if(s_tmp !=
"POLYHEDRA") {
248 std::cerr <<
"No polyhedra section defined!" << std::endl;
253 getCleanLine(iff, line);
259 for(uint64_t i = 0u; i < c; ++i) {
261 getCleanLine(iff, line);
265 std::vector<HalfFaceHandle> hfs;
272 for(
unsigned int f = 0; f < val; ++f) {
279 _mesh.add_cell(hfs, _topologyCheck);
288 readProperty(iff, _mesh);
293 if(_computeBottomUpIncidences) {
295 _mesh.enable_bottom_up_incidences(
true);
298 std::cerr <<
"######## openvolumemesh info #########" << std::endl;
299 std::cerr <<
"#vertices: " << _mesh.n_vertices() << std::endl;
300 std::cerr <<
"#edges: " << _mesh.n_edges() << std::endl;
301 std::cerr <<
"#faces: " << _mesh.n_faces() << std::endl;
302 std::cerr <<
"#cells: " << _mesh.n_cells() << std::endl;
303 std::cerr <<
"######################################" << std::endl;
310 template <
class MeshT>
311 void FileManager::readProperty(std::istream& _iff, MeshT& _mesh)
const {
313 std::string line, entity_t, prop_t, name;
314 std::stringstream sstr;
316 getCleanLine(_iff, line);
318 if(line.empty())
return;
323 std::transform(entity_t.begin(), entity_t.end(), entity_t.begin(), ::tolower);
325 std::transform(prop_t.begin(), prop_t.end(), prop_t.begin(), ::tolower);
327 extractQuotedText(name);
329 if(prop_t == typeName<int>()) generateGenericProperty<int, MeshT>(entity_t, name, _iff, _mesh);
330 else if(prop_t == typeName<unsigned int>()) generateGenericProperty<unsigned int, MeshT>(entity_t, name, _iff, _mesh);
331 else if(prop_t == typeName<short>()) generateGenericProperty<short, MeshT>(entity_t, name, _iff, _mesh);
332 else if(prop_t == typeName<long>()) generateGenericProperty<long, MeshT>(entity_t, name, _iff, _mesh);
333 else if(prop_t == typeName<unsigned long>()) generateGenericProperty<unsigned long, MeshT>(entity_t, name, _iff, _mesh);
334 else if(prop_t == typeName<char>()) generateGenericProperty<char, MeshT>(entity_t, name, _iff, _mesh);
335 else if(prop_t == typeName<unsigned char>()) generateGenericProperty<unsigned char, MeshT>(entity_t, name, _iff, _mesh);
336 else if(prop_t == typeName<bool>()) generateGenericProperty<bool, MeshT>(entity_t, name, _iff, _mesh);
337 else if(prop_t == typeName<float>()) generateGenericProperty<float, MeshT>(entity_t, name, _iff, _mesh);
338 else if(prop_t == typeName<double>()) generateGenericProperty<double, MeshT>(entity_t, name, _iff, _mesh);
339 else if(prop_t == typeName<std::string>()) generateGenericProperty<std::string, MeshT>(entity_t, name, _iff, _mesh);
341 else if(prop_t == typeName<Vec2f>()) generateGenericProperty<Vec2f, MeshT>(entity_t, name, _iff, _mesh);
342 else if(prop_t == typeName<Vec2d>()) generateGenericProperty<Vec2d, MeshT>(entity_t, name, _iff, _mesh);
343 else if(prop_t == typeName<Vec2i>()) generateGenericProperty<Vec2i, MeshT>(entity_t, name, _iff, _mesh);
344 else if(prop_t == typeName<Vec2ui>()) generateGenericProperty<Vec2ui, MeshT>(entity_t, name, _iff, _mesh);
346 else if(prop_t == typeName<Vec3f>()) generateGenericProperty<Vec3f, MeshT>(entity_t, name, _iff, _mesh);
347 else if(prop_t == typeName<Vec3d>()) generateGenericProperty<Vec3d, MeshT>(entity_t, name, _iff, _mesh);
348 else if(prop_t == typeName<Vec3i>()) generateGenericProperty<Vec3i, MeshT>(entity_t, name, _iff, _mesh);
349 else if(prop_t == typeName<Vec3ui>()) generateGenericProperty<Vec3ui, MeshT>(entity_t, name, _iff, _mesh);
351 else if(prop_t == typeName<Vec4f>()) generateGenericProperty<Vec4f, MeshT>(entity_t, name, _iff, _mesh);
352 else if(prop_t == typeName<Vec4d>()) generateGenericProperty<Vec4d, MeshT>(entity_t, name, _iff, _mesh);
353 else if(prop_t == typeName<Vec4i>()) generateGenericProperty<Vec4i, MeshT>(entity_t, name, _iff, _mesh);
354 else if(prop_t == typeName<Vec4ui>()) generateGenericProperty<Vec4ui, MeshT>(entity_t, name, _iff, _mesh);
362 template <
class PropT,
class MeshT>
363 void FileManager::generateGenericProperty(
const std::string& _entity_t,
const std::string& _name,
364 std::istream& _iff, MeshT& _mesh)
const {
366 if(_entity_t ==
"vprop") {
368 prop.deserialize(_iff);
369 _mesh.set_persistent(prop);
370 }
else if(_entity_t ==
"eprop") {
371 EdgePropertyT<PropT> prop = _mesh.template request_edge_property<PropT>(_name);
372 prop.deserialize(_iff);
373 _mesh.set_persistent(prop);
374 }
else if(_entity_t ==
"heprop") {
375 HalfEdgePropertyT<PropT> prop = _mesh.template request_halfedge_property<PropT>(_name);
376 prop.deserialize(_iff);
377 _mesh.set_persistent(prop);
378 }
else if(_entity_t ==
"fprop") {
379 FacePropertyT<PropT> prop = _mesh.template request_face_property<PropT>(_name);
380 prop.deserialize(_iff);
381 _mesh.set_persistent(prop);
382 }
else if(_entity_t ==
"hfprop") {
383 HalfFacePropertyT<PropT> prop = _mesh.template request_halfface_property<PropT>(_name);
384 prop.deserialize(_iff);
385 _mesh.set_persistent(prop);
386 }
else if(_entity_t ==
"cprop") {
387 CellPropertyT<PropT> prop = _mesh.template request_cell_property<PropT>(_name);
388 prop.deserialize(_iff);
389 _mesh.set_persistent(prop);
390 }
else if(_entity_t ==
"mprop") {
391 MeshPropertyT<PropT> prop = _mesh.template request_mesh_property<PropT>(_name);
392 prop.deserialize(_iff);
393 _mesh.set_persistent(prop);
399 template<
class MeshT>
402 std::ofstream off(_filename.c_str(), std::ios::out);
405 std::cerr <<
"Error: Could not open file " << _filename <<
" for writing!" << std::endl;
411 off <<
"OVM ASCII" << std::endl;
413 uint64_t n_vertices(_mesh.n_vertices());
414 off <<
"Vertices" << std::endl;
415 off << n_vertices << std::endl;
417 typedef typename MeshT::PointT Point;
420 for(
VertexIter v_it = _mesh.v_iter(); v_it; ++v_it) {
422 Point v = _mesh.vertex(*v_it);
423 off << v[0] <<
" " << v[1] <<
" " << v[2] << std::endl;
426 uint64_t n_edges(_mesh.n_edges());
427 off <<
"Edges" << std::endl;
428 off << n_edges << std::endl;
431 for(
EdgeIter e_it = _mesh.e_iter(); e_it; ++e_it) {
433 VertexHandle from_vertex = _mesh.edge(*e_it).from_vertex();
435 off << from_vertex <<
" " << to_vertex << std::endl;
438 uint64_t n_faces(_mesh.n_faces());
439 off <<
"Faces" << std::endl;
440 off << n_faces << std::endl;
443 for(
FaceIter f_it = _mesh.f_iter(); f_it; ++f_it) {
445 off << static_cast<uint64_t>(_mesh.face(*f_it).halfedges().size()) <<
" ";
447 std::vector<HalfEdgeHandle> halfedges = _mesh.face(*f_it).halfedges();
449 for(
typename std::vector<HalfEdgeHandle>::const_iterator it = halfedges.begin(); it
450 != halfedges.end(); ++it) {
454 if((it + 1) != halfedges.end())
461 uint64_t n_cells(_mesh.n_cells());
462 off <<
"Polyhedra" << std::endl;
463 off << n_cells << std::endl;
465 for(
CellIter c_it = _mesh.c_iter(); c_it; ++c_it) {
467 off << static_cast<uint64_t>(_mesh.cell(*c_it).halffaces().size()) <<
" ";
469 std::vector<HalfFaceHandle> halffaces = _mesh.cell(*c_it).halffaces();
471 for(
typename std::vector<HalfFaceHandle>::const_iterator it = halffaces.begin(); it
472 != halffaces.end(); ++it) {
476 if((it + 1) != halffaces.end())
484 writeProps(off, _mesh.vertex_props_begin(), _mesh.vertex_props_end());
486 writeProps(off, _mesh.edge_props_begin(), _mesh.edge_props_end());
488 writeProps(off, _mesh.halfedge_props_begin(), _mesh.halfedge_props_end());
490 writeProps(off, _mesh.face_props_begin(), _mesh.face_props_end());
492 writeProps(off, _mesh.halfface_props_begin(), _mesh.halfface_props_end());
494 writeProps(off, _mesh.cell_props_begin(), _mesh.cell_props_end());
496 writeProps(off, _mesh.mesh_props_begin(), _mesh.mesh_props_end());
505 template<
class IteratorT>
506 void FileManager::writeProps(std::ostream& _ostr,
const IteratorT& _begin,
const IteratorT& _end)
const {
509 for(IteratorT p_it = _begin;
510 p_it != _end; ++p_it) {
511 if(!(*p_it)->persistent())
continue;
512 if((*p_it)->anonymous()) {
513 std::cerr <<
"Serialization of anonymous properties is not supported!" << std::endl;
517 std::string type_name;
519 type_name = (*p_it)->typeNameWrapper();
520 }
catch (std::runtime_error &e) {
521 std::cerr <<
"Failed to save property, skipping: " << e.what() << std::endl;
524 _ostr << (*p_it)->entityType() <<
" ";
525 _ostr << type_name <<
" ";
526 _ostr <<
"\"" << (*p_it)->name() <<
"\"" << std::endl;
528 (*p_it)->serialize(_ostr);
Property classes for the different entity types.
bool readFile(const std::string &_filename, MeshT &_mesh, bool _topologyCheck=true, bool _computeBottomUpIncidences=true) const
Read a mesh from a file.
bool writeFile(const std::string &_filename, const MeshT &_mesh) const
Write a mesh to a file.