mirror of https://github.com/CGAL/cgal
factorize implementation for PolyMesh_Array and TriMesh_Array
I removed add_face(VertexIterator, VertexIterator, FG) as it is not required by MutableFaceGraph and was the only function with a different implementation between the 2 classes
This commit is contained in:
parent
456222aa81
commit
86c1cfb65d
|
|
@ -0,0 +1,687 @@
|
|||
// Copyright (c) 2007 GeometryFactory (France). All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org); 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.
|
||||
//
|
||||
// Licensees holding a valid commercial license may use this file in
|
||||
// accordance with the commercial license agreement provided with the software.
|
||||
//
|
||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0+
|
||||
//
|
||||
//
|
||||
// Author(s) : Andreas Fabri, Philipp Moeller
|
||||
|
||||
// include this to avoid a VC15 warning
|
||||
#include <CGAL/boost/graph/named_function_params.h>
|
||||
|
||||
#include <boost/graph/graph_traits.hpp>
|
||||
#include <boost/graph/properties.hpp>
|
||||
|
||||
#include <boost/iterator/transform_iterator.hpp>
|
||||
|
||||
#include <OpenMesh/Core/IO/MeshIO.hh>
|
||||
#include <CGAL/boost/graph/internal/OM_iterator_from_circulator.h>
|
||||
#include <CGAL/boost/graph/iterator.h>
|
||||
#include <CGAL/Iterator_range.h>
|
||||
#include <CGAL/boost/graph/helpers.h>
|
||||
#include <CGAL/boost/graph/io.h>
|
||||
#include <CGAL/assertions.h>
|
||||
#include <CGAL/hash_openmesh.h>
|
||||
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable:4267)
|
||||
#endif
|
||||
|
||||
#ifndef OPEN_MESH_CLASS
|
||||
#error OPEN_MESH_CLASS is not defined
|
||||
#endif
|
||||
|
||||
// note only the classes in CGAL::internal below are protected by the macro,
|
||||
// the rest of the file is the shared implementation of graph_traits for
|
||||
// OpenMesh::PolyMesh_ArrayKernelT<K> and OpenMesh::TriMesh_ArrayKernelT<K>
|
||||
#ifndef CGAL_BOOST_GRAPH_TRAITS_GRAPH_TRAITS_OPENMESH_H
|
||||
#define CGAL_BOOST_GRAPH_TRAITS_GRAPH_TRAITS_OPENMESH_H
|
||||
namespace CGAL { namespace internal {
|
||||
|
||||
template <typename Halfedge_handle, typename OMeshEdge>
|
||||
struct Convert_omesh_edge
|
||||
{
|
||||
typedef OMesh_edge<Halfedge_handle> result_type;
|
||||
result_type operator()(const OMeshEdge& h) const {
|
||||
return result_type(Halfedge_handle(h.idx() * 2));
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Halfedge_handle>
|
||||
struct Construct_omesh_edge
|
||||
{
|
||||
typedef OMesh_edge<Halfedge_handle> result_type;
|
||||
template <typename T>
|
||||
result_type operator()(const T& h) const { return result_type(h); }
|
||||
};
|
||||
|
||||
template <typename Halfedge_handle>
|
||||
struct Construct_omesh_edge_opposite
|
||||
{
|
||||
typedef OMesh_edge<Halfedge_handle> result_type;
|
||||
template <typename T>
|
||||
result_type operator()(const T& h) const { return result_type(h).opposite_edge(); }
|
||||
};
|
||||
|
||||
|
||||
} // internal
|
||||
} // CGAL
|
||||
#endif //CGAL_BOOST_GRAPH_TRAITS_GRAPH_TRAITS_OPENMESH_H
|
||||
|
||||
namespace boost {
|
||||
|
||||
template <class K>
|
||||
struct graph_traits< OPEN_MESH_CLASS >
|
||||
{
|
||||
private:
|
||||
typedef OPEN_MESH_CLASS SM;
|
||||
|
||||
struct SM_graph_traversal_category : public virtual boost::bidirectional_graph_tag,
|
||||
public virtual boost::vertex_list_graph_tag,
|
||||
public virtual boost::edge_list_graph_tag
|
||||
{};
|
||||
|
||||
public:
|
||||
// Graph
|
||||
typedef typename SM::VertexHandle vertex_descriptor;
|
||||
typedef typename SM::Point vertex_property_type;
|
||||
typedef typename CGAL::internal::OMesh_edge<typename SM::HalfedgeHandle> edge_descriptor;
|
||||
typedef boost::undirected_tag directed_category;
|
||||
typedef boost::disallow_parallel_edge_tag edge_parallel_category;
|
||||
typedef SM_graph_traversal_category traversal_category;
|
||||
|
||||
// HalfedgeGraph
|
||||
typedef typename SM::HalfedgeHandle halfedge_descriptor;
|
||||
|
||||
// FaceGraph
|
||||
typedef typename SM::FaceHandle face_descriptor;
|
||||
|
||||
// VertexListGraph
|
||||
typedef typename SM::VertexIter vertex_iterator;
|
||||
typedef unsigned int vertices_size_type;
|
||||
// EdgeListGraph
|
||||
typedef boost::transform_iterator<
|
||||
CGAL::internal::Convert_omesh_edge<typename SM::HalfedgeHandle, typename SM::EdgeHandle>,
|
||||
typename SM::EdgeIter,
|
||||
edge_descriptor> edge_iterator;
|
||||
|
||||
typedef unsigned int edges_size_type;
|
||||
// HalfEdgeListGraph
|
||||
typedef typename SM::HalfedgeIter halfedge_iterator;
|
||||
typedef unsigned int halfedges_size_type;
|
||||
// FaceListGraph
|
||||
typedef typename SM::FaceIter face_iterator;
|
||||
typedef unsigned int faces_size_type;
|
||||
|
||||
// IncidenceGraph
|
||||
typedef unsigned int degree_size_type;
|
||||
|
||||
|
||||
typedef CGAL::In_edge_iterator<SM> in_edge_iterator;
|
||||
|
||||
typedef CGAL::Out_edge_iterator<SM> out_edge_iterator;
|
||||
|
||||
// nulls
|
||||
static vertex_descriptor null_vertex() { return vertex_descriptor(); }
|
||||
static face_descriptor null_face() { return face_descriptor(); }
|
||||
static halfedge_descriptor null_halfedge() { return halfedge_descriptor(); }
|
||||
};
|
||||
|
||||
template<typename K>
|
||||
struct graph_traits< const OPEN_MESH_CLASS >
|
||||
: public graph_traits< OPEN_MESH_CLASS >
|
||||
{ };
|
||||
|
||||
} // namespace boost
|
||||
|
||||
namespace OpenMesh {
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::vertices_size_type
|
||||
num_vertices(const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.n_vertices();
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::edges_size_type
|
||||
num_edges(const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.n_edges();
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::degree_size_type
|
||||
degree(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.valence(v);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::degree_size_type
|
||||
degree(typename boost::graph_traits<OPEN_MESH_CLASS >::face_descriptor f,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.valence(f);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::degree_size_type
|
||||
out_degree(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.valence(v);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::degree_size_type
|
||||
in_degree(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.valence(v);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor
|
||||
source(typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor e,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.from_vertex_handle(e.halfedge());
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor
|
||||
source(typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.from_vertex_handle(h);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor
|
||||
target(typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor e,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.to_vertex_handle(e.halfedge());
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor
|
||||
target(typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.to_vertex_handle(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_iterator>
|
||||
vertices(const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return CGAL::make_range(sm.vertices_sbegin(), sm.vertices_end());
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OPEN_MESH_CLASS >::edge_iterator>
|
||||
edges(const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
typedef typename boost::graph_traits<OPEN_MESH_CLASS >::edge_iterator iterator;
|
||||
iterator beg(sm.edges_sbegin());
|
||||
iterator end(sm.edges_end());
|
||||
return CGAL::make_range(beg,end);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OPEN_MESH_CLASS >::in_edge_iterator>
|
||||
in_edges(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
typedef typename boost::graph_traits<OPEN_MESH_CLASS >::in_edge_iterator Iter;
|
||||
|
||||
return CGAL::make_range(Iter(halfedge(v,sm),sm), Iter(halfedge(v,sm),sm,1));
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OPEN_MESH_CLASS >::out_edge_iterator>
|
||||
out_edges(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
typedef typename boost::graph_traits<OPEN_MESH_CLASS >::out_edge_iterator Iter;
|
||||
return CGAL::make_range(Iter(halfedge(v,sm),sm), Iter(halfedge(v,sm),sm,1));
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
std::pair<typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor,
|
||||
bool>
|
||||
edge(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor u,
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v,
|
||||
const OPEN_MESH_CLASS& sm) {
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor
|
||||
he(sm.find_halfedge(u, v));
|
||||
return std::make_pair(he, he.is_valid());
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// HalfedgeGraph
|
||||
//
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor
|
||||
next(typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.next_halfedge_handle(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor
|
||||
prev(typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.prev_halfedge_handle(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor
|
||||
opposite(typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.opposite_halfedge_handle(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor
|
||||
edge(typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h,
|
||||
const OPEN_MESH_CLASS& /*sm*/)
|
||||
{
|
||||
return typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor
|
||||
halfedge(typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor e,
|
||||
const OPEN_MESH_CLASS&)
|
||||
{
|
||||
return e.halfedge();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor
|
||||
halfedge(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
if(sm.halfedge_handle(v) == boost::graph_traits<OPEN_MESH_CLASS >::null_halfedge()){
|
||||
return boost::graph_traits<OPEN_MESH_CLASS >::null_halfedge();
|
||||
}
|
||||
// prev because OpenMesh stores out-going halfedges
|
||||
// return sm.prev_halfedge_handle(sm.halfedge_handle(v));
|
||||
return sm.opposite_halfedge_handle(sm.halfedge_handle(v));
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
std::pair<
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor,
|
||||
bool
|
||||
>
|
||||
halfedge(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor u,
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h = sm.find_halfedge(u, v);
|
||||
return std::make_pair(h, h.is_valid());
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// HalfedgeListGraph
|
||||
//
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_iterator>
|
||||
halfedges(const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return CGAL::make_range(sm.halfedges_sbegin(), sm.halfedges_end());
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::halfedges_size_type
|
||||
num_halfedges(const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.n_halfedges();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// MutableHalfedgeGraph
|
||||
//
|
||||
template<typename K>
|
||||
void
|
||||
set_next(typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h1,
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h2,
|
||||
OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
sm.set_next_halfedge_handle(h1, h2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
set_target(typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h,
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v,
|
||||
OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
sm.set_vertex_handle(h, v);
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
set_halfedge(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v,
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h,
|
||||
OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
sm.set_halfedge_handle(v, sm.opposite_halfedge_handle(h));
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
adjust_border_halfedge(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v,
|
||||
OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
sm.adjust_outgoing_halfedge(v);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
garbage_collection(OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
sm.garbage_collection();
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor
|
||||
add_edge(OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return edge(sm.new_edge(boost::graph_traits<OPEN_MESH_CLASS >::null_vertex(),
|
||||
boost::graph_traits<OPEN_MESH_CLASS >::null_vertex() ), sm);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// FaceGraph
|
||||
//
|
||||
template<typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor
|
||||
halfedge(typename boost::graph_traits<OPEN_MESH_CLASS >::face_descriptor f,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.halfedge_handle(f);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::face_descriptor
|
||||
face(typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h,
|
||||
const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.face_handle(h);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// MutableFaceGraph
|
||||
//
|
||||
template<typename K>
|
||||
void
|
||||
set_face(typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h,
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::face_descriptor f,
|
||||
OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
sm.set_face_handle(h, f);
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
set_halfedge(typename boost::graph_traits<OPEN_MESH_CLASS >::face_descriptor f,
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor h,
|
||||
OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
sm.set_halfedge_handle(f, h);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
reserve(OPEN_MESH_CLASS& tm,
|
||||
typename boost::graph_traits< OPEN_MESH_CLASS >::vertices_size_type nv,
|
||||
typename boost::graph_traits< OPEN_MESH_CLASS >::edges_size_type ne,
|
||||
typename boost::graph_traits< OPEN_MESH_CLASS >::faces_size_type nf)
|
||||
{
|
||||
tm.reserve(nv, ne, nf);
|
||||
}
|
||||
|
||||
//
|
||||
// FaceListGraph
|
||||
//
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::faces_size_type
|
||||
num_faces(const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.n_faces();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OPEN_MESH_CLASS >::face_iterator>
|
||||
faces(const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return CGAL::make_range(sm.faces_sbegin(), sm.faces_end());
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor
|
||||
add_vertex(OPEN_MESH_CLASS& sm) {
|
||||
return sm.new_vertex();
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
// MutableGraph
|
||||
// add a vertex with a default constructed property
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor
|
||||
add_vertex(OPEN_MESH_CLASS& sm) {
|
||||
return sm.add_vertex(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_property_type());
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor
|
||||
add_vertex(const typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_property_type& p, OPEN_MESH_CLASS& sm) {
|
||||
return sm.add_vertex(p);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
clear_vertex(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor,
|
||||
OPEN_MESH_CLASS&) {
|
||||
CGAL_assert(false);
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
remove_vertex(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v,
|
||||
OPEN_MESH_CLASS& sm) {
|
||||
|
||||
sm.request_face_status();
|
||||
sm.request_vertex_status();
|
||||
sm.request_halfedge_status();
|
||||
sm.set_halfedge_handle(v, typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor());
|
||||
sm.status(v).set_deleted(true);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
remove_edge(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor u,
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v,
|
||||
OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor e = edge(u, v, sm);
|
||||
remove_edge(e,sm);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
remove_edge(typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor e,
|
||||
OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
sm.request_face_status();
|
||||
sm.request_vertex_status();
|
||||
sm.request_halfedge_status();
|
||||
sm.request_edge_status();
|
||||
|
||||
typedef typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor halfedge_descriptor;
|
||||
|
||||
halfedge_descriptor h1 = halfedge(e,sm);
|
||||
halfedge_descriptor h2 = opposite(halfedge(e,sm),sm);
|
||||
sm.status(sm.edge_handle(h1)).set_deleted(true);
|
||||
sm.status(h1).set_deleted(true);
|
||||
sm.status(h2).set_deleted(true);
|
||||
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
remove_edge(typename boost::graph_traits<OPEN_MESH_CLASS >::edge_iterator eiter,
|
||||
OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
remove_edge(*eiter, sm);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
remove_face(typename boost::graph_traits<OPEN_MESH_CLASS >::face_descriptor f,
|
||||
OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
|
||||
sm.request_face_status();
|
||||
sm.request_vertex_status();
|
||||
sm.request_halfedge_status();
|
||||
|
||||
set_halfedge(f, typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor(), sm);
|
||||
sm.status(f).set_deleted(true);
|
||||
}
|
||||
|
||||
#if 0 // conflits with function in Euler_operations.h
|
||||
template<typename K>
|
||||
std::pair<typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor,
|
||||
bool>
|
||||
add_edge(typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v1,
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor v2,
|
||||
OPEN_MESH_CLASS& sm) {
|
||||
|
||||
return sm.new_edge(v1, v2);
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename K>
|
||||
typename boost::graph_traits<OPEN_MESH_CLASS >::face_descriptor
|
||||
add_face(OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return sm.new_face();
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
bool is_valid(OPEN_MESH_CLASS& sm, bool /* verbose */ = false)
|
||||
{
|
||||
return CGAL::is_valid_polygon_mesh(sm);
|
||||
}
|
||||
|
||||
} // namespace OpenMesh
|
||||
|
||||
namespace CGAL {
|
||||
|
||||
// Overload CGAL::clear function. PolyMesh_ArrayKernel behaves
|
||||
// differently from other meshes. Calling clear does not affect the
|
||||
// number of vertices, edges, or faces in the mesh. To get actual
|
||||
// numbers it is necessary to first collect garbage. We add an
|
||||
// overlaod to get consistent behavior.
|
||||
template<typename K>
|
||||
void clear(OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
sm.clear();
|
||||
sm.garbage_collection(true, true, true);
|
||||
CGAL_postcondition(num_edges(sm) == 0);
|
||||
CGAL_postcondition(num_vertices(sm) == 0);
|
||||
CGAL_postcondition(num_faces(sm) == 0);
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
bool read_off(std::istream& is, OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
OpenMesh::IO::Options ropt;
|
||||
return OpenMesh::IO::read_mesh(sm, is, ".OFF", ropt, false);
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
bool write_off(std::ostream& os, OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
return OpenMesh::IO::write_mesh(sm, os, ".OFF");
|
||||
}
|
||||
|
||||
}
|
||||
#ifndef CGAL_NO_DEPRECATED_CODE
|
||||
#include <CGAL/boost/graph/backward_compatibility_functions.h>
|
||||
|
||||
namespace boost {
|
||||
// The following functions were defined in the namespace boost
|
||||
using OpenMesh::vertices;
|
||||
using OpenMesh::edges;
|
||||
using OpenMesh::num_vertices;
|
||||
using OpenMesh::num_edges;
|
||||
using OpenMesh::out_edges;
|
||||
using OpenMesh::in_edges;
|
||||
using OpenMesh::target;
|
||||
using OpenMesh::source;
|
||||
} // namespace boost
|
||||
#endif //CGAL_NO_DEPRECATED_CODE
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
|
||||
#undef OPEN_MESH_CLASS
|
||||
|
|
@ -14,682 +14,18 @@
|
|||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0+
|
||||
//
|
||||
//
|
||||
// Author(s) : Andreas Fabri, Philipp Moeller
|
||||
|
||||
#ifndef CGAL_BOOST_GRAPH_GRAPH_TRAITS_POLYMESH_ARRAYKERNELT_H
|
||||
#define CGAL_BOOST_GRAPH_GRAPH_TRAITS_POLYMESH_ARRAYKERNELT_H
|
||||
|
||||
// include this to avoid a VC15 warning
|
||||
#include <CGAL/boost/graph/named_function_params.h>
|
||||
|
||||
#include <boost/graph/graph_traits.hpp>
|
||||
#include <boost/graph/properties.hpp>
|
||||
|
||||
#include <boost/iterator/transform_iterator.hpp>
|
||||
|
||||
#include <OpenMesh/Core/IO/MeshIO.hh>
|
||||
|
||||
#include <CGAL/boost/graph/properties_PolyMesh_ArrayKernelT.h>
|
||||
#include <CGAL/boost/graph/internal/OM_iterator_from_circulator.h>
|
||||
#include <CGAL/boost/graph/iterator.h>
|
||||
#include <CGAL/Iterator_range.h>
|
||||
#include <CGAL/boost/graph/helpers.h>
|
||||
#include <CGAL/boost/graph/io.h>
|
||||
#include <CGAL/assertions.h>
|
||||
|
||||
#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
|
||||
|
||||
#include <CGAL/hash_openmesh.h>
|
||||
|
||||
// http://openmesh.org/Documentation/OpenMesh-Doc-Latest/classOpenMesh_1_1Concepts_1_1KernelT.html
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable:4267)
|
||||
#endif
|
||||
namespace CGAL { namespace internal {
|
||||
#include <CGAL/boost/graph/properties_PolyMesh_ArrayKernelT.h>
|
||||
#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
|
||||
|
||||
template <typename Halfedge_handle, typename OMeshEdge>
|
||||
struct Convert_omesh_edge
|
||||
{
|
||||
typedef OMesh_edge<Halfedge_handle> result_type;
|
||||
result_type operator()(const OMeshEdge& h) const {
|
||||
return result_type(Halfedge_handle(h.idx() * 2));
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Halfedge_handle>
|
||||
struct Construct_omesh_edge
|
||||
{
|
||||
typedef OMesh_edge<Halfedge_handle> result_type;
|
||||
template <typename T>
|
||||
result_type operator()(const T& h) const { return result_type(h); }
|
||||
};
|
||||
|
||||
template <typename Halfedge_handle>
|
||||
struct Construct_omesh_edge_opposite
|
||||
{
|
||||
typedef OMesh_edge<Halfedge_handle> result_type;
|
||||
template <typename T>
|
||||
result_type operator()(const T& h) const { return result_type(h).opposite_edge(); }
|
||||
};
|
||||
|
||||
|
||||
} // internal
|
||||
} // CGAL
|
||||
|
||||
|
||||
namespace boost {
|
||||
|
||||
template <class K>
|
||||
struct graph_traits< OpenMesh::PolyMesh_ArrayKernelT<K> >
|
||||
{
|
||||
private:
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> SM;
|
||||
|
||||
struct SM_graph_traversal_category : public virtual boost::bidirectional_graph_tag,
|
||||
public virtual boost::vertex_list_graph_tag,
|
||||
public virtual boost::edge_list_graph_tag
|
||||
{};
|
||||
|
||||
public:
|
||||
// Graph
|
||||
typedef typename SM::VertexHandle vertex_descriptor;
|
||||
typedef typename SM::Point vertex_property_type;
|
||||
typedef typename CGAL::internal::OMesh_edge<typename SM::HalfedgeHandle> edge_descriptor;
|
||||
typedef boost::undirected_tag directed_category;
|
||||
typedef boost::disallow_parallel_edge_tag edge_parallel_category;
|
||||
typedef SM_graph_traversal_category traversal_category;
|
||||
|
||||
// HalfedgeGraph
|
||||
typedef typename SM::HalfedgeHandle halfedge_descriptor;
|
||||
|
||||
// FaceGraph
|
||||
typedef typename SM::FaceHandle face_descriptor;
|
||||
|
||||
// VertexListGraph
|
||||
typedef typename SM::VertexIter vertex_iterator;
|
||||
typedef unsigned int vertices_size_type;
|
||||
// EdgeListGraph
|
||||
typedef boost::transform_iterator<
|
||||
CGAL::internal::Convert_omesh_edge<typename SM::HalfedgeHandle, typename SM::EdgeHandle>,
|
||||
typename SM::EdgeIter,
|
||||
edge_descriptor> edge_iterator;
|
||||
|
||||
typedef unsigned int edges_size_type;
|
||||
// HalfEdgeListGraph
|
||||
typedef typename SM::HalfedgeIter halfedge_iterator;
|
||||
typedef unsigned int halfedges_size_type;
|
||||
// FaceListGraph
|
||||
typedef typename SM::FaceIter face_iterator;
|
||||
typedef unsigned int faces_size_type;
|
||||
|
||||
// IncidenceGraph
|
||||
typedef unsigned int degree_size_type;
|
||||
|
||||
|
||||
typedef CGAL::In_edge_iterator<SM> in_edge_iterator;
|
||||
|
||||
typedef CGAL::Out_edge_iterator<SM> out_edge_iterator;
|
||||
|
||||
// nulls
|
||||
static vertex_descriptor null_vertex() { return vertex_descriptor(); }
|
||||
static face_descriptor null_face() { return face_descriptor(); }
|
||||
static halfedge_descriptor null_halfedge() { return halfedge_descriptor(); }
|
||||
};
|
||||
|
||||
template<typename K>
|
||||
struct graph_traits< const OpenMesh::PolyMesh_ArrayKernelT<K> >
|
||||
: public graph_traits< OpenMesh::PolyMesh_ArrayKernelT<K> >
|
||||
{ };
|
||||
|
||||
} // namespace boost
|
||||
|
||||
namespace OpenMesh {
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertices_size_type
|
||||
num_vertices(const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.n_vertices();
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edges_size_type
|
||||
num_edges(const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.n_edges();
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::degree_size_type
|
||||
degree(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.valence(v);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::degree_size_type
|
||||
degree(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::face_descriptor f,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.valence(f);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::degree_size_type
|
||||
out_degree(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.valence(v);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::degree_size_type
|
||||
in_degree(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.valence(v);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
source(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor e,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.from_vertex_handle(e.halfedge());
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
source(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.from_vertex_handle(h);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
target(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor e,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.to_vertex_handle(e.halfedge());
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
target(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.to_vertex_handle(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_iterator>
|
||||
vertices(const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return CGAL::make_range(sm.vertices_sbegin(), sm.vertices_end());
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_iterator>
|
||||
edges(const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
typedef typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_iterator iterator;
|
||||
iterator beg(sm.edges_sbegin());
|
||||
iterator end(sm.edges_end());
|
||||
return CGAL::make_range(beg,end);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::in_edge_iterator>
|
||||
in_edges(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
typedef typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::in_edge_iterator Iter;
|
||||
|
||||
return CGAL::make_range(Iter(halfedge(v,sm),sm), Iter(halfedge(v,sm),sm,1));
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::out_edge_iterator>
|
||||
out_edges(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
typedef typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::out_edge_iterator Iter;
|
||||
return CGAL::make_range(Iter(halfedge(v,sm),sm), Iter(halfedge(v,sm),sm,1));
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
std::pair<typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor,
|
||||
bool>
|
||||
edge(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor u,
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm) {
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor
|
||||
he(sm.find_halfedge(u, v));
|
||||
return std::make_pair(he, he.is_valid());
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// HalfedgeGraph
|
||||
//
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor
|
||||
next(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.next_halfedge_handle(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor
|
||||
prev(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.prev_halfedge_handle(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor
|
||||
opposite(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.opposite_halfedge_handle(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor
|
||||
edge(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& /*sm*/)
|
||||
{
|
||||
return typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor
|
||||
halfedge(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor e,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>&)
|
||||
{
|
||||
return e.halfedge();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor
|
||||
halfedge(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
if(sm.halfedge_handle(v) == boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::null_halfedge()){
|
||||
return boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::null_halfedge();
|
||||
}
|
||||
// prev because OpenMesh stores out-going halfedges
|
||||
// return sm.prev_halfedge_handle(sm.halfedge_handle(v));
|
||||
return sm.opposite_halfedge_handle(sm.halfedge_handle(v));
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
std::pair<
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor,
|
||||
bool
|
||||
>
|
||||
halfedge(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor u,
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h = sm.find_halfedge(u, v);
|
||||
return std::make_pair(h, h.is_valid());
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// HalfedgeListGraph
|
||||
//
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_iterator>
|
||||
halfedges(const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return CGAL::make_range(sm.halfedges_sbegin(), sm.halfedges_end());
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedges_size_type
|
||||
num_halfedges(const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.n_halfedges();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// MutableHalfedgeGraph
|
||||
//
|
||||
template<typename K>
|
||||
void
|
||||
set_next(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h1,
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h2,
|
||||
OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.set_next_halfedge_handle(h1, h2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
set_target(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.set_vertex_handle(h, v);
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
set_halfedge(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.set_halfedge_handle(v, sm.opposite_halfedge_handle(h));
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
adjust_border_halfedge(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.adjust_outgoing_halfedge(v);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
garbage_collection(OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.garbage_collection();
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor
|
||||
add_edge(OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return edge(sm.new_edge(boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::null_vertex(),
|
||||
boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::null_vertex() ), sm);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// FaceGraph
|
||||
//
|
||||
template<typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor
|
||||
halfedge(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::face_descriptor f,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.halfedge_handle(f);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::face_descriptor
|
||||
face(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.face_handle(h);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// MutableFaceGraph
|
||||
//
|
||||
template<typename K>
|
||||
void
|
||||
set_face(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::face_descriptor f,
|
||||
OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.set_face_handle(h, f);
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
set_halfedge(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::face_descriptor f,
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.set_halfedge_handle(f, h);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
reserve(OpenMesh::PolyMesh_ArrayKernelT<K>& tm,
|
||||
typename boost::graph_traits< OpenMesh::PolyMesh_ArrayKernelT<K> >::vertices_size_type nv,
|
||||
typename boost::graph_traits< OpenMesh::PolyMesh_ArrayKernelT<K> >::edges_size_type ne,
|
||||
typename boost::graph_traits< OpenMesh::PolyMesh_ArrayKernelT<K> >::faces_size_type nf)
|
||||
{
|
||||
tm.reserve(nv, ne, nf);
|
||||
}
|
||||
|
||||
//
|
||||
// FaceListGraph
|
||||
//
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::faces_size_type
|
||||
num_faces(const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.n_faces();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::face_iterator>
|
||||
faces(const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return CGAL::make_range(sm.faces_sbegin(), sm.faces_end());
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
add_vertex(OpenMesh::PolyMesh_ArrayKernelT<K>& sm) {
|
||||
return sm.new_vertex();
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
// MutableGraph
|
||||
// add a vertex with a default constructed property
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
add_vertex(OpenMesh::PolyMesh_ArrayKernelT<K>& sm) {
|
||||
return sm.add_vertex(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_property_type());
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
add_vertex(const typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_property_type& p, OpenMesh::PolyMesh_ArrayKernelT<K>& sm) {
|
||||
return sm.add_vertex(p);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
clear_vertex(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor,
|
||||
OpenMesh::PolyMesh_ArrayKernelT<K>&) {
|
||||
CGAL_assert(false);
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
remove_vertex(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
OpenMesh::PolyMesh_ArrayKernelT<K>& sm) {
|
||||
|
||||
sm.request_face_status();
|
||||
sm.request_vertex_status();
|
||||
sm.request_halfedge_status();
|
||||
sm.set_halfedge_handle(v, typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor());
|
||||
sm.status(v).set_deleted(true);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
remove_edge(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor u,
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor e = edge(u, v, sm);
|
||||
remove_edge(e,sm);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
remove_edge(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor e,
|
||||
OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.request_face_status();
|
||||
sm.request_vertex_status();
|
||||
sm.request_halfedge_status();
|
||||
sm.request_edge_status();
|
||||
|
||||
typedef typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor halfedge_descriptor;
|
||||
|
||||
halfedge_descriptor h1 = halfedge(e,sm);
|
||||
halfedge_descriptor h2 = opposite(halfedge(e,sm),sm);
|
||||
sm.status(sm.edge_handle(h1)).set_deleted(true);
|
||||
sm.status(h1).set_deleted(true);
|
||||
sm.status(h2).set_deleted(true);
|
||||
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
remove_edge(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_iterator eiter,
|
||||
OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
remove_edge(*eiter, sm);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
remove_face(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::face_descriptor f,
|
||||
OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
|
||||
sm.request_face_status();
|
||||
sm.request_vertex_status();
|
||||
sm.request_halfedge_status();
|
||||
|
||||
set_halfedge(f, typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor(), sm);
|
||||
sm.status(f).set_deleted(true);
|
||||
}
|
||||
|
||||
#if 0 // conflits with function in Euler_operations.h
|
||||
template<typename K>
|
||||
std::pair<typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor,
|
||||
bool>
|
||||
add_edge(typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v1,
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor v2,
|
||||
OpenMesh::PolyMesh_ArrayKernelT<K>& sm) {
|
||||
|
||||
return sm.new_edge(v1, v2);
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename K>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::face_descriptor
|
||||
add_face(OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.new_face();
|
||||
}
|
||||
|
||||
template<typename K, typename InputIterator>
|
||||
typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::face_descriptor
|
||||
add_face(InputIterator begin, InputIterator end, OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
std::vector<typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor>
|
||||
v(begin, end);
|
||||
return sm.add_face(v);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
bool is_valid(OpenMesh::PolyMesh_ArrayKernelT<K>& sm, bool /* verbose */ = false)
|
||||
{
|
||||
return CGAL::is_valid_polygon_mesh(sm);
|
||||
}
|
||||
|
||||
} // namespace OpenMesh
|
||||
|
||||
namespace CGAL {
|
||||
|
||||
// Overload CGAL::clear function. PolyMesh_ArrayKernel behaves
|
||||
// differently from other meshes. Calling clear does not affect the
|
||||
// number of vertices, edges, or faces in the mesh. To get actual
|
||||
// numbers it is necessary to first collect garbage. We add an
|
||||
// overlaod to get consistent behavior.
|
||||
template<typename K>
|
||||
void clear(OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.clear();
|
||||
sm.garbage_collection(true, true, true);
|
||||
CGAL_postcondition(num_edges(sm) == 0);
|
||||
CGAL_postcondition(num_vertices(sm) == 0);
|
||||
CGAL_postcondition(num_faces(sm) == 0);
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
bool read_off(std::istream& is, OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
OpenMesh::IO::Options ropt;
|
||||
return OpenMesh::IO::read_mesh(sm, is, ".OFF", ropt, false);
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
bool write_off(std::ostream& os, OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return OpenMesh::IO::write_mesh(sm, os, ".OFF");
|
||||
}
|
||||
|
||||
}
|
||||
#ifndef CGAL_NO_DEPRECATED_CODE
|
||||
#include <CGAL/boost/graph/backward_compatibility_functions.h>
|
||||
|
||||
namespace boost {
|
||||
// The following functions were defined in the namespace boost
|
||||
using OpenMesh::vertices;
|
||||
using OpenMesh::edges;
|
||||
using OpenMesh::num_vertices;
|
||||
using OpenMesh::num_edges;
|
||||
using OpenMesh::out_edges;
|
||||
using OpenMesh::in_edges;
|
||||
using OpenMesh::target;
|
||||
using OpenMesh::source;
|
||||
} // namespace boost
|
||||
#endif //CGAL_NO_DEPRECATED_CODE
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
#define OPEN_MESH_CLASS OpenMesh::PolyMesh_ArrayKernelT<K>
|
||||
#include <CGAL/boost/graph/graph_traits_OpenMesh.h>
|
||||
|
||||
#endif // CGAL_BOOST_GRAPH_TRAITS_POLYMESH_ARRAYKERNELT_H
|
||||
|
|
|
|||
|
|
@ -14,658 +14,18 @@
|
|||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0+
|
||||
//
|
||||
//
|
||||
// Author(s) : Andreas Fabri, Philipp Moeller
|
||||
|
||||
#ifndef CGAL_BOOST_GRAPH_GRAPH_TRAITS_TRIMESH_ARRAYKERNELT_H
|
||||
#define CGAL_BOOST_GRAPH_GRAPH_TRAITS_TRIMESH_ARRAYKERNELT_H
|
||||
|
||||
#include <boost/graph/graph_traits.hpp>
|
||||
#include <boost/graph/properties.hpp>
|
||||
|
||||
#include <boost/iterator/transform_iterator.hpp>
|
||||
|
||||
#include <OpenMesh/Core/IO/MeshIO.hh>
|
||||
|
||||
#include <CGAL/boost/graph/properties_TriMesh_ArrayKernelT.h>
|
||||
#include <CGAL/boost/graph/graph_traits_PolyMesh_ArrayKernelT.h>
|
||||
#include <CGAL/boost/graph/internal/OM_iterator_from_circulator.h>
|
||||
#include <CGAL/boost/graph/iterator.h>
|
||||
#include <CGAL/Iterator_range.h>
|
||||
#include <CGAL/boost/graph/helpers.h>
|
||||
#include <CGAL/boost/graph/io.h>
|
||||
#include <CGAL/assertions.h>
|
||||
|
||||
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
|
||||
|
||||
#include <CGAL/hash_openmesh.h>
|
||||
|
||||
// http://openmesh.org/Documentation/OpenMesh-Doc-Latest/classOpenMesh_1_1Concepts_1_1KernelT.html
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable:4267)
|
||||
#endif
|
||||
#include <CGAL/boost/graph/properties_TriMesh_ArrayKernelT.h>
|
||||
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
|
||||
|
||||
namespace boost {
|
||||
|
||||
template <class K>
|
||||
struct graph_traits< OpenMesh::TriMesh_ArrayKernelT<K> >
|
||||
{
|
||||
private:
|
||||
typedef OpenMesh::TriMesh_ArrayKernelT<K> SM;
|
||||
|
||||
struct SM_graph_traversal_category : public virtual boost::bidirectional_graph_tag,
|
||||
public virtual boost::vertex_list_graph_tag,
|
||||
public virtual boost::edge_list_graph_tag
|
||||
{};
|
||||
|
||||
public:
|
||||
// Graph
|
||||
typedef typename SM::VertexHandle vertex_descriptor;
|
||||
typedef typename SM::Point vertex_property_type;
|
||||
typedef typename CGAL::internal::OMesh_edge<typename SM::HalfedgeHandle> edge_descriptor;
|
||||
typedef boost::undirected_tag directed_category;
|
||||
typedef boost::disallow_parallel_edge_tag edge_parallel_category;
|
||||
typedef SM_graph_traversal_category traversal_category;
|
||||
|
||||
// HalfedgeGraph
|
||||
typedef typename SM::HalfedgeHandle halfedge_descriptor;
|
||||
|
||||
// FaceGraph
|
||||
typedef typename SM::FaceHandle face_descriptor;
|
||||
|
||||
// VertexListGraph
|
||||
typedef typename SM::VertexIter vertex_iterator;
|
||||
typedef unsigned int vertices_size_type;
|
||||
// EdgeListGraph
|
||||
typedef boost::transform_iterator<
|
||||
CGAL::internal::Convert_omesh_edge<typename SM::HalfedgeHandle, typename SM::EdgeHandle>,
|
||||
typename SM::EdgeIter,
|
||||
edge_descriptor> edge_iterator;
|
||||
|
||||
typedef unsigned int edges_size_type;
|
||||
// HalfEdgeListGraph
|
||||
typedef typename SM::HalfedgeIter halfedge_iterator;
|
||||
typedef unsigned int halfedges_size_type;
|
||||
// FaceListGraph
|
||||
typedef typename SM::FaceIter face_iterator;
|
||||
typedef unsigned int faces_size_type;
|
||||
|
||||
// IncidenceGraph
|
||||
typedef unsigned int degree_size_type;
|
||||
|
||||
|
||||
typedef CGAL::In_edge_iterator<SM> in_edge_iterator;
|
||||
|
||||
typedef CGAL::Out_edge_iterator<SM> out_edge_iterator;
|
||||
|
||||
// nulls
|
||||
static vertex_descriptor null_vertex() { return vertex_descriptor(); }
|
||||
static face_descriptor null_face() { return face_descriptor(); }
|
||||
static halfedge_descriptor null_halfedge() { return halfedge_descriptor(); }
|
||||
};
|
||||
|
||||
template<typename K>
|
||||
struct graph_traits< const OpenMesh::TriMesh_ArrayKernelT<K> >
|
||||
: public graph_traits< OpenMesh::TriMesh_ArrayKernelT<K> >
|
||||
{ };
|
||||
|
||||
} // namespace boost
|
||||
|
||||
namespace OpenMesh {
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertices_size_type
|
||||
num_vertices(const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.n_vertices();
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edges_size_type
|
||||
num_edges(const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.n_edges();
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::degree_size_type
|
||||
degree(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.valence(v);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::degree_size_type
|
||||
degree(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::face_descriptor,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& )
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::degree_size_type
|
||||
out_degree(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.valence(v);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::degree_size_type
|
||||
in_degree(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.valence(v);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
source(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor e,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.from_vertex_handle(e.halfedge());
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
source(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.from_vertex_handle(h);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
target(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor e,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.to_vertex_handle(e.halfedge());
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
target(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.to_vertex_handle(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_iterator>
|
||||
vertices(const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return CGAL::make_range(sm.vertices_sbegin(), sm.vertices_end());
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_iterator>
|
||||
edges(const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
typedef typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_iterator iterator;
|
||||
iterator beg(sm.edges_sbegin());
|
||||
iterator end(sm.edges_end());
|
||||
return CGAL::make_range(beg,end);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::in_edge_iterator>
|
||||
in_edges(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
typedef typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::in_edge_iterator Iter;
|
||||
|
||||
return CGAL::make_range(Iter(halfedge(v,sm),sm), Iter(halfedge(v,sm),sm,1));
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::out_edge_iterator>
|
||||
out_edges(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
typedef typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::out_edge_iterator Iter;
|
||||
return CGAL::make_range(Iter(halfedge(v,sm),sm), Iter(halfedge(v,sm),sm,1));
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
std::pair<typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor,
|
||||
bool>
|
||||
edge(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor u,
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm) {
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor
|
||||
he(sm.find_halfedge(u, v));
|
||||
return std::make_pair(he, he.is_valid());
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// HalfedgeGraph
|
||||
//
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor
|
||||
next(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.next_halfedge_handle(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor
|
||||
prev(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.prev_halfedge_handle(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor
|
||||
opposite(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.opposite_halfedge_handle(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor
|
||||
edge(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& /*sm*/)
|
||||
{
|
||||
return typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor(h);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor
|
||||
halfedge(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor e,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>&)
|
||||
{
|
||||
return e.halfedge();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor
|
||||
halfedge(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
if(sm.halfedge_handle(v) == boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::null_halfedge()){
|
||||
return boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::null_halfedge();
|
||||
}
|
||||
// prev because OpenMesh stores out-going halfedges
|
||||
// return sm.prev_halfedge_handle(sm.halfedge_handle(v));
|
||||
return sm.opposite_halfedge_handle(sm.halfedge_handle(v));
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
std::pair<
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor,
|
||||
bool
|
||||
>
|
||||
halfedge(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor u,
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h = sm.find_halfedge(u, v);
|
||||
return std::make_pair(h, h.is_valid());
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// HalfedgeListGraph
|
||||
//
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_iterator>
|
||||
halfedges(const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return CGAL::make_range(sm.halfedges_sbegin(), sm.halfedges_end());
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedges_size_type
|
||||
num_halfedges(const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.n_halfedges();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// MutableHalfedgeGraph
|
||||
//
|
||||
template<typename K>
|
||||
void
|
||||
set_next(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h1,
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h2,
|
||||
OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.set_next_halfedge_handle(h1, h2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
set_target(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.set_vertex_handle(h, v);
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
set_halfedge(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.set_halfedge_handle(v, sm.opposite_halfedge_handle(h));
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
adjust_border_halfedge(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.adjust_outgoing_halfedge(v);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
garbage_collection(OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.garbage_collection();
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor
|
||||
add_edge(OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return edge(sm.new_edge(boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::null_vertex(),
|
||||
boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::null_vertex() ), sm);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
reserve(OpenMesh::TriMesh_ArrayKernelT<K>& tm,
|
||||
typename boost::graph_traits< OpenMesh::TriMesh_ArrayKernelT<K> >::vertices_size_type nv,
|
||||
typename boost::graph_traits< OpenMesh::TriMesh_ArrayKernelT<K> >::edges_size_type ne,
|
||||
typename boost::graph_traits< OpenMesh::TriMesh_ArrayKernelT<K> >::faces_size_type nf)
|
||||
{
|
||||
tm.reserve(nv, ne, nf);
|
||||
}
|
||||
|
||||
//
|
||||
// FaceGraph
|
||||
//
|
||||
template<typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor
|
||||
halfedge(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::face_descriptor f,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.halfedge_handle(f);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::face_descriptor
|
||||
face(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.face_handle(h);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//
|
||||
// MutableFaceGraph
|
||||
//
|
||||
template<typename K>
|
||||
void
|
||||
set_face(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::face_descriptor f,
|
||||
OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.set_face_handle(h, f);
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
set_halfedge(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::face_descriptor f,
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor h,
|
||||
OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.set_halfedge_handle(f, h);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// FaceListGraph
|
||||
//
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::faces_size_type
|
||||
num_faces(const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.n_faces();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
CGAL::Iterator_range<typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::face_iterator>
|
||||
faces(const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return CGAL::make_range(sm.faces_sbegin(), sm.faces_end());
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
add_vertex(OpenMesh::TriMesh_ArrayKernelT<K>& sm) {
|
||||
return sm.new_vertex();
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
// MutableGraph
|
||||
// add a vertex with a default constructed property
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
add_vertex(OpenMesh::TriMesh_ArrayKernelT<K>& sm) {
|
||||
return sm.add_vertex(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_property_type());
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor
|
||||
add_vertex(const typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_property_type& p, OpenMesh::TriMesh_ArrayKernelT<K>& sm) {
|
||||
return sm.add_vertex(p);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
clear_vertex(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor,
|
||||
OpenMesh::TriMesh_ArrayKernelT<K>&) {
|
||||
CGAL_assert(false);
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
remove_vertex(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
OpenMesh::TriMesh_ArrayKernelT<K>& sm) {
|
||||
|
||||
sm.request_face_status();
|
||||
sm.request_vertex_status();
|
||||
sm.request_halfedge_status();
|
||||
sm.set_halfedge_handle(v, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor());
|
||||
sm.status(v).set_deleted(true);
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
remove_edge(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor u,
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v,
|
||||
OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor e = edge(u, v, sm);
|
||||
remove_edge(e,sm);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
remove_edge(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor e,
|
||||
OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.request_face_status();
|
||||
sm.request_vertex_status();
|
||||
sm.request_halfedge_status();
|
||||
sm.request_edge_status();
|
||||
|
||||
typedef typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor halfedge_descriptor;
|
||||
|
||||
halfedge_descriptor h1 = halfedge(e,sm);
|
||||
halfedge_descriptor h2 = opposite(halfedge(e,sm),sm);
|
||||
sm.status(sm.edge_handle(h1)).set_deleted(true);
|
||||
sm.status(h1).set_deleted(true);
|
||||
sm.status(h2).set_deleted(true);
|
||||
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
void
|
||||
remove_edge(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_iterator eiter,
|
||||
OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
remove_edge(*eiter, sm);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
remove_face(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::face_descriptor f,
|
||||
OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
|
||||
sm.request_face_status();
|
||||
sm.request_vertex_status();
|
||||
sm.request_halfedge_status();
|
||||
|
||||
set_halfedge(f, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor(), sm);
|
||||
sm.status(f).set_deleted(true);
|
||||
}
|
||||
|
||||
#if 0 // conflits with function in Euler_operations.h
|
||||
template<typename K>
|
||||
std::pair<typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor,
|
||||
bool>
|
||||
add_edge(typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v1,
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor v2,
|
||||
OpenMesh::TriMesh_ArrayKernelT<K>& sm) {
|
||||
|
||||
return sm.new_edge(v1, v2);
|
||||
}
|
||||
#endif
|
||||
|
||||
template<typename K>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::face_descriptor
|
||||
add_face(OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return sm.new_face();
|
||||
}
|
||||
|
||||
template<typename K, typename InputIterator>
|
||||
typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::face_descriptor
|
||||
add_face(InputIterator begin, InputIterator end, OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
typedef typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor vertex_descriptor;
|
||||
CGAL_assertion(begin!= end);
|
||||
vertex_descriptor u = *begin;
|
||||
++begin;
|
||||
CGAL_assertion(begin!= end);
|
||||
vertex_descriptor v = *begin;
|
||||
++begin;
|
||||
CGAL_assertion(begin!= end);
|
||||
vertex_descriptor w = *begin;
|
||||
|
||||
return sm.add_face(u,v,w);
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
bool is_valid(OpenMesh::TriMesh_ArrayKernelT<K>& sm, bool /* verbose */ = false)
|
||||
{
|
||||
return CGAL::is_valid_polygon_mesh(sm);
|
||||
}
|
||||
|
||||
} // namespace OpenMesh
|
||||
|
||||
namespace CGAL {
|
||||
|
||||
// Overload CGAL::clear function. TriMesh_ArrayKernel behaves
|
||||
// differently from other meshes. Calling clear does not affect the
|
||||
// number of vertices, edges, or faces in the mesh. To get actual
|
||||
// numbers it is necessary to first collect garbage. We add an
|
||||
// overlaod to get consistent behavior.
|
||||
template<typename K>
|
||||
void clear(OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
sm.clear();
|
||||
sm.garbage_collection(true, true, true);
|
||||
CGAL_postcondition(num_edges(sm) == 0);
|
||||
CGAL_postcondition(num_vertices(sm) == 0);
|
||||
CGAL_postcondition(num_faces(sm) == 0);
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
bool read_off(std::istream& is, OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
OpenMesh::IO::Options ropt;
|
||||
return OpenMesh::IO::read_mesh(sm, is, ".OFF", ropt, false);
|
||||
}
|
||||
|
||||
|
||||
template<typename K>
|
||||
bool write_off(std::ostream& os, OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
OpenMesh::IO::Options ropt;
|
||||
return OpenMesh::IO::write_mesh(sm, os, ".OFF", ropt);
|
||||
}
|
||||
|
||||
}
|
||||
#ifndef CGAL_NO_DEPRECATED_CODE
|
||||
#include <CGAL/boost/graph/backward_compatibility_functions.h>
|
||||
|
||||
namespace boost {
|
||||
// The following functions were defined in the namespace boost
|
||||
using OpenMesh::vertices;
|
||||
using OpenMesh::edges;
|
||||
using OpenMesh::num_vertices;
|
||||
using OpenMesh::num_edges;
|
||||
using OpenMesh::out_edges;
|
||||
using OpenMesh::in_edges;
|
||||
using OpenMesh::target;
|
||||
using OpenMesh::source;
|
||||
} // namespace boost
|
||||
#endif //CGAL_NO_DEPRECATED_CODE
|
||||
|
||||
#if defined(BOOST_MSVC)
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
#define OPEN_MESH_CLASS OpenMesh::TriMesh_ArrayKernelT<K>
|
||||
#include <CGAL/boost/graph/graph_traits_OpenMesh.h>
|
||||
|
||||
#endif // CGAL_BOOST_GRAPH_TRAITS_TRIMESH_ARRAYKERNELT_H
|
||||
|
|
|
|||
|
|
@ -0,0 +1,541 @@
|
|||
// Copyright (c) 2014 GeometryFactory (France). All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org); 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.
|
||||
//
|
||||
// Licensees holding a valid commercial license may use this file in
|
||||
// accordance with the commercial license agreement provided with the software.
|
||||
//
|
||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0+
|
||||
//
|
||||
//
|
||||
// Author(s) : Philipp Möller
|
||||
|
||||
|
||||
#include <CGAL/assertions.h>
|
||||
#include <CGAL/boost/graph/properties.h>
|
||||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
#include <boost/mpl/if.hpp>
|
||||
|
||||
#ifndef OPEN_MESH_CLASS
|
||||
#error OPEN_MESH_CLASS is not defined
|
||||
#endif
|
||||
|
||||
// note only the properties below are protected by the macro,
|
||||
// the rest of the file is the shared implementation of properties for
|
||||
// OpenMesh::PolyMesh_ArrayKernelT<K> and OpenMesh::TriMesh_ArrayKernelT<K>
|
||||
#ifndef CGAL_BOOST_GRAPH_PROPERTIES_OPENMESH_H
|
||||
#define CGAL_BOOST_GRAPH_PROPERTIES_OPENMESH_H
|
||||
namespace CGAL {
|
||||
|
||||
template <typename Mesh, typename Descriptor, typename Value>
|
||||
class OM_pmap {
|
||||
public:
|
||||
typedef typename boost::mpl::if_<boost::is_same<Descriptor, typename boost::graph_traits<Mesh>::vertex_descriptor>,
|
||||
OpenMesh::VPropHandleT<Value>,
|
||||
typename boost::mpl::if_<boost::is_same<Descriptor, typename boost::graph_traits<Mesh>::face_descriptor>,
|
||||
OpenMesh::FPropHandleT<Value>,
|
||||
typename boost::mpl::if_<boost::is_same<Descriptor, typename boost::graph_traits<Mesh>::halfedge_descriptor>,
|
||||
OpenMesh::HPropHandleT<Value>,
|
||||
OpenMesh::EPropHandleT<Value> >::type>::type>::type H;
|
||||
|
||||
typedef boost::read_write_property_map_tag category;
|
||||
|
||||
typedef Descriptor key_type;
|
||||
typedef Value value_type;
|
||||
|
||||
typedef value_type& reference;
|
||||
|
||||
OM_pmap()
|
||||
{}
|
||||
|
||||
OM_pmap(Mesh& m)
|
||||
: mesh(&m)
|
||||
{
|
||||
mesh->add_property(h);
|
||||
}
|
||||
|
||||
OM_pmap(Mesh& m, H h)
|
||||
: mesh(&m), h(h)
|
||||
{
|
||||
mesh->add_property(h);
|
||||
}
|
||||
|
||||
inline friend reference get(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::vertex_descriptor k)
|
||||
{
|
||||
return pm.mesh->property(pm.h,k);
|
||||
}
|
||||
|
||||
inline friend reference get(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::face_descriptor k)
|
||||
{
|
||||
return pm.mesh->property(pm.h,k);
|
||||
}
|
||||
|
||||
inline friend reference get(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::halfedge_descriptor k)
|
||||
{
|
||||
return pm.mesh->property(pm.h,k);
|
||||
}
|
||||
|
||||
inline friend reference get(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::edge_descriptor k)
|
||||
{
|
||||
typename Mesh::EdgeHandle eh(k.idx());
|
||||
return pm.mesh->property(pm.h,eh);
|
||||
}
|
||||
inline friend void put(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::vertex_descriptor k,
|
||||
const value_type& v)
|
||||
{
|
||||
pm.mesh->property(pm.h,k) = v;
|
||||
}
|
||||
|
||||
inline friend void put(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::face_descriptor k,
|
||||
const value_type& v)
|
||||
{
|
||||
pm.mesh->property(pm.h,k) = v;
|
||||
}
|
||||
|
||||
inline friend void put(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::halfedge_descriptor k,
|
||||
const value_type& v)
|
||||
{
|
||||
pm.mesh->property(pm.h,k) = v;
|
||||
}
|
||||
inline friend void put(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::edge_descriptor k,
|
||||
const value_type& v)
|
||||
{
|
||||
typename Mesh::EdgeHandle eh(k.idx());
|
||||
pm.mesh->property(pm.h,eh) = v;
|
||||
}
|
||||
|
||||
reference operator[](key_type k)
|
||||
{
|
||||
return mesh->property(h,k);
|
||||
}
|
||||
|
||||
H handle() const
|
||||
{
|
||||
return h;
|
||||
}
|
||||
|
||||
H& handle()
|
||||
{
|
||||
return h;
|
||||
}
|
||||
|
||||
Mesh* mesh;
|
||||
H h;
|
||||
};
|
||||
|
||||
|
||||
template <typename OpenMesh>
|
||||
class OM_edge_weight_pmap
|
||||
: public boost::put_get_helper<typename OpenMesh::Scalar , OM_edge_weight_pmap<OpenMesh> >
|
||||
{
|
||||
public:
|
||||
typedef boost::readable_property_map_tag category;
|
||||
typedef typename OpenMesh::Scalar value_type;
|
||||
typedef value_type reference;
|
||||
typedef typename boost::graph_traits<OpenMesh>::edge_descriptor key_type;
|
||||
|
||||
OM_edge_weight_pmap(const OpenMesh& sm)
|
||||
: sm_(sm)
|
||||
{}
|
||||
|
||||
value_type operator[](const key_type& e) const
|
||||
{
|
||||
return sm_.calc_edge_length(e.halfedge());
|
||||
}
|
||||
|
||||
private:
|
||||
const OpenMesh& sm_;
|
||||
};
|
||||
|
||||
template <typename K, typename VEF>
|
||||
class OM_index_pmap : public boost::put_get_helper<unsigned int, OM_index_pmap<K,VEF> >
|
||||
{
|
||||
public:
|
||||
typedef boost::readable_property_map_tag category;
|
||||
typedef unsigned int value_type;
|
||||
typedef unsigned int reference;
|
||||
typedef VEF key_type;
|
||||
|
||||
OM_index_pmap()
|
||||
{}
|
||||
|
||||
value_type operator[](const key_type& vd) const
|
||||
{
|
||||
return vd.idx();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template<typename OpenMesh, typename P>
|
||||
class OM_point_pmap //: public boost::put_get_helper<bool, OM_point_pmap<OpenMesh> >
|
||||
{
|
||||
public:
|
||||
typedef boost::read_write_property_map_tag category;
|
||||
#if defined(CGAL_USE_OM_POINTS)
|
||||
typedef typename OpenMesh::Point value_type;
|
||||
typedef const typename OpenMesh::Point& reference;
|
||||
#else
|
||||
typedef P value_type;
|
||||
typedef P reference;
|
||||
#endif
|
||||
typedef typename boost::graph_traits<OpenMesh>::vertex_descriptor key_type;
|
||||
|
||||
OM_point_pmap()
|
||||
: sm_(NULL)
|
||||
{}
|
||||
|
||||
OM_point_pmap(const OpenMesh& sm)
|
||||
: sm_(&sm)
|
||||
{}
|
||||
|
||||
OM_point_pmap(const OM_point_pmap& pm)
|
||||
: sm_(pm.sm_)
|
||||
{}
|
||||
|
||||
value_type operator[](key_type v)
|
||||
{
|
||||
#if defined(CGAL_USE_OM_POINTS)
|
||||
return sm_->point(v);
|
||||
#else
|
||||
CGAL_assertion(sm_!=NULL);
|
||||
typename OpenMesh::Point const& omp = sm_->point(v);
|
||||
return value_type(omp[0], omp[1], omp[2]);
|
||||
#endif
|
||||
}
|
||||
|
||||
inline friend reference get(const OM_point_pmap<OpenMesh,P>& pm, key_type v)
|
||||
{
|
||||
CGAL_precondition(pm.sm_!=NULL);
|
||||
#if defined(CGAL_USE_OM_POINTS)
|
||||
return pm.sm_->point(v);
|
||||
#else
|
||||
CGAL_assertion(pm.sm_!=NULL);
|
||||
typename OpenMesh::Point const& omp = pm.sm_->point(v);
|
||||
return value_type(omp[0], omp[1], omp[2]);
|
||||
#endif
|
||||
}
|
||||
|
||||
inline friend void put(const OM_point_pmap<OpenMesh,P>& pm, key_type v, const value_type& p)
|
||||
{
|
||||
CGAL_precondition(pm.sm_!=NULL);
|
||||
#if defined(CGAL_USE_OM_POINTS)
|
||||
const_cast<OpenMesh&>(*pm.sm_).set_point(v,p);
|
||||
#else
|
||||
const_cast<OpenMesh&>(*pm.sm_).set_point
|
||||
(v, typename OpenMesh::Point((float)p[0], (float)p[1], (float)p[2]));
|
||||
#endif
|
||||
}
|
||||
|
||||
private:
|
||||
const OpenMesh* sm_;
|
||||
};
|
||||
|
||||
|
||||
} // CGAL
|
||||
#endif // CGAL_BOOST_GRAPH_PROPERTIES_OPENMESH_H
|
||||
|
||||
// overloads and specializations in the boost namespace
|
||||
namespace boost {
|
||||
|
||||
//
|
||||
// edge_weight
|
||||
//
|
||||
|
||||
|
||||
template <typename K>
|
||||
struct property_map<OPEN_MESH_CLASS, boost::edge_weight_t >
|
||||
{
|
||||
typedef OPEN_MESH_CLASS Mesh;
|
||||
typedef CGAL::OM_edge_weight_pmap<Mesh> type;
|
||||
typedef CGAL::OM_edge_weight_pmap<Mesh> const_type;
|
||||
};
|
||||
|
||||
|
||||
|
||||
//
|
||||
// vertex_index
|
||||
//
|
||||
|
||||
template <typename K>
|
||||
struct property_map<OPEN_MESH_CLASS, boost::vertex_index_t >
|
||||
{
|
||||
typedef OPEN_MESH_CLASS Mesh;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::vertex_descriptor> type;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::vertex_descriptor> const_type;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// face_index
|
||||
//
|
||||
|
||||
template <typename K>
|
||||
struct property_map<OPEN_MESH_CLASS, boost::face_index_t >
|
||||
{
|
||||
typedef OPEN_MESH_CLASS Mesh;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::face_descriptor> type;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::face_descriptor> const_type;
|
||||
};
|
||||
|
||||
//
|
||||
// edge_index
|
||||
//
|
||||
|
||||
template <typename K>
|
||||
struct property_map<OPEN_MESH_CLASS, boost::edge_index_t >
|
||||
{
|
||||
typedef OPEN_MESH_CLASS Mesh;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::edge_descriptor> type;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::edge_descriptor> const_type;
|
||||
};
|
||||
|
||||
//
|
||||
// halfedge_index
|
||||
//
|
||||
|
||||
template <typename K>
|
||||
struct property_map<OPEN_MESH_CLASS, boost::halfedge_index_t >
|
||||
{
|
||||
typedef OPEN_MESH_CLASS Mesh;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::halfedge_descriptor> type;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::halfedge_descriptor> const_type;
|
||||
};
|
||||
|
||||
|
||||
template<typename K>
|
||||
struct property_map<OPEN_MESH_CLASS, boost::vertex_point_t >
|
||||
{
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel::Point_3 P;
|
||||
typedef OPEN_MESH_CLASS Mesh;
|
||||
typedef CGAL::OM_point_pmap<Mesh, P> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
template<typename K>
|
||||
struct graph_has_property<OPEN_MESH_CLASS, edge_weight_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OPEN_MESH_CLASS, vertex_index_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OPEN_MESH_CLASS, face_index_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OPEN_MESH_CLASS, edge_index_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OPEN_MESH_CLASS, halfedge_index_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OPEN_MESH_CLASS, vertex_point_t>
|
||||
: CGAL::Tag_true{};
|
||||
|
||||
} // namespace boost
|
||||
|
||||
namespace OpenMesh {
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::property_map<OPEN_MESH_CLASS, boost::edge_weight_t>::const_type
|
||||
get(boost::edge_weight_t, const OPEN_MESH_CLASS& sm)
|
||||
{
|
||||
typedef OPEN_MESH_CLASS Mesh;
|
||||
return CGAL::OM_edge_weight_pmap<Mesh>(sm);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename OPEN_MESH_CLASS::Scalar
|
||||
get(boost::edge_weight_t, const OPEN_MESH_CLASS& sm,
|
||||
const typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor& e)
|
||||
{
|
||||
typedef OPEN_MESH_CLASS Mesh;
|
||||
return CGAL::OM_edge_weight_pmap<Mesh>(sm)[e];
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
CGAL::OM_index_pmap<K, typename boost::graph_traits<OPEN_MESH_CLASS >::vertex_descriptor>
|
||||
get(const boost::vertex_index_t&, const OPEN_MESH_CLASS&)
|
||||
{
|
||||
typedef OPEN_MESH_CLASS Mesh;
|
||||
return CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::vertex_descriptor>();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::property_map<OPEN_MESH_CLASS, boost::face_index_t>::const_type
|
||||
get(const boost::face_index_t&, const OPEN_MESH_CLASS&)
|
||||
{
|
||||
typedef OPEN_MESH_CLASS Mesh;
|
||||
return CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::face_descriptor>();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
CGAL::OM_index_pmap<K, typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor>
|
||||
get(const boost::edge_index_t&, const OPEN_MESH_CLASS&)
|
||||
{
|
||||
return CGAL::OM_index_pmap<K, typename boost::graph_traits<OPEN_MESH_CLASS >::edge_descriptor>();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
CGAL::OM_index_pmap<K, typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor>
|
||||
get(const boost::halfedge_index_t&, const OPEN_MESH_CLASS&)
|
||||
{
|
||||
return CGAL::OM_index_pmap<K, typename boost::graph_traits<OPEN_MESH_CLASS >::halfedge_descriptor>();
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
CGAL::OM_point_pmap<OPEN_MESH_CLASS,
|
||||
typename CGAL::Exact_predicates_inexact_constructions_kernel::Point_3>
|
||||
get(boost::vertex_point_t, const OPEN_MESH_CLASS& g)
|
||||
{
|
||||
typedef typename CGAL::Exact_predicates_inexact_constructions_kernel::Point_3 P;
|
||||
return CGAL::OM_point_pmap<OPEN_MESH_CLASS, P>(g);
|
||||
}
|
||||
|
||||
// get for intrinsic properties
|
||||
#define CGAL_OM_INTRINSIC_PROPERTY(RET, PROP, TYPE) \
|
||||
template<typename K> \
|
||||
RET \
|
||||
get(PROP p, const OPEN_MESH_CLASS& sm, \
|
||||
typename boost::graph_traits< OPEN_MESH_CLASS >::TYPE x) \
|
||||
{ return get(get(p, sm), x); } \
|
||||
|
||||
CGAL_OM_INTRINSIC_PROPERTY(int, boost::vertex_index_t, vertex_descriptor)
|
||||
CGAL_OM_INTRINSIC_PROPERTY(int, boost::edge_index_t, edge_descriptor)
|
||||
CGAL_OM_INTRINSIC_PROPERTY(int, boost::halfedge_index_t, halfedge_descriptor)
|
||||
CGAL_OM_INTRINSIC_PROPERTY(int, boost::face_index_t, face_descriptor)
|
||||
// CGAL_OM_INTRINSIC_PROPERTY(std::size_t, boost::halfedge_index_t, face_descriptor)
|
||||
CGAL_OM_INTRINSIC_PROPERTY(typename CGAL::Exact_predicates_inexact_constructions_kernel::Point_3, boost::vertex_point_t, vertex_descriptor)
|
||||
|
||||
#undef CGAL_OM_INTRINSIC_PROPERTY
|
||||
|
||||
// put for intrinsic properties
|
||||
// only available for vertex_point
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
put(boost::vertex_point_t p, OPEN_MESH_CLASS& g,
|
||||
typename boost::graph_traits< OPEN_MESH_CLASS >::vertex_descriptor vd,
|
||||
const typename K::Point& point)
|
||||
{
|
||||
put(get(p,g), vd, point);
|
||||
}
|
||||
|
||||
|
||||
} // namespace OpenMesh
|
||||
|
||||
|
||||
|
||||
namespace boost {
|
||||
|
||||
template <typename K, typename V>
|
||||
struct property_map<OPEN_MESH_CLASS, CGAL::dynamic_vertex_property_t<V> >
|
||||
{
|
||||
typedef OPEN_MESH_CLASS SM;
|
||||
typedef typename boost::graph_traits<SM>::vertex_descriptor vertex_descriptor;
|
||||
typedef CGAL::OM_pmap<SM,vertex_descriptor, V> SMPM;
|
||||
typedef CGAL::internal::Dynamic<SM, SMPM> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
template <typename K, typename V>
|
||||
struct property_map<OPEN_MESH_CLASS, CGAL::dynamic_halfedge_property_t<V> >
|
||||
{
|
||||
typedef OPEN_MESH_CLASS SM;
|
||||
typedef typename boost::graph_traits<SM>::halfedge_descriptor halfedge_descriptor;
|
||||
typedef CGAL::OM_pmap<SM,halfedge_descriptor, V> SMPM;
|
||||
typedef CGAL::internal::Dynamic<SM, SMPM> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
template <typename K, typename V>
|
||||
struct property_map<OPEN_MESH_CLASS, CGAL::dynamic_edge_property_t<V> >
|
||||
{
|
||||
typedef OPEN_MESH_CLASS SM;
|
||||
typedef typename boost::graph_traits<SM>::edge_descriptor edge_descriptor;
|
||||
typedef CGAL::OM_pmap<SM,edge_descriptor, V> SMPM;
|
||||
typedef CGAL::internal::Dynamic<SM, SMPM> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
template <typename K, typename V>
|
||||
struct property_map<OPEN_MESH_CLASS, CGAL::dynamic_face_property_t<V> >
|
||||
{
|
||||
typedef OPEN_MESH_CLASS SM;
|
||||
typedef typename boost::graph_traits<SM>::face_descriptor face_descriptor;
|
||||
typedef CGAL::OM_pmap<SM,face_descriptor, V> SMPM;
|
||||
typedef CGAL::internal::Dynamic<SM, SMPM> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
} // namespace boost
|
||||
|
||||
|
||||
namespace OpenMesh {
|
||||
|
||||
template <typename K, typename V>
|
||||
typename boost::property_map<OPEN_MESH_CLASS, CGAL::dynamic_vertex_property_t<V> >::const_type
|
||||
get(CGAL::dynamic_vertex_property_t<V>, OPEN_MESH_CLASS& om)
|
||||
{
|
||||
typedef OPEN_MESH_CLASS OM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_vertex_property_t<V> >::SMPM SMPM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_vertex_property_t<V> >::const_type DPM;
|
||||
return DPM(om, new SMPM(om));
|
||||
}
|
||||
|
||||
template <typename K, typename V>
|
||||
typename boost::property_map<OPEN_MESH_CLASS, CGAL::dynamic_halfedge_property_t<V> >::const_type
|
||||
get(CGAL::dynamic_halfedge_property_t<V>, OPEN_MESH_CLASS& om)
|
||||
{
|
||||
typedef OPEN_MESH_CLASS OM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_halfedge_property_t<V> >::SMPM SMPM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_halfedge_property_t<V> >::const_type DPM;
|
||||
return DPM(om, new SMPM(om));
|
||||
}
|
||||
|
||||
template <typename K, typename V>
|
||||
typename boost::property_map<OPEN_MESH_CLASS, CGAL::dynamic_edge_property_t<V> >::const_type
|
||||
get(CGAL::dynamic_edge_property_t<V>, OPEN_MESH_CLASS& om)
|
||||
{
|
||||
typedef OPEN_MESH_CLASS OM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_edge_property_t<V> >::SMPM SMPM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_edge_property_t<V> >::const_type DPM;
|
||||
return DPM(om, new SMPM(om));
|
||||
}
|
||||
|
||||
template <typename K, typename V>
|
||||
typename boost::property_map<OPEN_MESH_CLASS, CGAL::dynamic_face_property_t<V> >::const_type
|
||||
get(CGAL::dynamic_face_property_t<V>, OPEN_MESH_CLASS& om)
|
||||
{
|
||||
typedef OPEN_MESH_CLASS OM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_face_property_t<V> >::SMPM SMPM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_face_property_t<V> >::const_type DPM;
|
||||
return DPM(om, new SMPM(om));
|
||||
}
|
||||
|
||||
// implementation detail: required by Dynamic_property_map_deleter
|
||||
template <typename Pmap, typename K>
|
||||
void remove_property(Pmap pm, OPEN_MESH_CLASS& om)
|
||||
{
|
||||
om.remove_property(pm.handle());
|
||||
}
|
||||
|
||||
} // namespace OpenMesh
|
||||
|
||||
#undef OPEN_MESH_CLASS
|
||||
|
|
@ -14,523 +14,14 @@
|
|||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0+
|
||||
//
|
||||
//
|
||||
// Author(s) : Philipp Möller
|
||||
|
||||
|
||||
#ifndef CGAL_PROPERTIES_POLYMESH_ARRAYKERNELT_H
|
||||
#define CGAL_PROPERTIES_POLYMESH_ARRAYKERNELT_H
|
||||
|
||||
#include <CGAL/assertions.h>
|
||||
#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
|
||||
#include <CGAL/boost/graph/properties.h>
|
||||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
#include <boost/mpl/if.hpp>
|
||||
|
||||
namespace CGAL {
|
||||
|
||||
template <typename Mesh, typename Descriptor, typename Value>
|
||||
class OM_pmap {
|
||||
public:
|
||||
typedef typename boost::mpl::if_<boost::is_same<Descriptor, typename boost::graph_traits<Mesh>::vertex_descriptor>,
|
||||
OpenMesh::VPropHandleT<Value>,
|
||||
typename boost::mpl::if_<boost::is_same<Descriptor, typename boost::graph_traits<Mesh>::face_descriptor>,
|
||||
OpenMesh::FPropHandleT<Value>,
|
||||
typename boost::mpl::if_<boost::is_same<Descriptor, typename boost::graph_traits<Mesh>::halfedge_descriptor>,
|
||||
OpenMesh::HPropHandleT<Value>,
|
||||
OpenMesh::EPropHandleT<Value> >::type>::type>::type H;
|
||||
|
||||
typedef boost::read_write_property_map_tag category;
|
||||
|
||||
typedef Descriptor key_type;
|
||||
typedef Value value_type;
|
||||
|
||||
typedef value_type& reference;
|
||||
|
||||
OM_pmap()
|
||||
{}
|
||||
|
||||
OM_pmap(Mesh& m)
|
||||
: mesh(&m)
|
||||
{
|
||||
mesh->add_property(h);
|
||||
}
|
||||
|
||||
OM_pmap(Mesh& m, H h)
|
||||
: mesh(&m), h(h)
|
||||
{
|
||||
mesh->add_property(h);
|
||||
}
|
||||
|
||||
inline friend reference get(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::vertex_descriptor k)
|
||||
{
|
||||
return pm.mesh->property(pm.h,k);
|
||||
}
|
||||
|
||||
inline friend reference get(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::face_descriptor k)
|
||||
{
|
||||
return pm.mesh->property(pm.h,k);
|
||||
}
|
||||
|
||||
inline friend reference get(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::halfedge_descriptor k)
|
||||
{
|
||||
return pm.mesh->property(pm.h,k);
|
||||
}
|
||||
|
||||
inline friend reference get(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::edge_descriptor k)
|
||||
{
|
||||
typename Mesh::EdgeHandle eh(k.idx());
|
||||
return pm.mesh->property(pm.h,eh);
|
||||
}
|
||||
inline friend void put(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::vertex_descriptor k,
|
||||
const value_type& v)
|
||||
{
|
||||
pm.mesh->property(pm.h,k) = v;
|
||||
}
|
||||
|
||||
inline friend void put(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::face_descriptor k,
|
||||
const value_type& v)
|
||||
{
|
||||
pm.mesh->property(pm.h,k) = v;
|
||||
}
|
||||
|
||||
inline friend void put(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::halfedge_descriptor k,
|
||||
const value_type& v)
|
||||
{
|
||||
pm.mesh->property(pm.h,k) = v;
|
||||
}
|
||||
inline friend void put(const OM_pmap<Mesh,Descriptor,Value>& pm,
|
||||
typename boost::graph_traits<Mesh>::edge_descriptor k,
|
||||
const value_type& v)
|
||||
{
|
||||
typename Mesh::EdgeHandle eh(k.idx());
|
||||
pm.mesh->property(pm.h,eh) = v;
|
||||
}
|
||||
|
||||
reference operator[](key_type k)
|
||||
{
|
||||
return mesh->property(h,k);
|
||||
}
|
||||
|
||||
H handle() const
|
||||
{
|
||||
return h;
|
||||
}
|
||||
|
||||
H& handle()
|
||||
{
|
||||
return h;
|
||||
}
|
||||
|
||||
Mesh* mesh;
|
||||
H h;
|
||||
};
|
||||
|
||||
|
||||
template <typename OpenMesh>
|
||||
class OM_edge_weight_pmap
|
||||
: public boost::put_get_helper<typename OpenMesh::Scalar , OM_edge_weight_pmap<OpenMesh> >
|
||||
{
|
||||
public:
|
||||
typedef boost::readable_property_map_tag category;
|
||||
typedef typename OpenMesh::Scalar value_type;
|
||||
typedef value_type reference;
|
||||
typedef typename boost::graph_traits<OpenMesh>::edge_descriptor key_type;
|
||||
|
||||
OM_edge_weight_pmap(const OpenMesh& sm)
|
||||
: sm_(sm)
|
||||
{}
|
||||
|
||||
value_type operator[](const key_type& e) const
|
||||
{
|
||||
return sm_.calc_edge_length(e.halfedge());
|
||||
}
|
||||
|
||||
private:
|
||||
const OpenMesh& sm_;
|
||||
};
|
||||
|
||||
template <typename K, typename VEF>
|
||||
class OM_index_pmap : public boost::put_get_helper<unsigned int, OM_index_pmap<K,VEF> >
|
||||
{
|
||||
public:
|
||||
typedef boost::readable_property_map_tag category;
|
||||
typedef unsigned int value_type;
|
||||
typedef unsigned int reference;
|
||||
typedef VEF key_type;
|
||||
|
||||
OM_index_pmap()
|
||||
{}
|
||||
|
||||
value_type operator[](const key_type& vd) const
|
||||
{
|
||||
return vd.idx();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template<typename OpenMesh, typename P>
|
||||
class OM_point_pmap //: public boost::put_get_helper<bool, OM_point_pmap<OpenMesh> >
|
||||
{
|
||||
public:
|
||||
typedef boost::read_write_property_map_tag category;
|
||||
#if defined(CGAL_USE_OM_POINTS)
|
||||
typedef typename OpenMesh::Point value_type;
|
||||
typedef const typename OpenMesh::Point& reference;
|
||||
#else
|
||||
typedef P value_type;
|
||||
typedef P reference;
|
||||
#endif
|
||||
typedef typename boost::graph_traits<OpenMesh>::vertex_descriptor key_type;
|
||||
|
||||
OM_point_pmap()
|
||||
: sm_(NULL)
|
||||
{}
|
||||
|
||||
OM_point_pmap(const OpenMesh& sm)
|
||||
: sm_(&sm)
|
||||
{}
|
||||
|
||||
OM_point_pmap(const OM_point_pmap& pm)
|
||||
: sm_(pm.sm_)
|
||||
{}
|
||||
|
||||
value_type operator[](key_type v)
|
||||
{
|
||||
#if defined(CGAL_USE_OM_POINTS)
|
||||
return sm_->point(v);
|
||||
#else
|
||||
CGAL_assertion(sm_!=NULL);
|
||||
typename OpenMesh::Point const& omp = sm_->point(v);
|
||||
return value_type(omp[0], omp[1], omp[2]);
|
||||
#endif
|
||||
}
|
||||
|
||||
inline friend reference get(const OM_point_pmap<OpenMesh,P>& pm, key_type v)
|
||||
{
|
||||
CGAL_precondition(pm.sm_!=NULL);
|
||||
#if defined(CGAL_USE_OM_POINTS)
|
||||
return pm.sm_->point(v);
|
||||
#else
|
||||
CGAL_assertion(pm.sm_!=NULL);
|
||||
typename OpenMesh::Point const& omp = pm.sm_->point(v);
|
||||
return value_type(omp[0], omp[1], omp[2]);
|
||||
#endif
|
||||
}
|
||||
|
||||
inline friend void put(const OM_point_pmap<OpenMesh,P>& pm, key_type v, const value_type& p)
|
||||
{
|
||||
CGAL_precondition(pm.sm_!=NULL);
|
||||
#if defined(CGAL_USE_OM_POINTS)
|
||||
const_cast<OpenMesh&>(*pm.sm_).set_point(v,p);
|
||||
#else
|
||||
const_cast<OpenMesh&>(*pm.sm_).set_point
|
||||
(v, typename OpenMesh::Point((float)p[0], (float)p[1], (float)p[2]));
|
||||
#endif
|
||||
}
|
||||
|
||||
private:
|
||||
const OpenMesh* sm_;
|
||||
};
|
||||
|
||||
|
||||
} // CGAL
|
||||
|
||||
// overloads and specializations in the boost namespace
|
||||
namespace boost {
|
||||
|
||||
//
|
||||
// edge_weight
|
||||
//
|
||||
|
||||
|
||||
template <typename K>
|
||||
struct property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, boost::edge_weight_t >
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> Mesh;
|
||||
typedef CGAL::OM_edge_weight_pmap<Mesh> type;
|
||||
typedef CGAL::OM_edge_weight_pmap<Mesh> const_type;
|
||||
};
|
||||
|
||||
|
||||
|
||||
//
|
||||
// vertex_index
|
||||
//
|
||||
|
||||
template <typename K>
|
||||
struct property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, boost::vertex_index_t >
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> Mesh;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::vertex_descriptor> type;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::vertex_descriptor> const_type;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// face_index
|
||||
//
|
||||
|
||||
template <typename K>
|
||||
struct property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, boost::face_index_t >
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> Mesh;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::face_descriptor> type;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::face_descriptor> const_type;
|
||||
};
|
||||
|
||||
//
|
||||
// edge_index
|
||||
//
|
||||
|
||||
template <typename K>
|
||||
struct property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, boost::edge_index_t >
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> Mesh;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::edge_descriptor> type;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::edge_descriptor> const_type;
|
||||
};
|
||||
|
||||
//
|
||||
// halfedge_index
|
||||
//
|
||||
|
||||
template <typename K>
|
||||
struct property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, boost::halfedge_index_t >
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> Mesh;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::halfedge_descriptor> type;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::halfedge_descriptor> const_type;
|
||||
};
|
||||
|
||||
|
||||
template<typename K>
|
||||
struct property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, boost::vertex_point_t >
|
||||
{
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel::Point_3 P;
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> Mesh;
|
||||
typedef CGAL::OM_point_pmap<Mesh, P> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
template<typename K>
|
||||
struct graph_has_property<OpenMesh::PolyMesh_ArrayKernelT<K>, edge_weight_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OpenMesh::PolyMesh_ArrayKernelT<K>, vertex_index_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OpenMesh::PolyMesh_ArrayKernelT<K>, face_index_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OpenMesh::PolyMesh_ArrayKernelT<K>, edge_index_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OpenMesh::PolyMesh_ArrayKernelT<K>, halfedge_index_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OpenMesh::PolyMesh_ArrayKernelT<K>, vertex_point_t>
|
||||
: CGAL::Tag_true{};
|
||||
|
||||
} // namespace boost
|
||||
|
||||
namespace OpenMesh {
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, boost::edge_weight_t>::const_type
|
||||
get(boost::edge_weight_t, const OpenMesh::PolyMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> Mesh;
|
||||
return CGAL::OM_edge_weight_pmap<Mesh>(sm);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename OpenMesh::PolyMesh_ArrayKernelT<K>::Scalar
|
||||
get(boost::edge_weight_t, const OpenMesh::PolyMesh_ArrayKernelT<K>& sm,
|
||||
const typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor& e)
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> Mesh;
|
||||
return CGAL::OM_edge_weight_pmap<Mesh>(sm)[e];
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor>
|
||||
get(const boost::vertex_index_t&, const OpenMesh::PolyMesh_ArrayKernelT<K>&)
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> Mesh;
|
||||
return CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::vertex_descriptor>();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, boost::face_index_t>::const_type
|
||||
get(const boost::face_index_t&, const OpenMesh::PolyMesh_ArrayKernelT<K>&)
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> Mesh;
|
||||
return CGAL::OM_index_pmap<K, typename boost::graph_traits<Mesh>::face_descriptor>();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor>
|
||||
get(const boost::edge_index_t&, const OpenMesh::PolyMesh_ArrayKernelT<K>&)
|
||||
{
|
||||
return CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::edge_descriptor>();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor>
|
||||
get(const boost::halfedge_index_t&, const OpenMesh::PolyMesh_ArrayKernelT<K>&)
|
||||
{
|
||||
return CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::PolyMesh_ArrayKernelT<K> >::halfedge_descriptor>();
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
CGAL::OM_point_pmap<OpenMesh::PolyMesh_ArrayKernelT<K>,
|
||||
typename CGAL::Exact_predicates_inexact_constructions_kernel::Point_3>
|
||||
get(boost::vertex_point_t, const OpenMesh::PolyMesh_ArrayKernelT<K>& g)
|
||||
{
|
||||
typedef typename CGAL::Exact_predicates_inexact_constructions_kernel::Point_3 P;
|
||||
return CGAL::OM_point_pmap<OpenMesh::PolyMesh_ArrayKernelT<K>, P>(g);
|
||||
}
|
||||
|
||||
// get for intrinsic properties
|
||||
#define CGAL_OM_INTRINSIC_PROPERTY(RET, PROP, TYPE) \
|
||||
template<typename K> \
|
||||
RET \
|
||||
get(PROP p, const OpenMesh::PolyMesh_ArrayKernelT<K>& sm, \
|
||||
typename boost::graph_traits< OpenMesh::PolyMesh_ArrayKernelT<K> >::TYPE x) \
|
||||
{ return get(get(p, sm), x); } \
|
||||
|
||||
CGAL_OM_INTRINSIC_PROPERTY(int, boost::vertex_index_t, vertex_descriptor)
|
||||
CGAL_OM_INTRINSIC_PROPERTY(int, boost::edge_index_t, edge_descriptor)
|
||||
CGAL_OM_INTRINSIC_PROPERTY(int, boost::halfedge_index_t, halfedge_descriptor)
|
||||
CGAL_OM_INTRINSIC_PROPERTY(int, boost::face_index_t, face_descriptor)
|
||||
// CGAL_OM_INTRINSIC_PROPERTY(std::size_t, boost::halfedge_index_t, face_descriptor)
|
||||
CGAL_OM_INTRINSIC_PROPERTY(typename CGAL::Exact_predicates_inexact_constructions_kernel::Point_3, boost::vertex_point_t, vertex_descriptor)
|
||||
|
||||
#undef CGAL_OM_INTRINSIC_PROPERTY
|
||||
|
||||
// put for intrinsic properties
|
||||
// only available for vertex_point
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
put(boost::vertex_point_t p, OpenMesh::PolyMesh_ArrayKernelT<K>& g,
|
||||
typename boost::graph_traits< OpenMesh::PolyMesh_ArrayKernelT<K> >::vertex_descriptor vd,
|
||||
const typename K::Point& point)
|
||||
{
|
||||
put(get(p,g), vd, point);
|
||||
}
|
||||
|
||||
|
||||
} // namespace OpenMesh
|
||||
|
||||
|
||||
|
||||
namespace boost {
|
||||
|
||||
template <typename K, typename V>
|
||||
struct property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, CGAL::dynamic_vertex_property_t<V> >
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> SM;
|
||||
typedef typename boost::graph_traits<SM>::vertex_descriptor vertex_descriptor;
|
||||
typedef CGAL::OM_pmap<SM,vertex_descriptor, V> SMPM;
|
||||
typedef CGAL::internal::Dynamic<SM, SMPM> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
template <typename K, typename V>
|
||||
struct property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, CGAL::dynamic_halfedge_property_t<V> >
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> SM;
|
||||
typedef typename boost::graph_traits<SM>::halfedge_descriptor halfedge_descriptor;
|
||||
typedef CGAL::OM_pmap<SM,halfedge_descriptor, V> SMPM;
|
||||
typedef CGAL::internal::Dynamic<SM, SMPM> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
template <typename K, typename V>
|
||||
struct property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, CGAL::dynamic_edge_property_t<V> >
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> SM;
|
||||
typedef typename boost::graph_traits<SM>::edge_descriptor edge_descriptor;
|
||||
typedef CGAL::OM_pmap<SM,edge_descriptor, V> SMPM;
|
||||
typedef CGAL::internal::Dynamic<SM, SMPM> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
template <typename K, typename V>
|
||||
struct property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, CGAL::dynamic_face_property_t<V> >
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> SM;
|
||||
typedef typename boost::graph_traits<SM>::face_descriptor face_descriptor;
|
||||
typedef CGAL::OM_pmap<SM,face_descriptor, V> SMPM;
|
||||
typedef CGAL::internal::Dynamic<SM, SMPM> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
} // namespace boost
|
||||
|
||||
|
||||
namespace OpenMesh {
|
||||
|
||||
template <typename K, typename V>
|
||||
typename boost::property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, CGAL::dynamic_vertex_property_t<V> >::const_type
|
||||
get(CGAL::dynamic_vertex_property_t<V>, OpenMesh::PolyMesh_ArrayKernelT<K>& om)
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> OM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_vertex_property_t<V> >::SMPM SMPM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_vertex_property_t<V> >::const_type DPM;
|
||||
return DPM(om, new SMPM(om));
|
||||
}
|
||||
|
||||
template <typename K, typename V>
|
||||
typename boost::property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, CGAL::dynamic_halfedge_property_t<V> >::const_type
|
||||
get(CGAL::dynamic_halfedge_property_t<V>, OpenMesh::PolyMesh_ArrayKernelT<K>& om)
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> OM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_halfedge_property_t<V> >::SMPM SMPM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_halfedge_property_t<V> >::const_type DPM;
|
||||
return DPM(om, new SMPM(om));
|
||||
}
|
||||
|
||||
template <typename K, typename V>
|
||||
typename boost::property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, CGAL::dynamic_edge_property_t<V> >::const_type
|
||||
get(CGAL::dynamic_edge_property_t<V>, OpenMesh::PolyMesh_ArrayKernelT<K>& om)
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> OM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_edge_property_t<V> >::SMPM SMPM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_edge_property_t<V> >::const_type DPM;
|
||||
return DPM(om, new SMPM(om));
|
||||
}
|
||||
|
||||
template <typename K, typename V>
|
||||
typename boost::property_map<OpenMesh::PolyMesh_ArrayKernelT<K>, CGAL::dynamic_face_property_t<V> >::const_type
|
||||
get(CGAL::dynamic_face_property_t<V>, OpenMesh::PolyMesh_ArrayKernelT<K>& om)
|
||||
{
|
||||
typedef OpenMesh::PolyMesh_ArrayKernelT<K> OM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_face_property_t<V> >::SMPM SMPM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_face_property_t<V> >::const_type DPM;
|
||||
return DPM(om, new SMPM(om));
|
||||
}
|
||||
|
||||
// implementation detail: required by Dynamic_property_map_deleter
|
||||
template <typename Pmap, typename K>
|
||||
void remove_property(Pmap pm, OpenMesh::PolyMesh_ArrayKernelT<K>& om)
|
||||
{
|
||||
om.remove_property(pm.handle());
|
||||
}
|
||||
|
||||
} // namespace OpenMesh
|
||||
|
||||
#define OPEN_MESH_CLASS OpenMesh::PolyMesh_ArrayKernelT<K>
|
||||
#include <CGAL/boost/graph/properties_OpenMesh.h>
|
||||
|
||||
#endif /* CGAL_PROPERTIES_POLYMESH_ARRAYKERNELT_H */
|
||||
|
|
|
|||
|
|
@ -14,7 +14,6 @@
|
|||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0+
|
||||
//
|
||||
//
|
||||
// Author(s) : Philipp Möller
|
||||
|
||||
|
|
@ -22,291 +21,9 @@
|
|||
#ifndef CGAL_PROPERTIES_TRIMESH_ARRAYKERNELT_H
|
||||
#define CGAL_PROPERTIES_TRIMESH_ARRAYKERNELT_H
|
||||
|
||||
#include <CGAL/assertions.h>
|
||||
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
|
||||
#include <CGAL/boost/graph/properties.h>
|
||||
#include <CGAL/boost/graph/properties_PolyMesh_ArrayKernelT.h>
|
||||
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
|
||||
#include <boost/mpl/if.hpp>
|
||||
|
||||
|
||||
// overloads and specializations in the boost namespace
|
||||
namespace boost {
|
||||
|
||||
//
|
||||
// edge_weight
|
||||
//
|
||||
template <typename K>
|
||||
struct property_map<OpenMesh::TriMesh_ArrayKernelT<K>, boost::edge_weight_t >
|
||||
{
|
||||
typedef OpenMesh::TriMesh_ArrayKernelT<K> Mesh;
|
||||
typedef CGAL::OM_edge_weight_pmap<Mesh> type;
|
||||
typedef CGAL::OM_edge_weight_pmap<Mesh> const_type;
|
||||
};
|
||||
|
||||
|
||||
|
||||
//
|
||||
// vertex_index
|
||||
//
|
||||
template <typename K>
|
||||
struct property_map<OpenMesh::TriMesh_ArrayKernelT<K>, boost::vertex_index_t >
|
||||
{
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor> type;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor> const_type;
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// face_index
|
||||
//
|
||||
|
||||
template <typename K>
|
||||
struct property_map<OpenMesh::TriMesh_ArrayKernelT<K>, boost::face_index_t >
|
||||
{
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::face_descriptor> type;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::face_descriptor> const_type;
|
||||
};
|
||||
|
||||
//
|
||||
// edge_index
|
||||
//
|
||||
|
||||
template <typename K>
|
||||
struct property_map<OpenMesh::TriMesh_ArrayKernelT<K>, boost::edge_index_t >
|
||||
{
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor> type;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor> const_type;
|
||||
};
|
||||
|
||||
//
|
||||
// halfedge_index
|
||||
//
|
||||
|
||||
template <typename K>
|
||||
struct property_map<OpenMesh::TriMesh_ArrayKernelT<K>, boost::halfedge_index_t >
|
||||
{
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor> type;
|
||||
typedef CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor> const_type;
|
||||
};
|
||||
|
||||
|
||||
template<typename K>
|
||||
struct property_map<OpenMesh::TriMesh_ArrayKernelT<K>, boost::vertex_point_t >
|
||||
{
|
||||
typedef CGAL::Exact_predicates_inexact_constructions_kernel::Point_3 P;
|
||||
typedef OpenMesh::TriMesh_ArrayKernelT<K> Mesh;
|
||||
typedef CGAL::OM_point_pmap<Mesh,P> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
template<typename K>
|
||||
struct graph_has_property<OpenMesh::TriMesh_ArrayKernelT<K>, edge_weight_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OpenMesh::TriMesh_ArrayKernelT<K>, vertex_index_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OpenMesh::TriMesh_ArrayKernelT<K>, face_index_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OpenMesh::TriMesh_ArrayKernelT<K>, edge_index_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OpenMesh::TriMesh_ArrayKernelT<K>, halfedge_index_t>
|
||||
: CGAL::Tag_true{};
|
||||
template<typename K>
|
||||
struct graph_has_property<OpenMesh::TriMesh_ArrayKernelT<K>, vertex_point_t>
|
||||
: CGAL::Tag_true{};
|
||||
|
||||
} // namespace boost
|
||||
|
||||
namespace OpenMesh {
|
||||
|
||||
|
||||
template <typename K>
|
||||
typename boost::property_map<OpenMesh::TriMesh_ArrayKernelT<K>, boost::edge_weight_t>::const_type
|
||||
get(boost::edge_weight_t, const OpenMesh::TriMesh_ArrayKernelT<K>& sm)
|
||||
{
|
||||
return CGAL::OM_edge_weight_pmap<K>(sm);
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename OpenMesh::TriMesh_ArrayKernelT<K>::Scalar
|
||||
get(boost::edge_weight_t, const OpenMesh::TriMesh_ArrayKernelT<K>& sm,
|
||||
const typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor& e)
|
||||
{
|
||||
return CGAL::OM_edge_weight_pmap<K>(sm)[e];
|
||||
}
|
||||
|
||||
|
||||
template <typename K>
|
||||
CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor>
|
||||
get(const boost::vertex_index_t&, const OpenMesh::TriMesh_ArrayKernelT<K>&)
|
||||
{
|
||||
return CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor>();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
typename boost::property_map<OpenMesh::TriMesh_ArrayKernelT<K>, boost::face_index_t>::const_type
|
||||
get(const boost::face_index_t&, const OpenMesh::TriMesh_ArrayKernelT<K>&)
|
||||
{
|
||||
return CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::face_descriptor>();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor>
|
||||
get(const boost::edge_index_t&, const OpenMesh::TriMesh_ArrayKernelT<K>&)
|
||||
{
|
||||
return CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::edge_descriptor>();
|
||||
}
|
||||
|
||||
template <typename K>
|
||||
CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor>
|
||||
get(const boost::halfedge_index_t&, const OpenMesh::TriMesh_ArrayKernelT<K>&)
|
||||
{
|
||||
return CGAL::OM_index_pmap<K, typename boost::graph_traits<OpenMesh::TriMesh_ArrayKernelT<K> >::halfedge_descriptor>();
|
||||
}
|
||||
|
||||
template<typename K>
|
||||
CGAL::OM_point_pmap<OpenMesh::TriMesh_ArrayKernelT<K>,
|
||||
typename CGAL::Exact_predicates_inexact_constructions_kernel::Point_3>
|
||||
get(boost::vertex_point_t, const OpenMesh::TriMesh_ArrayKernelT<K>& g)
|
||||
{
|
||||
typedef typename CGAL::Exact_predicates_inexact_constructions_kernel::Point_3 P;
|
||||
typedef OpenMesh::TriMesh_ArrayKernelT<K> Mesh;
|
||||
return CGAL::OM_point_pmap<Mesh, P>(g);
|
||||
}
|
||||
|
||||
// get for intrinsic properties
|
||||
#define CGAL_OM_INTRINSIC_PROPERTY(RET, PROP, TYPE) \
|
||||
template<typename K> \
|
||||
RET \
|
||||
get(PROP p, const OpenMesh::TriMesh_ArrayKernelT<K>& sm, \
|
||||
typename boost::graph_traits< OpenMesh::TriMesh_ArrayKernelT<K> >::TYPE x) \
|
||||
{ return get(get(p, sm), x); } \
|
||||
|
||||
CGAL_OM_INTRINSIC_PROPERTY(int, boost::vertex_index_t, vertex_descriptor)
|
||||
CGAL_OM_INTRINSIC_PROPERTY(int, boost::edge_index_t, edge_descriptor)
|
||||
CGAL_OM_INTRINSIC_PROPERTY(int, boost::halfedge_index_t, halfedge_descriptor)
|
||||
CGAL_OM_INTRINSIC_PROPERTY(int, boost::face_index_t, face_descriptor)
|
||||
// CGAL_OM_INTRINSIC_PROPERTY(std::size_t, boost::halfedge_index_t, face_descriptor)
|
||||
CGAL_OM_INTRINSIC_PROPERTY(typename CGAL::Exact_predicates_inexact_constructions_kernel::Point_3, boost::vertex_point_t, vertex_descriptor)
|
||||
|
||||
#undef CGAL_OM_INTRINSIC_PROPERTY
|
||||
|
||||
// put for intrinsic properties
|
||||
// only available for vertex_point
|
||||
|
||||
template<typename K>
|
||||
void
|
||||
put(boost::vertex_point_t p, OpenMesh::TriMesh_ArrayKernelT<K>& g,
|
||||
typename boost::graph_traits< OpenMesh::TriMesh_ArrayKernelT<K> >::vertex_descriptor vd,
|
||||
const typename K::Point& point)
|
||||
{
|
||||
put(get(p,g), vd, point);
|
||||
}
|
||||
|
||||
|
||||
} // namespace OpenMesh
|
||||
|
||||
|
||||
|
||||
namespace boost {
|
||||
|
||||
template <typename K, typename V>
|
||||
struct property_map<OpenMesh::TriMesh_ArrayKernelT<K>, CGAL::dynamic_vertex_property_t<V> >
|
||||
{
|
||||
typedef OpenMesh::TriMesh_ArrayKernelT<K> SM;
|
||||
typedef typename boost::graph_traits<SM>::vertex_descriptor vertex_descriptor;
|
||||
typedef CGAL::OM_pmap<SM,vertex_descriptor, V> SMPM;
|
||||
typedef CGAL::internal::Dynamic<SM, SMPM> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
template <typename K, typename V>
|
||||
struct property_map<OpenMesh::TriMesh_ArrayKernelT<K>, CGAL::dynamic_halfedge_property_t<V> >
|
||||
{
|
||||
typedef OpenMesh::TriMesh_ArrayKernelT<K> SM;
|
||||
typedef typename boost::graph_traits<SM>::halfedge_descriptor halfedge_descriptor;
|
||||
typedef CGAL::OM_pmap<SM,halfedge_descriptor, V> SMPM;
|
||||
typedef CGAL::internal::Dynamic<SM, SMPM> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
template <typename K, typename V>
|
||||
struct property_map<OpenMesh::TriMesh_ArrayKernelT<K>, CGAL::dynamic_edge_property_t<V> >
|
||||
{
|
||||
typedef OpenMesh::TriMesh_ArrayKernelT<K> SM;
|
||||
typedef typename boost::graph_traits<SM>::edge_descriptor edge_descriptor;
|
||||
typedef CGAL::OM_pmap<SM,edge_descriptor, V> SMPM;
|
||||
typedef CGAL::internal::Dynamic<SM, SMPM> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
template <typename K, typename V>
|
||||
struct property_map<OpenMesh::TriMesh_ArrayKernelT<K>, CGAL::dynamic_face_property_t<V> >
|
||||
{
|
||||
typedef OpenMesh::TriMesh_ArrayKernelT<K> SM;
|
||||
typedef typename boost::graph_traits<SM>::face_descriptor face_descriptor;
|
||||
typedef CGAL::OM_pmap<SM,face_descriptor, V> SMPM;
|
||||
typedef CGAL::internal::Dynamic<SM, SMPM> type;
|
||||
typedef type const_type;
|
||||
};
|
||||
|
||||
} // namespace boost
|
||||
|
||||
|
||||
namespace OpenMesh {
|
||||
|
||||
template <typename K, typename V>
|
||||
typename boost::property_map<OpenMesh::TriMesh_ArrayKernelT<K>, CGAL::dynamic_vertex_property_t<V> >::const_type
|
||||
get(CGAL::dynamic_vertex_property_t<V>, OpenMesh::TriMesh_ArrayKernelT<K>& om)
|
||||
{
|
||||
typedef OpenMesh::TriMesh_ArrayKernelT<K> OM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_vertex_property_t<V> >::SMPM SMPM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_vertex_property_t<V> >::const_type DPM;
|
||||
return DPM(om, new SMPM(om));
|
||||
}
|
||||
|
||||
template <typename K, typename V>
|
||||
typename boost::property_map<OpenMesh::TriMesh_ArrayKernelT<K>, CGAL::dynamic_halfedge_property_t<V> >::const_type
|
||||
get(CGAL::dynamic_halfedge_property_t<V>, OpenMesh::TriMesh_ArrayKernelT<K>& om)
|
||||
{
|
||||
typedef OpenMesh::TriMesh_ArrayKernelT<K> OM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_halfedge_property_t<V> >::SMPM SMPM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_halfedge_property_t<V> >::const_type DPM;
|
||||
return DPM(om, new SMPM(om));
|
||||
}
|
||||
|
||||
template <typename K, typename V>
|
||||
typename boost::property_map<OpenMesh::TriMesh_ArrayKernelT<K>, CGAL::dynamic_edge_property_t<V> >::const_type
|
||||
get(CGAL::dynamic_edge_property_t<V>, OpenMesh::TriMesh_ArrayKernelT<K>& om)
|
||||
{
|
||||
typedef OpenMesh::TriMesh_ArrayKernelT<K> OM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_edge_property_t<V> >::SMPM SMPM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_edge_property_t<V> >::const_type DPM;
|
||||
return DPM(om, new SMPM(om));
|
||||
}
|
||||
|
||||
template <typename K, typename V>
|
||||
typename boost::property_map<OpenMesh::TriMesh_ArrayKernelT<K>, CGAL::dynamic_face_property_t<V> >::const_type
|
||||
get(CGAL::dynamic_face_property_t<V>, OpenMesh::TriMesh_ArrayKernelT<K>& om)
|
||||
{
|
||||
typedef OpenMesh::TriMesh_ArrayKernelT<K> OM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_face_property_t<V> >::SMPM SMPM;
|
||||
typedef typename boost::property_map<OM, CGAL::dynamic_face_property_t<V> >::const_type DPM;
|
||||
return DPM(om, new SMPM(om));
|
||||
}
|
||||
|
||||
// implementation detail: required by Dynamic_property_map_deleter
|
||||
template <typename Pmap, typename K>
|
||||
void remove_property(Pmap pm, OpenMesh::TriMesh_ArrayKernelT<K>& om)
|
||||
{
|
||||
om.remove_property(pm.handle());
|
||||
}
|
||||
|
||||
} // namespace OpenMesh
|
||||
|
||||
#include <OpenMesh/Core/Mesh/PolyMesh_ArrayKernelT.hh>
|
||||
#define OPEN_MESH_CLASS OpenMesh::TriMesh_ArrayKernelT<K>
|
||||
#include <CGAL/boost/graph/properties_OpenMesh.h>
|
||||
|
||||
#endif /* CGAL_PROPERTIES_TRIMESH_ARRAYKERNELT_H */
|
||||
|
|
|
|||
Loading…
Reference in New Issue