polyhedral domain with features works for Surface_mesh and cheese.off (Polyhedron does no longer :(

Conflicts:
	Mesh_3/include/CGAL/Polyhedral_mesh_domain_with_features_3.h
	Surface_mesh/include/CGAL/boost/graph/PMP_properties_Surface_mesh.h
This commit is contained in:
Maxime Gimeno 2017-05-11 16:11:50 +02:00
parent 7bd5016c6d
commit 5db694c154
9 changed files with 123 additions and 33 deletions

View File

@ -127,9 +127,10 @@ Property maps can be wrapped with `Graph_with_descriptor_with_graph_property_map
\cgalModels `MutableFaceGraph` if `Graph` is a model of `MutableFaceGraph`
*/
template<typename Graph>
template<typename Graph_>
struct Graph_with_descriptor_with_graph
{
typedef Graph_ Graph;
Graph* graph;
typedef boost::graph_traits<Graph> gt;

View File

@ -1,3 +1,12 @@
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Mesh_triangulation_3.h>

View File

@ -9,6 +9,7 @@
#include <CGAL/boost/graph/PMP_properties_Surface_mesh.h>
#include <CGAL/Polyhedral_mesh_domain_with_features_3.h>
#include <CGAL/make_mesh_3.h>
#include <CGAL/Timer.h>
// Domain
typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
@ -47,6 +48,8 @@ int main(int argc, char*argv[])
std::cerr << "Error: Cannot read file " << fname << std::endl;
return EXIT_FAILURE;
}
CGAL::Timer t;
t.start();
// Create domain
Mesh_domain domain(polyhedron);
@ -61,6 +64,7 @@ int main(int argc, char*argv[])
// Mesh generation
C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria);
std::cerr << t.time() << " sec." << std::endl;
// Output
std::ofstream medit_file("out.mesh");
c3t3.output_to_medit(medit_file);

View File

@ -270,6 +270,15 @@ get(CGAL::face_patch_id_t<Patch_id>,
return Patch_id_pmap<Gt,Patch_id>();
}
template <typename Gt >
CGAL::static_property_map<typename boost::graph_traits<Polyhedron_3<Gt, Mesh_3::Mesh_polyhedron_items<int> > >::face_descriptor,std::pair<int,int> >
inline get(CGAL::face_patch_id_t<void>, Polyhedron_3<Gt, Mesh_3::Mesh_polyhedron_items<int> >& polyhedron)
{
typedef CGAL::static_property_map<typename boost::graph_traits<Polyhedron_3<Gt, Mesh_3::Mesh_polyhedron_items<int> > >::face_descriptor,std::pair<int,int> > Pmap;
return Pmap(std::make_pair(0,1));
}
template <typename Gt, typename Patch_id>
struct vertex_num_feature_edges_pmap {

View File

@ -83,8 +83,42 @@ max_length(const Bbox_3& b)
// Surface_patch_index_generator
// To use patch_id enclosed in AABB_primitives or not
// -----------------------------------
template < typename Subdomain_index, typename Polyhedron, typename Tag >
// here we had Tag_true instead of Patch_id
template < typename Subdomain_index, typename Polyhedron, typename Patch_id>
struct Surface_patch_index_generator
{
typedef Patch_id Surface_patch_index;
typedef Surface_patch_index type;
template < typename Primitive_id >
Surface_patch_index operator()(const Primitive_id& primitive_id)
{
return primitive_id->patch_id();
}
};
template < typename Subdomain_index, typename P, typename Patch_id>
struct Surface_patch_index_generator<Subdomain_index, Graph_with_descriptor_with_graph<Surface_mesh<P> >, Patch_id>
{
typedef Patch_id Surface_patch_index;
typedef Surface_patch_index type;
template < typename Primitive_id >
Surface_patch_index operator()(const Primitive_id& primitive_id)
{
typedef boost::property_map<Surface_mesh<P>, face_patch_id_t<Patch_id> >::type Fpim;
typename Fpim fpim = get(face_patch_id_t<Patch_id>(),*((*primitive_id).graph));
Surface_patch_index spi = get(fpim, (*primitive_id).descriptor);
return spi;
}
};
template < typename Subdomain_index, typename Polyhedron>
struct Surface_patch_index_generator<Subdomain_index, Polyhedron,void>
{
typedef std::pair<Subdomain_index,Subdomain_index> Surface_patch_index;
typedef Surface_patch_index type;
@ -94,17 +128,6 @@ struct Surface_patch_index_generator
{ return Surface_patch_index(0,1); }
};
template < typename Subdomain_index, typename Polyhedron >
struct Surface_patch_index_generator<Subdomain_index, Polyhedron, CGAL::Tag_true>
{
typedef typename Polyhedron::Face::Patch_id Surface_patch_index; // AF: change for Surface_mesh
typedef Surface_patch_index type;
template < typename Primitive_id >
Surface_patch_index operator()(const Primitive_id& primitive_id)
{ return primitive_id->patch_id(); } // AF partial specialization for GwDwG ??
};
// -----------------------------------
// Index_generator
@ -162,14 +185,18 @@ struct IGT_generator<Gt,CGAL::Tag_false>
template<class Polyhedron,
class IGT_,
class TriangleAccessor=Triangle_accessor_3<Polyhedron,IGT_>,
class Use_patch_id_tag=Tag_false,
class Patch_id_ = void,
class Use_exact_intersection_construction_tag = CGAL::Tag_true>
class Polyhedral_mesh_domain_3
{
typedef typename Mesh_3::details::IGT_generator<
IGT_,Use_exact_intersection_construction_tag>::type IGT;
public:
typedef Patch_id_ Patch_id;
/// Geometric object types
typedef typename IGT::Point_3 Point_3;
typedef typename IGT::Segment_3 Segment_3;
@ -186,7 +213,7 @@ public:
typedef boost::optional<Subdomain_index> Subdomain;
/// Type of indexes for surface patch of the input complex
typedef Mesh_3::details::Surface_patch_index_generator<
Subdomain_index,Polyhedron,Use_patch_id_tag> Surface_patch_index_generator;
Subdomain_index,Polyhedron,Patch_id> Surface_patch_index_generator;
typedef typename Surface_patch_index_generator::type Surface_patch_index;
typedef boost::optional<Surface_patch_index> Surface_patch;
/// Type of indexes to characterize the lowest dimensional face of the input
@ -584,7 +611,7 @@ public:
{
Mesh_3::details::Surface_patch_index_generator<Subdomain_index,
Polyhedron,
Use_patch_id_tag> generator;
Patch_id> generator;
return generator(primitive_id);
}

View File

@ -193,28 +193,27 @@ struct Extract_polyline_with_context_visitor
template < class IGT_,
class Polyhedron_ = typename Mesh_polyhedron_3<IGT_>::type,
class TriangleAccessor=Triangle_accessor_3<Polyhedron_,IGT_>,
class Use_patch_id_tag = Tag_true,
class Patch_id=int,
class Use_exact_intersection_construction_tag = Tag_true >
class Polyhedral_mesh_domain_with_features_3
: public Mesh_domain_with_polyline_features_3<
Polyhedral_mesh_domain_3< Polyhedron_,
IGT_,
TriangleAccessor,
Use_patch_id_tag,
Patch_id,
Use_exact_intersection_construction_tag > >
{
typedef Mesh_domain_with_polyline_features_3<
Polyhedral_mesh_domain_3<
Polyhedron_, IGT_, TriangleAccessor,
Use_patch_id_tag, Use_exact_intersection_construction_tag > > Base;
Patch_id, Use_exact_intersection_construction_tag > > Base;
typedef boost::adjacency_list<
boost::setS, // this avoids parallel edges
boost::vecS,
boost::undirectedS,
typename IGT_::Point_3,
// AF typename Polyhedron_::Vertex::Set_of_indices> Featured_edges_copy_graph;
std::set<int> > Featured_edges_copy_graph;
std::set<Surface_patch_index> > Featured_edges_copy_graph;
public:
typedef Polyhedron_ Polyhedron;
@ -372,9 +371,9 @@ initialize_ts(Polyhedron& p)
typedef boost::property_map<Polyhedron,vertex_time_stamp_t>::type Vtmap;
typedef boost::property_map<Polyhedron,halfedge_time_stamp_t>::type Htmap;
typedef boost::property_map<Polyhedron,face_time_stamp_t>::type Ftmap;
Vtmap vtm;
Htmap htm;
Ftmap ftm;
Vtmap vtm = get(vertex_time_stamp,p);
Htmap htm = get(halfedge_time_stamp,p);
Ftmap ftm = get(face_time_stamp,p);
std::size_t ts = 0;
BOOST_FOREACH(typename boost::graph_traits<Polyhedron>::vertex_descriptor vd, vertices(p))
@ -437,10 +436,9 @@ detect_features(FT angle_in_degree, std::vector<Polyhedron>& poly)
// TODO: replace this map by and unordered_map
P2vmap p2vmap;
typedef int ID; // AF
typedef typename boost::property_map<Polyhedron,face_patch_id_t<ID> >::type Face_patch_id_pmap;
CGAL::Polygon_mesh_processing::Detect_features_in_polyhedra<Polyhedron,Face_patch_id_pmap> detect_features(get(face_patch_id_t<ID>(), poly.front()));
typedef typename boost::property_map<Polyhedron,face_patch_id_t<Patch_id> >::type Face_patch_id_pmap;
CGAL::Polygon_mesh_processing::Detect_features_in_polyhedra<Polyhedron,Face_patch_id_pmap> detect_features(get(face_patch_id_t<Patch_id>(), poly.front()));
BOOST_FOREACH(Polyhedron& p, poly)
{
@ -544,9 +542,8 @@ add_featured_edges_to_graph(const Polyhedron& p,
}
}
typedef int ID; // AF
typedef typename boost::property_map<Polyhedron,face_patch_id_t<ID> >::type Face_patch_id_pmap;
Face_patch_id_pmap fpm = get(face_patch_id_t<ID>(),p);
typedef typename boost::property_map<Polyhedron,face_patch_id_t<Patch_id> >::type Face_patch_id_pmap;
Face_patch_id_pmap fpm = get(face_patch_id_t<Patch_id>(),p);
BOOST_FOREACH(Graph_edge_descriptor e, edges(graph)){
vertex_descriptor vs = p2vmap[get(vpm,source(e,graph))];

View File

@ -292,7 +292,8 @@ struct vertex_incident_patches_pmap {
}
};
inline vertex_incident_patches_pmap get(CGAL::vertex_incident_patches_t, const Polyhedron&)
template<typename Pid>
inline vertex_incident_patches_pmap get(CGAL::vertex_incident_patches_t<Pid>, const Polyhedron&)
{
return vertex_incident_patches_pmap();
}
@ -343,8 +344,8 @@ namespace boost {
{
typedef vertex_num_feature_edges_pmap type;
};
template <>
struct property_map<Polyhedron, CGAL::vertex_incident_patches_t>
template <typename Pid>
struct property_map<Polyhedron, CGAL::vertex_incident_patches_t<Pid> >
{
typedef vertex_incident_patches_pmap type;
};

View File

@ -40,6 +40,14 @@ inline get(CGAL::face_patch_id_t<I>, SMesh& smesh)
}
CGAL::static_property_map<boost::graph_traits<SMesh> ::face_descriptor,std::pair<int,int> >
inline get(CGAL::face_patch_id_t<void>, SMesh & smesh)
{
typedef CGAL::static_property_map<boost::graph_traits<SMesh>::face_descriptor,
std::pair<int,int> > Pmap;
return Pmap(std::make_pair(0,1));
}
SMesh::Property_map< boost::graph_traits<SMesh >::face_descriptor,int>
inline get(CGAL::face_selection_t, SMesh& smesh)
@ -91,6 +99,15 @@ struct property_map<SMesh, CGAL::face_patch_id_t<I> >
typedef SMesh::Property_map<face_descriptor, I> type;
};
template <>
struct property_map<SMesh, CGAL::face_patch_id_t<void> >
{
typedef typename boost::graph_traits<SMesh>::face_descriptor face_descriptor;
typedef CGAL::static_property_map< boost::graph_traits<SMesh>::face_descriptor,std::pair<int,int> > type;
typedef type const_type;
};
template<>

View File

@ -39,6 +39,31 @@ namespace CGAL {
/// \cond SKIP_DOXYGEN
template <typename K, typename V>
class static_property_map
{
typedef K key_type;
typedef const V& value_type;
typedef const V& reference;
typedef boost::read_write_property_map_tag category;
V v;
public:
static_property_map(V pv)
:v(pv){}
inline friend
value_type
get(const static_property_map& pm, const key_type&)
{
return pm.v;
}
inline friend
void
put(static_property_map& pm, const key_type&, const value_type&)
{}
};
template <typename PM1, typename PM2>
class OR_property_map {