- added precision option to openmesh writers

refs #1075

git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@746 fdac6126-5c0c-442c-9429-916003d36597
This commit is contained in:
Isaak Lim
2012-10-15 10:28:14 +00:00
parent 1d6e590a0f
commit fc7acde663
11 changed files with 147 additions and 132 deletions

View File

@@ -99,12 +99,14 @@ public:
/// Write to file _filename. Data source specified by BaseExporter _be. /// Write to file _filename. Data source specified by BaseExporter _be.
virtual bool write(const std::string& _filename, virtual bool write(const std::string& _filename,
BaseExporter& _be, BaseExporter& _be,
Options _opt) const = 0; Options _opt,
std::streamsize _precision = 6) const = 0;
/// Write to std::ostream _os. Data source specified by BaseExporter _be. /// Write to std::ostream _os. Data source specified by BaseExporter _be.
virtual bool write(std::ostream& _os, virtual bool write(std::ostream& _os,
BaseExporter& _be, BaseExporter& _be,
Options _opt) const = 0; Options _opt,
std::streamsize _precision = 6) const = 0;
/// Returns expected size of file if binary format is supported else 0. /// Returns expected size of file if binary format is supported else 0.
virtual size_t binary_size(BaseExporter&, Options) const { return 0; } virtual size_t binary_size(BaseExporter&, Options) const { return 0; }

View File

@@ -4,10 +4,10 @@
* Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen * * Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen *
* www.openmesh.org * * www.openmesh.org *
* * * *
*---------------------------------------------------------------------------* *---------------------------------------------------------------------------*
* This file is part of OpenMesh. * * This file is part of OpenMesh. *
* * * *
* OpenMesh is free software: you can redistribute it and/or modify * * OpenMesh is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as * * it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of * * published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version with the * * the License, or (at your option) any later version with the *
@@ -30,10 +30,10 @@
* License along with OpenMesh. If not, * * License along with OpenMesh. If not, *
* see <http://www.gnu.org/licenses/>. * * see <http://www.gnu.org/licenses/>. *
* * * *
\*===========================================================================*/ \*===========================================================================*/
/*===========================================================================*\ /*===========================================================================*\
* * * *
* $Revision$ * * $Revision$ *
* $Date$ * * $Date$ *
* * * *
@@ -80,7 +80,7 @@ _OBJWriter_::_OBJWriter_() { IOManager().register_module(this); }
bool bool
_OBJWriter_:: _OBJWriter_::
write(const std::string& _filename, BaseExporter& _be, Options _opt) const write(const std::string& _filename, BaseExporter& _be, Options _opt, std::streamsize _precision) const
{ {
std::fstream out(_filename.c_str(), std::ios_base::out ); std::fstream out(_filename.c_str(), std::ios_base::out );
@@ -91,6 +91,8 @@ write(const std::string& _filename, BaseExporter& _be, Options _opt) const
return false; return false;
} }
out.precision(_precision);
{ {
#if defined(WIN32) #if defined(WIN32)
std::string::size_type dot = _filename.find_last_of("\\/"); std::string::size_type dot = _filename.find_last_of("\\/");
@@ -196,7 +198,7 @@ writeMaterial(std::ostream& _out, BaseExporter& _be, Options _opt) const
bool bool
_OBJWriter_:: _OBJWriter_::
write(std::ostream& _out, BaseExporter& _be, Options _opt) const write(std::ostream& _out, BaseExporter& _be, Options _opt, std::streamsize _precision) const
{ {
unsigned int i, j, nV, nF, idx; unsigned int i, j, nV, nF, idx;
Vec3f v, n; Vec3f v, n;
@@ -209,6 +211,7 @@ write(std::ostream& _out, BaseExporter& _be, Options _opt) const
omlog() << "[OBJWriter] : write file\n"; omlog() << "[OBJWriter] : write file\n";
_out.precision(_precision);
// check exporter features // check exporter features
if (!check( _be, _opt)) if (!check( _be, _opt))
@@ -297,18 +300,18 @@ write(std::ostream& _out, BaseExporter& _be, Options _opt) const
for (j=0; j< vhandles.size(); ++j) for (j=0; j< vhandles.size(); ++j)
{ {
// Write vertex index // Write vertex index
idx = vhandles[j].idx() + 1; idx = vhandles[j].idx() + 1;
_out << " " << idx; _out << " " << idx;
// write separator // write separator
_out << "/" ; _out << "/" ;
// write vertex texture coordinate index // write vertex texture coordinate index
if (_opt.check(Options::VertexTexCoord)) if (_opt.check(Options::VertexTexCoord))
_out << idx; _out << idx;
// write separator // write separator
_out << "/" ; _out << "/" ;

View File

@@ -4,10 +4,10 @@
* Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen * * Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen *
* www.openmesh.org * * www.openmesh.org *
* * * *
*---------------------------------------------------------------------------* *---------------------------------------------------------------------------*
* This file is part of OpenMesh. * * This file is part of OpenMesh. *
* * * *
* OpenMesh is free software: you can redistribute it and/or modify * * OpenMesh is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as * * it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of * * published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version with the * * the License, or (at your option) any later version with the *
@@ -30,10 +30,10 @@
* License along with OpenMesh. If not, * * License along with OpenMesh. If not, *
* see <http://www.gnu.org/licenses/>. * * see <http://www.gnu.org/licenses/>. *
* * * *
\*===========================================================================*/ \*===========================================================================*/
/*===========================================================================*\ /*===========================================================================*\
* * * *
* $Revision$ * * $Revision$ *
* $Date$ * * $Date$ *
* * * *
@@ -73,7 +73,7 @@ namespace IO {
//=== IMPLEMENTATION ========================================================== //=== IMPLEMENTATION ==========================================================
/** /**
This class defines the OBJ writer. This class is further singleton'ed This class defines the OBJ writer. This class is further singleton'ed
by SingletonT to OBJWriter. by SingletonT to OBJWriter.
*/ */
@@ -89,9 +89,9 @@ public:
std::string get_description() const { return "Alias/Wavefront"; } std::string get_description() const { return "Alias/Wavefront"; }
std::string get_extensions() const { return "obj"; } std::string get_extensions() const { return "obj"; }
bool write(const std::string&, BaseExporter&, Options) const; bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const;
bool write(std::ostream&, BaseExporter&, Options) const; bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;
size_t binary_size(BaseExporter&, Options) const { return 0; } size_t binary_size(BaseExporter&, Options) const { return 0; }

