/*===========================================================================*\
* *
* OpenMesh *
* Copyright (C) 2001-2012 by Computer Graphics Group, RWTH Aachen *
* www.openmesh.org *
* *
*---------------------------------------------------------------------------*
* This file is part of OpenMesh. *
* *
* OpenMesh is free software: you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version with the *
* following exceptions: *
* *
* If other files instantiate templates or use macros *
* or inline functions from this file, or you compile this file and *
* link it with other files to produce an executable, this file does *
* not by itself cause the resulting executable to be covered by the *
* GNU Lesser General Public License. This exception does not however *
* invalidate any other reasons why the executable file might be *
* covered by the GNU Lesser General Public License. *
* *
* OpenMesh is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU LesserGeneral Public *
* License along with OpenMesh. If not, *
* see . *
* *
\*===========================================================================*/
/*===========================================================================*\
* *
* $Revision$ *
* $Date$ *
* *
\*===========================================================================*/
//== INCLUDES =================================================================
//STL
#include
// OpenMesh
#include
#include
#include
#include
#include
#include
//=== NAMESPACES ==============================================================
namespace OpenMesh {
namespace IO {
//=== INSTANCIATE =============================================================
_STLWriter_ __STLWriterInstance;
_STLWriter_& STLWriter() { return __STLWriterInstance; }
//=== IMPLEMENTATION ==========================================================
_STLWriter_::_STLWriter_() { IOManager().register_module(this); }
//-----------------------------------------------------------------------------
bool
_STLWriter_::
write(const std::string& _filename, BaseExporter& _be, Options _opt, std::streamsize _precision) const
{
// binary or ascii ?
if (_filename.rfind(".stla") != std::string::npos)
{
_opt -= Options::Binary;
}
else if (_filename.rfind(".stlb") != std::string::npos)
{
_opt += Options::Binary;
}
// open file
std::fstream out(_filename.c_str(), (_opt.check(Options::Binary) ? std::ios_base::binary | std::ios_base::out
: std::ios_base::out) );
bool result = write(out, _be, _opt, _precision);
out.close();
return result;
}
//-----------------------------------------------------------------------------
bool
_STLWriter_::
write(std::ostream& _os, BaseExporter& _be, Options _opt, std::streamsize _precision) const
{
// check exporter features
if (!check(_be, _opt)) return false;
// check writer features
if (_opt.check(Options::VertexNormal) ||
_opt.check(Options::VertexTexCoord) ||
_opt.check(Options::FaceColor))
return false;
if (!_opt.check(Options::Binary))
_os.precision(_precision);
if (_opt & Options::Binary)
return write_stlb(_os, _be, _opt);
else
return write_stla(_os, _be, _opt);
return false;
}
//-----------------------------------------------------------------------------
bool
_STLWriter_::
write_stla(const std::string& _filename, BaseExporter& _be, Options /* _opt */) const
{
omlog() << "[STLWriter] : write ascii file\n";
// open file
FILE* out = fopen(_filename.c_str(), "w");
if (!out)
{
omerr() << "[STLWriter] : cannot open file " << _filename << std::endl;
return false;
}
int i, nF(int(_be.n_faces())), nV;
Vec3f a, b, c, n;
std::vector vhandles;
FaceHandle fh;
// header
fprintf(out, "solid\n");
// write face set
for (i=0; i vhandles;
FaceHandle fh;
_out.precision(_precision);
// header
_out << "solid\n";
// write face set
for (i=0; i vhandles;
FaceHandle fh;
// write header
const char header[80] =
"binary stl file"
" ";
fwrite(header, 1, 80, out);
// number of faces
write_int( int(_be.n_faces()), out);
// write face set
for (i=0; i vhandles;
FaceHandle fh;
_out.precision(_precision);
// write header
const char header[80] =
"binary stl file"
" ";
_out.write(header, 80);
// number of faces
write_int(int(_be.n_faces()), _out);
// write face set
for (i=0; i vhandles;
for (i=0; i