Developer Documentation
VTKWriter.cc
1//== INCLUDES =================================================================
2
3#include <fstream>
4#include <limits>
5
6#include <OpenMesh/Core/IO/BinaryHelper.hh>
7#include <OpenMesh/Core/IO/writer/VTKWriter.hh>
8#include <OpenMesh/Core/IO/IOManager.hh>
9#include <OpenMesh/Core/Utils/color_cast.hh>
10
11//=== NAMESPACES ==============================================================
12
13namespace OpenMesh {
14namespace IO {
15
16//=== INSTANTIATE =============================================================
17
19_VTKWriter_& VTKWriter() { return __VTKWriterinstance; }
20
21//=== IMPLEMENTATION ==========================================================
22
23_VTKWriter_::_VTKWriter_() { IOManager().register_module(this); }
24
25//-----------------------------------------------------------------------------
26
27bool _VTKWriter_::write(const std::string& _filename, BaseExporter& _be, const Options& _writeOptions, std::streamsize _precision) const
28{
29 std::ofstream out(_filename.c_str());
30
31 if (!out) {
32 omerr() << "[VTKWriter] : cannot open file " << _filename << std::endl;
33 return false;
34 }
35
36 return write(out, _be, _writeOptions, _precision);
37}
38
39//-----------------------------------------------------------------------------
40
41bool _VTKWriter_::write(std::ostream& _out, BaseExporter& _be, const Options& _writeOptions, std::streamsize _precision) const
42{
43 // check exporter features
44 if (!check(_be, _writeOptions)) {
45 return false;
46 }
47
48 // check writer features
49 if (!_writeOptions.is_empty()) {
50 omlog() << "[VTKWriter] : writer does not support any options\n";
51 return false;
52 }
53
54 omlog() << "[VTKWriter] : write file\n";
55 _out.precision(_precision);
56
57 std::vector<VertexHandle> vhandles;
58 size_t polygon_table_size = 0;
59 size_t nf = _be.n_faces();
60 for (size_t i = 0; i < nf; ++i) {
61 polygon_table_size += _be.get_vhandles(FaceHandle(int(i)), vhandles);
62 }
63 polygon_table_size += nf;
64
65 // header
66 _out << "# vtk DataFile Version 3.0\n";
67 _out << "Generated by OpenMesh\n";
68 _out << "ASCII\n";
69 _out << "DATASET POLYDATA\n";
70
71 // points
72 _out << "POINTS " << _be.n_vertices() << " float\n";
73 size_t nv = _be.n_vertices();
74 for (size_t i = 0; i < nv; ++i) {
75 const Vec3f v = _be.point(VertexHandle(int(i)));
76 _out << v[0] << ' ' << v[1] << ' ' << v[2] << '\n';
77 }
78
79 // faces
80 _out << "POLYGONS " << nf << ' ' << polygon_table_size << '\n';
81 for (size_t i = 0; i < nf; ++i) {
82 _be.get_vhandles(FaceHandle(int(i)), vhandles);
83
84 _out << vhandles.size() << ' ';
85 for (size_t j = 0; j < vhandles.size(); ++j) {
86 _out << " " << vhandles[j].idx();
87 }
88 _out << '\n';
89 }
90
91 return true;
92}
93
94//=============================================================================
95} // namespace IO
96} // namespace OpenMesh
97//=============================================================================
Set options for reader/writer modules.
Definition: Options.hh:92
bool is_empty(void) const
Returns true if all bits are zero.
Definition: Options.hh:147
bool register_module(BaseReader *_bl)
Definition: IOManager.hh:217
bool write(const std::string &, BaseExporter &, const Options &_writeOptions, std::streamsize _precision=6) const override
Definition: VTKWriter.cc:27
_IOManager_ & IOManager()
Definition: IOManager.cc:72
_VTKWriter_ __VTKWriterinstance
Declare the single entity of the OBJ writer.
Definition: VTKWriter.cc:18
Handle for a face entity.
Definition: Handles.hh:142
Handle for a vertex entity.
Definition: Handles.hh:121