View File

@@ -4,10 +4,10 @@
* Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen * * Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen *
* www.openmesh.org * * www.openmesh.org *
* * * *
*---------------------------------------------------------------------------* *---------------------------------------------------------------------------*
* This file is part of OpenMesh. * * This file is part of OpenMesh. *
* * * *
* OpenMesh is free software: you can redistribute it and/or modify * * OpenMesh is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as * * it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of * * published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version with the * * the License, or (at your option) any later version with the *
@@ -30,10 +30,10 @@
* License along with OpenMesh. If not, * * License along with OpenMesh. If not, *
* see <http://www.gnu.org/licenses/>. * * see <http://www.gnu.org/licenses/>. *
* * * *
\*===========================================================================*/ \*===========================================================================*/
/*===========================================================================*\ /*===========================================================================*\
* * * *
* $Revision$ * * $Revision$ *
* $Date$ * * $Date$ *
* * * *
@@ -78,7 +78,7 @@ _OFFWriter_::_OFFWriter_() { IOManager().register_module(this); }
bool bool
_OFFWriter_:: _OFFWriter_::
write(const std::string& _filename, BaseExporter& _be, Options _opt) const write(const std::string& _filename, BaseExporter& _be, Options _opt, std::streamsize _precision) const
{ {
// check exporter features // check exporter features
if ( !check( _be, _opt ) ) if ( !check( _be, _opt ) )
@@ -88,7 +88,7 @@ write(const std::string& _filename, BaseExporter& _be, Options _opt) const
// check writer features // check writer features
if ( _opt.check(Options::FaceNormal) ) // not supported by format if ( _opt.check(Options::FaceNormal) ) // not supported by format
return false; return false;
// open file // open file
std::fstream out(_filename.c_str(), (_opt.check(Options::Binary) ? std::ios_base::binary | std::ios_base::out std::fstream out(_filename.c_str(), (_opt.check(Options::Binary) ? std::ios_base::binary | std::ios_base::out
: std::ios_base::out) ); : std::ios_base::out) );
@@ -100,6 +100,7 @@ write(const std::string& _filename, BaseExporter& _be, Options _opt) const
return false; return false;
} }
out.precision(_precision);
// write header line // write header line
if (_opt.check(Options::VertexTexCoord)) out << "ST"; if (_opt.check(Options::VertexTexCoord)) out << "ST";
@@ -126,7 +127,7 @@ write(const std::string& _filename, BaseExporter& _be, Options _opt) const
bool bool
_OFFWriter_:: _OFFWriter_::
write(std::ostream& _os, BaseExporter& _be, Options _opt) const write(std::ostream& _os, BaseExporter& _be, Options _opt, std::streamsize _precision) const
{ {
// check exporter features // check exporter features
if ( !check( _be, _opt ) ) if ( !check( _be, _opt ) )
@@ -136,8 +137,8 @@ write(std::ostream& _os, BaseExporter& _be, Options _opt) const
// check writer features // check writer features
if ( _opt.check(Options::FaceNormal) ) // not supported by format if ( _opt.check(Options::FaceNormal) ) // not supported by format
return false; return false;
if (!_os.good()) if (!_os.good())
{ {
omerr() << "[OFFWriter] : cannot write to stream " omerr() << "[OFFWriter] : cannot write to stream "
@@ -145,6 +146,7 @@ write(std::ostream& _os, BaseExporter& _be, Options _opt) const
return false; return false;
} }
_os.precision(_precision);
// write header line // write header line
if (_opt.check(Options::VertexTexCoord)) _os << "ST"; if (_opt.check(Options::VertexTexCoord)) _os << "ST";
@@ -195,16 +197,16 @@ write_ascii(std::ostream& _out, BaseExporter& _be, Options _opt) const
{ {
vh = VertexHandle(i); vh = VertexHandle(i);
v = _be.point(vh); v = _be.point(vh);
//Vertex //Vertex
_out << v[0] << " " << v[1] << " " << v[2]; _out << v[0] << " " << v[1] << " " << v[2];
// VertexNormal // VertexNormal
if ( _opt.vertex_has_normal() ) { if ( _opt.vertex_has_normal() ) {
n = _be.normal(vh); n = _be.normal(vh);
_out << " " << n[0] << " " << n[1] << " " << n[2]; _out << " " << n[0] << " " << n[1] << " " << n[2];
} }
// VertexColor // VertexColor
if ( _opt.vertex_has_color() ) { if ( _opt.vertex_has_color() ) {
//with alpha //with alpha
@@ -217,26 +219,26 @@ write_ascii(std::ostream& _out, BaseExporter& _be, Options _opt) const
_out << " " << c[0] << " " << c[1] << " " << c[2]; _out << " " << c[0] << " " << c[1] << " " << c[2];
} }
} }
// TexCoord // TexCoord
if (_opt.vertex_has_texcoord() ) { if (_opt.vertex_has_texcoord() ) {
t = _be.texcoord(vh); t = _be.texcoord(vh);
_out << " " << t[0] << " " << t[1]; _out << " " << t[0] << " " << t[1];
} }
_out << "\n"; _out << "\n";
} }
// faces (indices starting at 0) // faces (indices starting at 0)
if (_be.is_triangle_mesh()) if (_be.is_triangle_mesh())
{ {
for (i=0, nF=_be.n_faces(); i<nF; ++i) for (i=0, nF=_be.n_faces(); i<nF; ++i)
{ {
_be.get_vhandles(FaceHandle(i), vhandles); _be.get_vhandles(FaceHandle(i), vhandles);
_out << 3 << " "; _out << 3 << " ";
_out << vhandles[0].idx() << " "; _out << vhandles[0].idx() << " ";
_out << vhandles[1].idx() << " "; _out << vhandles[1].idx() << " ";
_out << vhandles[2].idx(); _out << vhandles[2].idx();
//face color //face color
@@ -305,7 +307,7 @@ void _OFFWriter_::writeValue(std::ostream& _out, float value) const {
store(_out, tmp, false); store(_out, tmp, false);
} }
bool bool
_OFFWriter_:: _OFFWriter_::
write_binary(std::ostream& _out, BaseExporter& _be, Options _opt) const write_binary(std::ostream& _out, BaseExporter& _be, Options _opt) const
{ {
@@ -325,18 +327,18 @@ write_binary(std::ostream& _out, BaseExporter& _be, Options _opt) const
writeValue(_out, (uint) _be.n_faces() ); writeValue(_out, (uint) _be.n_faces() );
writeValue(_out, 0 ); writeValue(_out, 0 );
// vertex data (point, normals, texcoords) // vertex data (point, normals, texcoords)
for (i=0, nV=_be.n_vertices(); i<nV; ++i) for (i=0, nV=_be.n_vertices(); i<nV; ++i)
{ {
vh = VertexHandle(i); vh = VertexHandle(i);
v = _be.point(vh); v = _be.point(vh);
//vertex //vertex
writeValue(_out, v[0]); writeValue(_out, v[0]);
writeValue(_out, v[1]); writeValue(_out, v[1]);
writeValue(_out, v[2]); writeValue(_out, v[2]);
// vertex normal // vertex normal
if ( _opt.vertex_has_normal() ) { if ( _opt.vertex_has_normal() ) {
n = _be.normal(vh); n = _be.normal(vh);
@@ -360,7 +362,7 @@ write_binary(std::ostream& _out, BaseExporter& _be, Options _opt) const
writeValue(_out, t[0]); writeValue(_out, t[0]);
writeValue(_out, t[1]); writeValue(_out, t[1]);
} }
} }
// faces (indices starting at 0) // faces (indices starting at 0)
@@ -426,7 +428,7 @@ binary_size(BaseExporter& _be, Options _opt) const
size_t _3floats(3*sizeof(float)); size_t _3floats(3*sizeof(float));
size_t _3ui(3*sizeof(unsigned int)); size_t _3ui(3*sizeof(unsigned int));
size_t _4ui(4*sizeof(unsigned int)); size_t _4ui(4*sizeof(unsigned int));
if ( !_opt.is_binary() ) if ( !_opt.is_binary() )
return 0; return 0;
else else
@@ -441,7 +443,7 @@ binary_size(BaseExporter& _be, Options _opt) const
header += 1; // N header += 1; // N
data += _be.n_vertices() * _3floats; data += _be.n_vertices() * _3floats;
} }
if ( _opt.vertex_has_color() && _be.has_vertex_colors() ) if ( _opt.vertex_has_color() && _be.has_vertex_colors() )
{ {
header += 1; // C header += 1; // C
@@ -472,7 +474,7 @@ binary_size(BaseExporter& _be, Options _opt) const
} }
} }
// face colors // face colors
if ( _opt.face_has_color() && _be.has_face_colors() ){ if ( _opt.face_has_color() && _be.has_face_colors() ){
if ( _opt.color_has_alpha() ) if ( _opt.color_has_alpha() )

View File

@@ -4,10 +4,10 @@
* Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen * * Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen *
* www.openmesh.org * * www.openmesh.org *
* * * *
*---------------------------------------------------------------------------* *---------------------------------------------------------------------------*
* This file is part of OpenMesh. * * This file is part of OpenMesh. *
* * * *
* OpenMesh is free software: you can redistribute it and/or modify * * OpenMesh is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as * * it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of * * published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version with the * * the License, or (at your option) any later version with the *
@@ -30,10 +30,10 @@
* License along with OpenMesh. If not, * * License along with OpenMesh. If not, *
* see <http://www.gnu.org/licenses/>. * * see <http://www.gnu.org/licenses/>. *
* * * *
\*===========================================================================*/ \*===========================================================================*/
/*===========================================================================*\ /*===========================================================================*\
* * * *
* $Revision$ * * $Revision$ *
* $Date$ * * $Date$ *
* * * *
@@ -74,8 +74,8 @@ namespace IO {
//=== IMPLEMENTATION ========================================================== //=== IMPLEMENTATION ==========================================================
/** /**
Implementation of the OFF format writer. This class is singleton'ed by Implementation of the OFF format writer. This class is singleton'ed by
SingletonT to OFFWriter. SingletonT to OFFWriter.
By passing Options to the write function you can manipulate the writing behavoir. By passing Options to the write function you can manipulate the writing behavoir.
@@ -100,9 +100,9 @@ public:
std::string get_description() const { return "no description"; } std::string get_description() const { return "no description"; }
std::string get_extensions() const { return "off"; } std::string get_extensions() const { return "off"; }
bool write(const std::string&, BaseExporter&, Options) const; bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const;
bool write(std::ostream&, BaseExporter&, Options) const; bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;
size_t binary_size(BaseExporter& _be, Options _opt) const; size_t binary_size(BaseExporter& _be, Options _opt) const;

View File

@@ -4,10 +4,10 @@
* Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen * * Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen *
* www.openmesh.org * * www.openmesh.org *
* * * *
*---------------------------------------------------------------------------* *---------------------------------------------------------------------------*
* This file is part of OpenMesh. * * This file is part of OpenMesh. *
* * * *
* OpenMesh is free software: you can redistribute it and/or modify * * OpenMesh is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as * * it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of * * published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version with the * * the License, or (at your option) any later version with the *
@@ -30,10 +30,10 @@
* License along with OpenMesh. If not, * * License along with OpenMesh. If not, *
* see <http://www.gnu.org/licenses/>. * * see <http://www.gnu.org/licenses/>. *
* * * *
\*===========================================================================*/ \*===========================================================================*/
/*===========================================================================*\ /*===========================================================================*\
* * * *
* $Revision$ * * $Revision$ *
* $Date$ * * $Date$ *
* * * *
@@ -83,27 +83,28 @@ const OMFormat::uint8 _OMWriter_::version_ = OMFormat::mk_version(1,2);
_OMWriter_:: _OMWriter_::
_OMWriter_() _OMWriter_()
{ {
IOManager().register_module(this); IOManager().register_module(this);
} }
bool bool
_OMWriter_::write(const std::string& _filename, BaseExporter& _be, _OMWriter_::write(const std::string& _filename, BaseExporter& _be,
Options _opt) const Options _opt, std::streamsize _precision) const
{ {
// check whether exporter can give us an OpenMesh BaseKernel // check whether exporter can give us an OpenMesh BaseKernel
if (!_be.kernel()) return false; if (!_be.kernel()) return false;
// check for om extension in filename, we can only handle OM // check for om extension in filename, we can only handle OM
if (_filename.rfind(".om") == std::string::npos) if (_filename.rfind(".om") == std::string::npos)
return false; return false;
_opt += Options::Binary; // only binary format supported _opt += Options::Binary; // only binary format supported
std::ofstream ofs(_filename.c_str(), std::ios::binary); std::ofstream ofs(_filename.c_str(), std::ios::binary);
ofs.precision(_precision);
// check if file is open // check if file is open
if (!ofs.is_open()) if (!ofs.is_open())
@@ -114,7 +115,7 @@ _OMWriter_::write(const std::string& _filename, BaseExporter& _be,
// call stream save method // call stream save method
bool rc = write(ofs, _be, _opt); bool rc = write(ofs, _be, _opt);
// close filestream // close filestream
ofs.close(); ofs.close();
@@ -126,9 +127,10 @@ _OMWriter_::write(const std::string& _filename, BaseExporter& _be,
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
bool bool
_OMWriter_::write(std::ostream& _os, BaseExporter& _be, Options _opt) const _OMWriter_::write(std::ostream& _os, BaseExporter& _be, Options _opt, std::streamsize _precision) const
{ {
// std::clog << "[OMWriter]::write( stream )\n"; // std::clog << "[OMWriter]::write( stream )\n";
_os.precision(_precision);
// check exporter features // check exporter features
if ( !check( _be, _opt ) ) if ( !check( _be, _opt ) )
@@ -187,7 +189,7 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
// -------------------- write header // -------------------- write header
OMFormat::Header header; OMFormat::Header header;
header.magic_[0] = 'O'; header.magic_[0] = 'O';
header.magic_[1] = 'M'; header.magic_[1] = 'M';
header.mesh_ = _be.is_triangle_mesh() ? 'T' : 'P'; header.mesh_ = _be.is_triangle_mesh() ? 'T' : 'P';
@@ -195,16 +197,16 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
header.n_vertices_ = _be.n_vertices(); header.n_vertices_ = _be.n_vertices();
header.n_faces_ = _be.n_faces(); header.n_faces_ = _be.n_faces();
header.n_edges_ = _be.n_edges(); header.n_edges_ = _be.n_edges();
bytes += store( _os, header, swap ); bytes += store( _os, header, swap );
// ---------------------------------------- write chunks // ---------------------------------------- write chunks
OMFormat::Chunk::Header chunk_header; OMFormat::Chunk::Header chunk_header;
// -------------------- write vertex data // -------------------- write vertex data
// ---------- write vertex position // ---------- write vertex position
if (_be.n_vertices()) if (_be.n_vertices())
{ {
@@ -217,7 +219,7 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
chunk_header.float_ = OMFormat::is_float(v[0]); chunk_header.float_ = OMFormat::is_float(v[0]);
chunk_header.dim_ = OMFormat::dim(v); chunk_header.dim_ = OMFormat::dim(v);
chunk_header.bits_ = OMFormat::bits(v[0]); chunk_header.bits_ = OMFormat::bits(v[0]);
bytes += store( _os, chunk_header, swap ); bytes += store( _os, chunk_header, swap );
for (i=0, nV=_be.n_vertices(); i<nV; ++i) for (i=0, nV=_be.n_vertices(); i<nV; ++i)
bytes += vector_store( _os, _be.point(VertexHandle(i)), swap ); bytes += vector_store( _os, _be.point(VertexHandle(i)), swap );
@@ -236,7 +238,7 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
chunk_header.float_ = OMFormat::is_float(n[0]); chunk_header.float_ = OMFormat::is_float(n[0]);
chunk_header.dim_ = OMFormat::dim(n); chunk_header.dim_ = OMFormat::dim(n);
chunk_header.bits_ = OMFormat::bits(n[0]); chunk_header.bits_ = OMFormat::bits(n[0]);
bytes += store( _os, chunk_header, swap ); bytes += store( _os, chunk_header, swap );
for (i=0, nV=_be.n_vertices(); i<nV; ++i) for (i=0, nV=_be.n_vertices(); i<nV; ++i)
bytes += vector_store( _os, _be.normal(VertexHandle(i)), swap ); bytes += vector_store( _os, _be.normal(VertexHandle(i)), swap );
@@ -244,16 +246,16 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
// ---------- write vertex color // ---------- write vertex color
if (_opt.check( Options::VertexColor ) && _be.has_vertex_colors() ) if (_opt.check( Options::VertexColor ) && _be.has_vertex_colors() )
{ {
Vec3uc c = _be.color(VertexHandle(0)); Vec3uc c = _be.color(VertexHandle(0));
chunk_header.name_ = false; chunk_header.name_ = false;
chunk_header.entity_ = OMFormat::Chunk::Entity_Vertex; chunk_header.entity_ = OMFormat::Chunk::Entity_Vertex;
chunk_header.type_ = OMFormat::Chunk::Type_Color; chunk_header.type_ = OMFormat::Chunk::Type_Color;
chunk_header.signed_ = OMFormat::is_signed( c ); chunk_header.signed_ = OMFormat::is_signed( c );
chunk_header.float_ = OMFormat::is_float( c ); chunk_header.float_ = OMFormat::is_float( c );
chunk_header.dim_ = OMFormat::dim( c ); chunk_header.dim_ = OMFormat::dim( c );
chunk_header.bits_ = OMFormat::bits( c ); chunk_header.bits_ = OMFormat::bits( c );
bytes += store( _os, chunk_header, swap ); bytes += store( _os, chunk_header, swap );
for (i=0, nV=_be.n_vertices(); i<nV; ++i) for (i=0, nV=_be.n_vertices(); i<nV; ++i)
@@ -272,7 +274,7 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
chunk_header.float_ = OMFormat::is_float(t[0]); chunk_header.float_ = OMFormat::is_float(t[0]);
chunk_header.dim_ = OMFormat::dim(t); chunk_header.dim_ = OMFormat::dim(t);
chunk_header.bits_ = OMFormat::bits(t[0]); chunk_header.bits_ = OMFormat::bits(t[0]);
// std::clog << chunk_header << std::endl; // std::clog << chunk_header << std::endl;
bytes += store( _os, chunk_header, swap ); bytes += store( _os, chunk_header, swap );
@@ -290,7 +292,7 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
chunk_header.signed_ = 0; chunk_header.signed_ = 0;
chunk_header.float_ = 0; chunk_header.float_ = 0;
chunk_header.dim_ = OMFormat::Chunk::Dim_1D; // ignored chunk_header.dim_ = OMFormat::Chunk::Dim_1D; // ignored
chunk_header.bits_ = OMFormat::needed_bits(_be.n_vertices()); chunk_header.bits_ = OMFormat::needed_bits(_be.n_vertices());
bytes += store( _os, chunk_header, swap ); bytes += store( _os, chunk_header, swap );
@@ -298,14 +300,14 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
{ {
nV = _be.get_vhandles(FaceHandle(i), vhandles); nV = _be.get_vhandles(FaceHandle(i), vhandles);
if ( header.mesh_ == 'P' ) if ( header.mesh_ == 'P' )
bytes += store( _os, vhandles.size(), bytes += store( _os, vhandles.size(),
OMFormat::Chunk::Integer_16, swap ); OMFormat::Chunk::Integer_16, swap );
for (size_t j=0; j < vhandles.size(); ++j) for (size_t j=0; j < vhandles.size(); ++j)
{ {
using namespace OMFormat; using namespace OMFormat;
using namespace GenProg; using namespace GenProg;
bytes += store( _os, vhandles[j].idx(), bytes += store( _os, vhandles[j].idx(),
Chunk::Integer_Size(chunk_header.bits_), swap ); Chunk::Integer_Size(chunk_header.bits_), swap );
} }
@@ -332,7 +334,7 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
chunk_header.float_ = OMFormat::is_float(n[0]); chunk_header.float_ = OMFormat::is_float(n[0]);
chunk_header.dim_ = OMFormat::dim(n); chunk_header.dim_ = OMFormat::dim(n);
chunk_header.bits_ = OMFormat::bits(n[0]); chunk_header.bits_ = OMFormat::bits(n[0]);
bytes += store( _os, chunk_header, swap ); bytes += store( _os, chunk_header, swap );
#if !NEW_STYLE #if !NEW_STYLE
for (i=0, nF=_be.n_faces(); i<nF; ++i) for (i=0, nF=_be.n_faces(); i<nF; ++i)
@@ -350,16 +352,16 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
// ---------- write face color // ---------- write face color
if (_be.has_face_colors() && _opt.check( Options::FaceColor )) if (_be.has_face_colors() && _opt.check( Options::FaceColor ))
{ {
#define NEW_STYLE 0 #define NEW_STYLE 0
#if NEW_STYLE #if NEW_STYLE
const BaseProperty *bp = _be.kernel()._get_fprop("f:colors"); const BaseProperty *bp = _be.kernel()._get_fprop("f:colors");
if (bp) if (bp)
{ {
#endif #endif
Vec3uc c; Vec3uc c;
chunk_header.name_ = false; chunk_header.name_ = false;
chunk_header.entity_ = OMFormat::Chunk::Entity_Face; chunk_header.entity_ = OMFormat::Chunk::Entity_Face;
chunk_header.type_ = OMFormat::Chunk::Type_Color; chunk_header.type_ = OMFormat::Chunk::Type_Color;
@@ -367,11 +369,11 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
chunk_header.float_ = OMFormat::is_float( c[0] ); chunk_header.float_ = OMFormat::is_float( c[0] );
chunk_header.dim_ = OMFormat::dim( c ); chunk_header.dim_ = OMFormat::dim( c );
chunk_header.bits_ = OMFormat::bits( c[0] ); chunk_header.bits_ = OMFormat::bits( c[0] );
bytes += store( _os, chunk_header, swap ); bytes += store( _os, chunk_header, swap );
#if !NEW_STYLE #if !NEW_STYLE
for (i=0, nF=_be.n_faces(); i<nF; ++i) for (i=0, nF=_be.n_faces(); i<nF; ++i)
bytes += vector_store( _os, _be.color(FaceHandle(i)), swap ); bytes += vector_store( _os, _be.color(FaceHandle(i)), swap );
#else #else
bytes += bp->store(_os, swap); bytes += bp->store(_os, swap);
} }
@@ -382,15 +384,15 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
// -------------------- write custom properties // -------------------- write custom properties
BaseKernel::const_prop_iterator prop; BaseKernel::const_prop_iterator prop;
for (prop = _be.kernel()->vprops_begin(); for (prop = _be.kernel()->vprops_begin();
prop != _be.kernel()->vprops_end(); ++prop) prop != _be.kernel()->vprops_end(); ++prop)
{ {
if ( !*prop ) continue; if ( !*prop ) continue;
if ( (*prop)->name()[1]==':') continue; if ( (*prop)->name()[1]==':') continue;
bytes += store_binary_custom_chunk(_os, **prop, bytes += store_binary_custom_chunk(_os, **prop,
OMFormat::Chunk::Entity_Vertex, swap ); OMFormat::Chunk::Entity_Vertex, swap );
} }
for (prop = _be.kernel()->fprops_begin(); for (prop = _be.kernel()->fprops_begin();
@@ -398,7 +400,7 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
{ {
if ( !*prop ) continue; if ( !*prop ) continue;
if ( (*prop)->name()[1]==':') continue; if ( (*prop)->name()[1]==':') continue;
bytes += store_binary_custom_chunk(_os, **prop, bytes += store_binary_custom_chunk(_os, **prop,
OMFormat::Chunk::Entity_Face, swap ); OMFormat::Chunk::Entity_Face, swap );
} }
for (prop = _be.kernel()->eprops_begin(); for (prop = _be.kernel()->eprops_begin();
@@ -406,7 +408,7 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
{ {
if ( !*prop ) continue; if ( !*prop ) continue;
if ( (*prop)->name()[1]==':') continue; if ( (*prop)->name()[1]==':') continue;
bytes += store_binary_custom_chunk(_os, **prop, bytes += store_binary_custom_chunk(_os, **prop,
OMFormat::Chunk::Entity_Edge, swap ); OMFormat::Chunk::Entity_Edge, swap );
} }
for (prop = _be.kernel()->hprops_begin(); for (prop = _be.kernel()->hprops_begin();
@@ -414,7 +416,7 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
{ {
if ( !*prop ) continue; if ( !*prop ) continue;
if ( (*prop)->name()[1]==':') continue; if ( (*prop)->name()[1]==':') continue;
bytes += store_binary_custom_chunk(_os, **prop, bytes += store_binary_custom_chunk(_os, **prop,
OMFormat::Chunk::Entity_Halfedge, swap ); OMFormat::Chunk::Entity_Halfedge, swap );
} }
for (prop = _be.kernel()->mprops_begin(); for (prop = _be.kernel()->mprops_begin();
@@ -422,7 +424,7 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
{ {
if ( !*prop ) continue; if ( !*prop ) continue;
if ( (*prop)->name()[1]==':') continue; if ( (*prop)->name()[1]==':') continue;
bytes += store_binary_custom_chunk(_os, **prop, bytes += store_binary_custom_chunk(_os, **prop,
OMFormat::Chunk::Entity_Mesh, swap ); OMFormat::Chunk::Entity_Mesh, swap );
} }
@@ -433,7 +435,7 @@ bool _OMWriter_::write_binary(std::ostream& _os, BaseExporter& _be,
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
size_t _OMWriter_::store_binary_custom_chunk(std::ostream& _os, size_t _OMWriter_::store_binary_custom_chunk(std::ostream& _os,
const BaseProperty& _bp, const BaseProperty& _bp,
OMFormat::Chunk::Entity _entity, OMFormat::Chunk::Entity _entity,
bool _swap) const bool _swap) const
@@ -441,7 +443,7 @@ size_t _OMWriter_::store_binary_custom_chunk(std::ostream& _os,
omlog() << "Custom Property " << OMFormat::as_string(_entity) << " property [" omlog() << "Custom Property " << OMFormat::as_string(_entity) << " property ["
<< _bp.name() << "]" << std::endl; << _bp.name() << "]" << std::endl;
// Don't store if // Don't store if
// 1. it is not persistent // 1. it is not persistent
// 2. it's name is empty // 2. it's name is empty
if ( !_bp.persistent() || _bp.name().empty() ) if ( !_bp.persistent() || _bp.name().empty() )
@@ -467,7 +469,7 @@ size_t _OMWriter_::store_binary_custom_chunk(std::ostream& _os,
// write custom chunk // write custom chunk
// 1. chunk header // 1. chunk header
bytes += store( _os, chdr, _swap ); bytes += store( _os, chdr, _swap );
// 2. property name // 2. property name

View File

@@ -4,10 +4,10 @@
* Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen * * Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen *
* www.openmesh.org * * www.openmesh.org *
* * * *
*---------------------------------------------------------------------------* *---------------------------------------------------------------------------*
* This file is part of OpenMesh. * * This file is part of OpenMesh. *
* * * *
* OpenMesh is free software: you can redistribute it and/or modify * * OpenMesh is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as * * it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of * * published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version with the * * the License, or (at your option) any later version with the *
@@ -30,10 +30,10 @@
* License along with OpenMesh. If not, * * License along with OpenMesh. If not, *
* see <http://www.gnu.org/licenses/>. * * see <http://www.gnu.org/licenses/>. *
* * * *
\*===========================================================================*/ \*===========================================================================*/
/*===========================================================================*\ /*===========================================================================*\
* * * *
* $Revision$ * * $Revision$ *
* $Date$ * * $Date$ *
* * * *
@@ -82,8 +82,8 @@ class BaseExporter;
//=== IMPLEMENTATION ========================================================== //=== IMPLEMENTATION ==========================================================
/** /**
* Implementation of the OM format writer. This class is singleton'ed by * Implementation of the OM format writer. This class is singleton'ed by
* SingletonT to OMWriter. * SingletonT to OMWriter.
*/ */
class OPENMESHDLLEXPORT _OMWriter_ : public BaseWriter class OPENMESHDLLEXPORT _OMWriter_ : public BaseWriter
@@ -98,12 +98,12 @@ public:
std::string get_description() const std::string get_description() const
{ return "OpenMesh Format"; } { return "OpenMesh Format"; }
std::string get_extensions() const std::string get_extensions() const
{ return "om"; } { return "om"; }
bool write(std::ostream&, BaseExporter&, Options) const; bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;
size_t binary_size(BaseExporter& _be, Options _opt) const; size_t binary_size(BaseExporter& _be, Options _opt) const;
@@ -114,10 +114,10 @@ protected:
static const OMFormat::uchar magic_[3]; static const OMFormat::uchar magic_[3];
static const OMFormat::uint8 version_; static const OMFormat::uint8 version_;
bool write(const std::string&, BaseExporter&, Options) const; bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const;
bool write_binary(std::ostream&, BaseExporter&, Options) const; bool write_binary(std::ostream&, BaseExporter&, Options) const;
size_t store_binary_custom_chunk( std::ostream&, const BaseProperty&, size_t store_binary_custom_chunk( std::ostream&, const BaseProperty&,
OMFormat::Chunk::Entity, bool) const; OMFormat::Chunk::Entity, bool) const;

