Files
openmesh/src/OpenMesh/Core/IO/writer/VTKWriter.cc
2023-02-28 12:20:22 +01:00

100 lines
2.9 KiB
C++

//== INCLUDES =================================================================
#include <fstream>
#include <limits>
#include <OpenMesh/Core/IO/BinaryHelper.hh>
#include <OpenMesh/Core/IO/writer/VTKWriter.hh>
#include <OpenMesh/Core/IO/IOManager.hh>
#include <OpenMesh/Core/Utils/color_cast.hh>
//=== 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, const Options& _writeOptions, 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, _writeOptions, _precision);
}
//-----------------------------------------------------------------------------
bool _VTKWriter_::write(std::ostream& _out, BaseExporter& _be, const Options& _writeOptions, std::streamsize _precision) const
{
VertexHandle vh;
// check exporter features
if (!check(_be, _writeOptions)) {
return false;
}
// check writer features
if (!_writeOptions.is_empty()) {
omlog() << "[VTKWriter] : writer does not support any options\n";
return false;
}
omlog() << "[VTKWriter] : write file\n";
_out.precision(_precision);
std::vector<VertexHandle> 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) {
const Vec3f v = _be.point(VertexHandle(int(i)));
_out << v[0] << ' ' << v[1] << ' ' << v[2] << '\n';
}
// faces
_out << "POLYGONS " << nf << ' ' << polygon_table_size << '\n';
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 << '\n';
}
return true;
}
//=============================================================================
} // namespace IO
} // namespace OpenMesh
//=============================================================================