From 377bf721acfddcc6ed56b07dc8dad1385def0b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20M=C3=B6bius?= Date: Fri, 28 Feb 2014 07:18:21 +0000 Subject: [PATCH] Added simple VTK writer writing only vertices and faces (Thanks to Vladimir Chalupecky for the code). closes #2039 git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@1000 fdac6126-5c0c-442c-9429-916003d36597 --- src/OpenMesh/Core/IO/writer/VTKWriter.cc | 106 +++++++++++++++++++++++ src/OpenMesh/Core/IO/writer/VTKWriter.hh | 52 +++++++++++ 2 files changed, 158 insertions(+) create mode 100644 src/OpenMesh/Core/IO/writer/VTKWriter.cc create mode 100644 src/OpenMesh/Core/IO/writer/VTKWriter.hh diff --git a/src/OpenMesh/Core/IO/writer/VTKWriter.cc b/src/OpenMesh/Core/IO/writer/VTKWriter.cc new file mode 100644 index 00000000..13ea4799 --- /dev/null +++ b/src/OpenMesh/Core/IO/writer/VTKWriter.cc @@ -0,0 +1,106 @@ +//== INCLUDES ================================================================= + +#include +#include + +#include +#include +#include +#include +#include +#include + +//=== NAMESPACES ============================================================== + +namespace OpenMesh { +namespace IO { + +//=== INSTANTIATE ============================================================= + +_VTKWriter_ __VTKWriterinstance; +_VTKWriter_& VTKWriter() { return __VTKWriterinstance; } + +//=== IMPLEMENTATION ========================================================== + +_VTKWriter_::_VTKWriter_() { IOManager().register_module(this); } + +//----------------------------------------------------------------------------- + +bool _VTKWriter_::write(const std::string& _filename, BaseExporter& _be, Options _opt, std::streamsize _precision) const +{ + std::ofstream out(_filename.c_str()); + + if (!out) { + omerr() << "[VTKWriter] : cannot open file " << _filename << std::endl; + return false; + } + + return write(out, _be, _opt, _precision); +} + +//----------------------------------------------------------------------------- + +bool _VTKWriter_::write(std::ostream& _out, BaseExporter& _be, Options _opt, std::streamsize _precision) const +{ + unsigned int idx; + Vec3f v, n; + Vec2f t; + VertexHandle vh; + OpenMesh::Vec3f c; + OpenMesh::Vec4f cA; + + // check exporter features + if (!check(_be, _opt)) { + return false; + } + + // check writer features + if (!_opt.is_empty()) { + omlog() << "[VTKWriter] : writer does not support any options\n"; + return false; + } + + omlog() << "[VTKWriter] : write file\n"; + _out.precision(_precision); + + std::vector vhandles; + size_t polygon_table_size = 0; + size_t nf = _be.n_faces(); + for (size_t i = 0; i < nf; ++i) { + polygon_table_size += _be.get_vhandles(FaceHandle(int(i)), vhandles); + } + polygon_table_size += nf; + + // header + _out << "# vtk DataFile Version 3.0\n"; + _out << "Generated by OpenMesh\n"; + _out << "ASCII\n"; + _out << "DATASET POLYDATA\n"; + + // points + _out << "POINTS " << _be.n_vertices() << " float\n"; + size_t nv = _be.n_vertices(); + for (size_t i = 0; i < nv; ++i) { + Vec3f v = _be.point(VertexHandle(int(i))); + _out << v[0] << ' ' << v[1] << ' ' << v[2] << std::endl; + } + + // faces + _out << "POLYGONS " << nf << ' ' << polygon_table_size << std::endl; + for (size_t i = 0; i < nf; ++i) { + _be.get_vhandles(FaceHandle(int(i)), vhandles); + + _out << vhandles.size() << ' '; + for (size_t j = 0; j < vhandles.size(); ++j) { + _out << " " << vhandles[j].idx(); + } + _out << std::endl; + } + + return true; +} + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= diff --git a/src/OpenMesh/Core/IO/writer/VTKWriter.hh b/src/OpenMesh/Core/IO/writer/VTKWriter.hh new file mode 100644 index 00000000..ce613423 --- /dev/null +++ b/src/OpenMesh/Core/IO/writer/VTKWriter.hh @@ -0,0 +1,52 @@ +//============================================================================= +// +// Implements an IOManager writer module for VTK files +// +//============================================================================= + +#ifndef __VTKWRITER_HH__ +#define __VTKWRITER_HH__ + +//=== INCLUDES ================================================================ + +#include +#include + +#include +#include +#include +#include + +//== NAMESPACES =============================================================== + +namespace OpenMesh { +namespace IO { + +//=== IMPLEMENTATION ========================================================== + +class OPENMESHDLLEXPORT _VTKWriter_ : public BaseWriter +{ +public: + _VTKWriter_(); + + std::string get_description() const { return "VTK"; } + std::string get_extensions() const { return "vtk"; } + + bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const; + bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const; + + size_t binary_size(BaseExporter&, Options) const { return 0; } +}; + +//== TYPE DEFINITION ========================================================== + +/// Declare the single entity of the OBJ writer +extern _VTKWriter_ __VTKWriterinstance; +OPENMESHDLLEXPORT _VTKWriter_& VTKWriter(); + +//============================================================================= +} // namespace IO +} // namespace OpenMesh +//============================================================================= +#endif +//=============================================================================