View File

@@ -78,7 +78,7 @@ _PLYWriter_::_PLYWriter_() { IOManager().register_module(this); }
bool bool
_PLYWriter_:: _PLYWriter_::
write(const std::string& _filename, BaseExporter& _be, Options _opt) const write(const std::string& _filename, BaseExporter& _be, Options _opt, std::streamsize _precision) const
{ {
// check exporter features // check exporter features
if ( !check( _be, _opt ) ) if ( !check( _be, _opt ) )
@@ -93,7 +93,7 @@ write(const std::string& _filename, BaseExporter& _be, Options _opt) const
_opt.unset(Options::FaceNormal); _opt.unset(Options::FaceNormal);
omerr() << "[PLYWriter] : Warning: Face normals are not supported and thus not exported! " << std::endl; omerr() << "[PLYWriter] : Warning: Face normals are not supported and thus not exported! " << std::endl;
} }
if ( _opt.check(Options::FaceColor) ) { if ( _opt.check(Options::FaceColor) ) {
// Face normals are not supported // Face normals are not supported
// Uncheck these options and output message that // Uncheck these options and output message that
@@ -115,6 +115,8 @@ write(const std::string& _filename, BaseExporter& _be, Options _opt) const
return false; return false;
} }
out.precision(_precision);
// write to file // write to file
bool result = (_opt.check(Options::Binary) ? bool result = (_opt.check(Options::Binary) ?
write_binary(out, _be, _opt) : write_binary(out, _be, _opt) :
@@ -130,7 +132,7 @@ write(const std::string& _filename, BaseExporter& _be, Options _opt) const
bool bool
_PLYWriter_:: _PLYWriter_::
write(std::ostream& _os, BaseExporter& _be, Options _opt) const write(std::ostream& _os, BaseExporter& _be, Options _opt, std::streamsize _precision) const
{ {
// check exporter features // check exporter features
if ( !check( _be, _opt ) ) if ( !check( _be, _opt ) )
@@ -143,7 +145,7 @@ write(std::ostream& _os, BaseExporter& _be, Options _opt) const
options_ = _opt; options_ = _opt;
if (!_os.good()) if (!_os.good())
{ {
omerr() << "[PLYWriter] : cannot write to stream " omerr() << "[PLYWriter] : cannot write to stream "
@@ -151,6 +153,8 @@ write(std::ostream& _os, BaseExporter& _be, Options _opt) const
return false; return false;
} }
_os.precision(_precision);
// write to file // write to file
bool result = (_opt.check(Options::Binary) ? bool result = (_opt.check(Options::Binary) ?
write_binary(_os, _be, _opt) : write_binary(_os, _be, _opt) :
@@ -396,7 +400,7 @@ write_binary(std::ostream& _out, BaseExporter& _be, Options _opt) const
_out << "property float32 x" << std::endl; _out << "property float32 x" << std::endl;
_out << "property float32 y" << std::endl; _out << "property float32 y" << std::endl;
_out << "property float32 z" << std::endl; _out << "property float32 z" << std::endl;
if ( _opt.vertex_has_normal() ){ if ( _opt.vertex_has_normal() ){
_out << "property float32 nx" << std::endl; _out << "property float32 nx" << std::endl;
_out << "property float32 ny" << std::endl; _out << "property float32 ny" << std::endl;

View File

@@ -4,10 +4,10 @@
* Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen * * Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen *
* www.openmesh.org * * www.openmesh.org *
* * * *
*---------------------------------------------------------------------------* *---------------------------------------------------------------------------*
* This file is part of OpenMesh. * * This file is part of OpenMesh. *
* * * *
* OpenMesh is free software: you can redistribute it and/or modify * * OpenMesh is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as * * it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of * * published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version with the * * the License, or (at your option) any later version with the *
@@ -30,10 +30,10 @@
* License along with OpenMesh. If not, * * License along with OpenMesh. If not, *
* see <http://www.gnu.org/licenses/>. * * see <http://www.gnu.org/licenses/>. *
* * * *
\*===========================================================================*/ \*===========================================================================*/
/*===========================================================================*\ /*===========================================================================*\
* * * *
* $Revision$ * * $Revision$ *
* $Date$ * * $Date$ *
* * * *
@@ -95,10 +95,10 @@ public:
std::string get_description() const { return "PLY polygon file format"; } std::string get_description() const { return "PLY polygon file format"; }
std::string get_extensions() const { return "ply"; } std::string get_extensions() const { return "ply"; }
bool write(const std::string&, BaseExporter&, Options) const; bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const;
bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;
bool write(std::ostream&, BaseExporter&, Options) const;
size_t binary_size(BaseExporter& _be, Options _opt) const; size_t binary_size(BaseExporter& _be, Options _opt) const;
enum ValueType { enum ValueType {

View File

@@ -79,7 +79,7 @@ _STLWriter_::_STLWriter_() { IOManager().register_module(this); }
bool bool
_STLWriter_:: _STLWriter_::
write(const std::string& _filename, BaseExporter& _be, Options _opt) const write(const std::string& _filename, BaseExporter& _be, Options _opt, std::streamsize _precision) const
{ {
// check exporter features // check exporter features
if (!check(_be, _opt)) return false; if (!check(_be, _opt)) return false;
@@ -118,7 +118,7 @@ write(const std::string& _filename, BaseExporter& _be, Options _opt) const
bool bool
_STLWriter_:: _STLWriter_::
write(std::ostream& _os, BaseExporter& _be, Options _opt) const write(std::ostream& _os, BaseExporter& _be, Options _opt, std::streamsize _precision) const
{ {
// check exporter features // check exporter features
if (!check(_be, _opt)) return false; if (!check(_be, _opt)) return false;
@@ -129,6 +129,8 @@ write(std::ostream& _os, BaseExporter& _be, Options _opt) const
_opt.check(Options::FaceColor)) _opt.check(Options::FaceColor))
return false; return false;
_os.precision(_precision);
if (_opt & Options::Binary) if (_opt & Options::Binary)
return write_stlb(_os, _be, _opt); return write_stlb(_os, _be, _opt);
else else
@@ -209,7 +211,7 @@ write_stla(const std::string& _filename, BaseExporter& _be, Options /* _opt */)
bool bool
_STLWriter_:: _STLWriter_::
write_stla(std::ostream& _out, BaseExporter& _be, Options /* _opt */) const write_stla(std::ostream& _out, BaseExporter& _be, Options /* _opt */, std::streamsize _precision) const
{ {
omlog() << "[STLWriter] : write ascii file\n"; omlog() << "[STLWriter] : write ascii file\n";
@@ -217,7 +219,7 @@ write_stla(std::ostream& _out, BaseExporter& _be, Options /* _opt */) const
Vec3f a, b, c, n; Vec3f a, b, c, n;
std::vector<VertexHandle> vhandles; std::vector<VertexHandle> vhandles;
FaceHandle fh; FaceHandle fh;
std::streamsize prec = _out.precision(); _out.precision(_precision);
// header // header
@@ -239,7 +241,6 @@ write_stla(std::ostream& _out, BaseExporter& _be, Options /* _opt */) const
_be.normal(fh) : _be.normal(fh) :
((c-b) % (a-b)).normalize()); ((c-b) % (a-b)).normalize());
_out.precision(prec);
_out << "facet normal " << n[0] << " " << n[1] << " " << n[2] << "\nouter loop\n"; _out << "facet normal " << n[0] << " " << n[1] << " " << n[2] << "\nouter loop\n";
_out.precision(10); _out.precision(10);
_out << "vertex " << a[0] << " " << a[1] << " " << a[2] << "\n"; _out << "vertex " << a[0] << " " << a[1] << " " << a[2] << "\n";
@@ -340,7 +341,7 @@ write_stlb(const std::string& _filename, BaseExporter& _be, Options /* _opt */)
bool bool
_STLWriter_:: _STLWriter_::
write_stlb(std::ostream& _out, BaseExporter& _be, Options /* _opt */) const write_stlb(std::ostream& _out, BaseExporter& _be, Options /* _opt */, std::streamsize _precision) const
{ {
omlog() << "[STLWriter] : write binary file\n"; omlog() << "[STLWriter] : write binary file\n";
@@ -349,6 +350,7 @@ write_stlb(std::ostream& _out, BaseExporter& _be, Options /* _opt */) const
Vec3f a, b, c, n; Vec3f a, b, c, n;
std::vector<VertexHandle> vhandles; std::vector<VertexHandle> vhandles;
FaceHandle fh; FaceHandle fh;
_out.precision(_precision);
// write header // write header

View File

@@ -93,17 +93,17 @@ public:
std::string get_description() const { return "Stereolithography Format"; } std::string get_description() const { return "Stereolithography Format"; }
std::string get_extensions() const { return "stla stlb"; } std::string get_extensions() const { return "stla stlb"; }
bool write(const std::string&, BaseExporter&, Options) const; bool write(const std::string&, BaseExporter&, Options, std::streamsize _precision = 6) const;
bool write(std::ostream&, BaseExporter&, Options) const; bool write(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;
size_t binary_size(BaseExporter&, Options) const; size_t binary_size(BaseExporter&, Options) const;
private: private:
bool write_stla(const std::string&, BaseExporter&, Options) const; bool write_stla(const std::string&, BaseExporter&, Options) const;
bool write_stla(std::ostream&, BaseExporter&, Options) const; bool write_stla(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;
bool write_stlb(const std::string&, BaseExporter&, Options) const; bool write_stlb(const std::string&, BaseExporter&, Options) const;
bool write_stlb(std::ostream&, BaseExporter&, Options) const; bool write_stlb(std::ostream&, BaseExporter&, Options, std::streamsize _precision = 6) const;
}; };