// Copyright (c) 2015-2020 GeometryFactory (France). All rights reserved. // // This file is part of CGAL (www.cgal.org) // // $URL$ // $Id$ // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial // // Author(s) : Andreas Fabri // Mael Rouxel-Labbé #ifndef CGAL_BGL_IO_OBJ_H #define CGAL_BGL_IO_OBJ_H #include #include #include #include #include #include #include #include #include #include #include #include #include namespace CGAL { //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// // Read namespace IO { namespace internal { // Use CRTP to gain access to the protected members without getters/setters. template class OBJ_builder : public Generic_facegraph_builder > { typedef OBJ_builder Self; typedef Generic_facegraph_builder Base; typedef typename Base::Point_container Point_container; typedef typename Base::Face Face; typedef typename Base::Face_container Face_container; public: OBJ_builder(std::istream& is) : Base(is) { } template bool read(std::istream& is, Point_container& points, Face_container& faces, const NamedParameters& np) { return read_OBJ(is, points, faces, np); } }; } // namespace internal /*! \ingroup PkgBGLIoFuncsOBJ \brief reads the graph `g` from the stream `in`, using the \ref IOStreamOBJ. The data is expected to represent a 2-manifold (possibly with borders). Ignores comment lines which start with a hash, and lines with whitespace. \attention The graph `g` is not cleared, and the data from the stream are appended. \tparam Graph a model of `MutableFaceGraph` \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" \param is the input stream \param g the graph to be built from the input data \param np optional \ref bgl_namedparameters "Named Parameters" described below \cgalNamedParamsBegin \cgalParamNBegin{vertex_point_map} \cgalParamDescription{a property map associating points to the vertices of `g`} \cgalParamType{a class model of `WritablePropertyMap` with `boost::graph_traits::%vertex_descriptor` as key type and `%Point_3` as value type} \cgalParamDefault{`boost::get(CGAL::vertex_point, g)`} \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` must be available in `Graph`.} \cgalParamNEnd \cgalParamNBegin{verbose} \cgalParamDescription{whether extra information is printed when an incident occurs during reading} \cgalParamType{Boolean} \cgalParamDefault{`false`} \cgalParamNEnd \cgalNamedParamsEnd \returns `true` if reading was successful and the resulting mesh is valid, `false` otherwise. \sa Overloads of this function for specific models of the concept `FaceGraph`. */ template bool read_OBJ(std::istream& is, Graph& g, const CGAL_NP_CLASS& np = parameters::default_values() #ifndef DOXYGEN_RUNNING , typename boost::disable_if >::type* = nullptr #endif ) { typedef typename CGAL::GetVertexPointMap::type VPM; typedef typename boost::property_traits::value_type Point; internal::OBJ_builder builder(is); return builder(g, np); } /*! \ingroup PkgBGLIoFuncsOBJ \brief reads the graph `g` from the file `fname`, using the \ref IOStreamOBJ. The data is expected to represent a 2-manifold (possibly with borders). Ignores comment lines which start with a hash, and lines with whitespace. \attention The graph `g` is not cleared, and the data from the file are appended. \tparam Graph a model of `MutableFaceGraph` \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" \param fname the name of the input file \param g the graph to be built from the input data \param np optional \ref bgl_namedparameters "Named Parameters" described below \cgalNamedParamsBegin \cgalParamNBegin{vertex_point_map} \cgalParamDescription{a property map associating points to the vertices of `g`} \cgalParamType{a class model of `WritablePropertyMap` with `boost::graph_traits::%vertex_descriptor` as key type and `%Point_3` as value type} \cgalParamDefault{`boost::get(CGAL::vertex_point, g)`} \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` must be available in `Graph`.} \cgalParamNEnd \cgalParamNBegin{verbose} \cgalParamDescription{whether extra information is printed when an incident occurs during reading} \cgalParamType{Boolean} \cgalParamDefault{`false`} \cgalParamNEnd \cgalNamedParamsEnd \returns `true` if reading was successful and the resulting mesh is valid, `false` otherwise. \sa Overloads of this function for specific models of the concept `FaceGraph`. */ template bool read_OBJ(const std::string& fname, Graph& g, const CGAL_NP_CLASS& np = parameters::default_values() #ifndef DOXYGEN_RUNNING , typename boost::disable_if >::type* = nullptr #endif ) { std::ifstream is(fname); CGAL::IO::set_mode(is, CGAL::IO::ASCII); return read_OBJ(is, g, np); } //////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// // Write /*! \ingroup PkgBGLIoFuncsOBJ \brief writes the graph `g` into the output stream, using the \ref IOStreamOBJ. \tparam Graph a model of `FaceListGraph` and `HalfedgeListGraph` \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" \param os the output stream \param g the graph to be written \param np optional \ref bgl_namedparameters "Named Parameters" described below \cgalNamedParamsBegin \cgalParamNBegin{vertex_point_map} \cgalParamDescription{a property map associating points to the vertices of `g`} \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` as key type and `%Point_3` as value type} \cgalParamDefault{`boost::get(CGAL::vertex_point, g)`} \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` must be available in `Graph`.} \cgalParamNEnd \cgalParamNBegin{stream_precision} \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} \cgalParamType{int} \cgalParamDefault{the precision of the stream `os`} \cgalParamNEnd \cgalNamedParamsEnd \returns `true` if writing was successful, `false` otherwise. \sa Overloads of this function for specific models of the concept `FaceGraph`. */ template bool write_OBJ(std::ostream& os, const Graph& g, const CGAL_NP_CLASS& np = parameters::default_values() #ifndef DOXYGEN_RUNNING , typename boost::disable_if >::type* = nullptr #endif ) { internal::Generic_facegraph_printer printer(os); return printer(g, np); } /*! \ingroup PkgBGLIoFuncsOBJ \brief writes the graph `g` into a file named `fname`, using the \ref IOStreamOBJ. \tparam Graph a model of `FaceListGraph` and `HalfedgeListGraph` \tparam NamedParameters a sequence of \ref bgl_namedparameters "Named Parameters" \param fname the output file \param g the graph to be written \param np optional \ref bgl_namedparameters "Named Parameters" described below \cgalNamedParamsBegin \cgalParamNBegin{vertex_point_map} \cgalParamDescription{a property map associating points to the vertices of `g`} \cgalParamType{a class model of `ReadablePropertyMap` with `boost::graph_traits::%vertex_descriptor` as key type and `%Point_3` as value type} \cgalParamDefault{`boost::get(CGAL::vertex_point, g)`} \cgalParamExtra{If this parameter is omitted, an internal property map for `CGAL::vertex_point_t` must be available in `Graph`.} \cgalParamNEnd \cgalParamNBegin{stream_precision} \cgalParamDescription{a parameter used to set the precision (i.e. how many digits are generated) of the output stream} \cgalParamType{int} \cgalParamDefault{`6`} \cgalParamNEnd \cgalNamedParamsEnd \returns `true` if writing was successful, `false` otherwise. \sa Overloads of this function for specific models of the concept `FaceGraph`. */ template bool write_OBJ(const std::string& fname, const Graph& g, const CGAL_NP_CLASS& np = parameters::default_values() #ifndef DOXYGEN_RUNNING , typename boost::disable_if >::type* = nullptr #endif ) { std::ofstream os(fname); CGAL::IO::set_mode(os, CGAL::IO::ASCII); return write_OBJ(os, g, np); } }} // namespace CGAL::IO #endif // CGAL_BGL_IO_OBJ_H