Add triangulate_polygons() to the demo

This commit is contained in:
Mael Rouxel-Labbé 2023-03-29 15:30:56 +02:00
parent 8a39016780
commit e5c8323825
4 changed files with 76 additions and 42 deletions

View File

@ -100,7 +100,7 @@ add_custom_target(self_intersection_plugin)
add_dependencies(self_intersection_plugin selection_plugin) add_dependencies(self_intersection_plugin selection_plugin)
polyhedron_demo_plugin(triangulate_facets_plugin Triangulate_facets_plugin KEYWORDS PMP) polyhedron_demo_plugin(triangulate_facets_plugin Triangulate_facets_plugin KEYWORDS PMP)
target_link_libraries(triangulate_facets_plugin PUBLIC scene_surface_mesh_item scene_selection_item) target_link_libraries(triangulate_facets_plugin PUBLIC scene_surface_mesh_item scene_selection_item scene_polygon_soup_item)
polyhedron_demo_plugin(corefinement_plugin Corefinement_plugin KEYWORDS PMP) polyhedron_demo_plugin(corefinement_plugin Corefinement_plugin KEYWORDS PMP)
target_link_libraries(corefinement_plugin PUBLIC scene_surface_mesh_item) target_link_libraries(corefinement_plugin PUBLIC scene_surface_mesh_item)

View File

@ -4,10 +4,13 @@
#include "Messages_interface.h" #include "Messages_interface.h"
#include <CGAL/Three/Polyhedron_demo_plugin_helper.h> #include <CGAL/Three/Polyhedron_demo_plugin_helper.h>
#include <CGAL/Three/Three.h> #include <CGAL/Three/Three.h>
#include "Scene_surface_mesh_item.h" #include "Scene_surface_mesh_item.h"
#include "Scene_polyhedron_selection_item.h" #include "Scene_polyhedron_selection_item.h"
#include "Scene_polygon_soup_item.h"
#include <CGAL/Polygon_mesh_processing/triangulate_faces.h> #include <CGAL/Polygon_mesh_processing/triangulate_faces.h>
using namespace CGAL::Three; using namespace CGAL::Three;
class Polyhedron_demo_triangulate_facets_plugin : class Polyhedron_demo_triangulate_facets_plugin :
public QObject, public QObject,
@ -20,13 +23,13 @@ class Polyhedron_demo_triangulate_facets_plugin :
typedef Scene_surface_mesh_item::Face_graph FaceGraph; typedef Scene_surface_mesh_item::Face_graph FaceGraph;
typedef boost::graph_traits<FaceGraph>::face_descriptor face_descriptor; typedef boost::graph_traits<FaceGraph>::face_descriptor face_descriptor;
struct Visitor struct Selection_updater_visitor
: public CGAL::Polygon_mesh_processing::Hole_filling::Default_visitor : public CGAL::Polygon_mesh_processing::Hole_filling::Default_visitor
{ {
typedef typename Scene_polyhedron_selection_item::Selection_set_facet Container; typedef typename Scene_polyhedron_selection_item::Selection_set_facet Container;
Container& faces; Container& faces;
Visitor(Container& container) Selection_updater_visitor(Container& container)
: faces(container) : faces(container)
{} {}
void before_subface_creations(face_descriptor fd) void before_subface_creations(face_descriptor fd)
@ -67,6 +70,8 @@ public:
return true; return true;
if ( qobject_cast<Scene_polyhedron_selection_item*>(scene->item(index))) if ( qobject_cast<Scene_polyhedron_selection_item*>(scene->item(index)))
return true; return true;
if(qobject_cast<Scene_polygon_soup_item*>(scene->item(index)))
return true;
} }
return false; return false;
} }
@ -83,39 +88,54 @@ public Q_SLOTS:
Scene_polyhedron_selection_item* selection_item = Scene_polyhedron_selection_item* selection_item =
qobject_cast<Scene_polyhedron_selection_item*>(scene->item(index)); qobject_cast<Scene_polyhedron_selection_item*>(scene->item(index));
SMesh* pMesh = (sm_item != nullptr) Scene_polygon_soup_item* soup_item =
? sm_item->polyhedron() qobject_cast<Scene_polygon_soup_item*>(scene->item(index));
: selection_item->polyhedron();
if(!pMesh) continue; if (soup_item)
if(is_triangle_mesh(*pMesh)) {
CGAL::Three::Three::warning(tr("The polyhedron \"%1\" is already triangulated.")
.arg(sm_item->name()) );
continue;
}
if (sm_item)
{ {
if (!CGAL::Polygon_mesh_processing::triangulate_faces(*pMesh)) soup_item->triangulate();
CGAL::Three::Three::warning(tr("Some facets could not be triangulated."));
} }
else if (selection_item) else
{ {
Visitor visitor(selection_item->selected_facets); SMesh* pMesh = (sm_item != nullptr) ? sm_item->polyhedron()
if (!CGAL::Polygon_mesh_processing::triangulate_faces( : selection_item->polyhedron();
selection_item->selected_facets,
*pMesh,
CGAL::parameters::visitor(visitor)))
CGAL::Three::Three::warning(tr("Some facets could not be triangulated."));
sm_item = selection_item->polyhedron_item(); if(!pMesh)
selection_item->set_num_faces(num_faces(*sm_item->face_graph())); continue;
selection_item->invalidateOpenGLBuffers(); if(is_triangle_mesh(*pMesh))
selection_item->itemChanged(); {
CGAL::Three::Three::warning(tr("The polyhedron \"%1\" is already triangulated.")
.arg(sm_item->name()) );
continue;
}
if (sm_item)
{
if (!CGAL::Polygon_mesh_processing::triangulate_faces(*pMesh))
CGAL::Three::Three::warning(tr("Some facets could not be triangulated."));
sm_item->invalidateOpenGLBuffers();
}
else if (selection_item)
{
Selection_updater_visitor visitor(selection_item->selected_facets);
if (!CGAL::Polygon_mesh_processing::triangulate_faces(
selection_item->selected_facets,
*pMesh,
CGAL::parameters::visitor(visitor)))
CGAL::Three::Three::warning(tr("Some facets could not be triangulated."));
sm_item = selection_item->polyhedron_item();
selection_item->set_num_faces(num_faces(*sm_item->face_graph()));
selection_item->invalidateOpenGLBuffers();
selection_item->itemChanged();
}
sm_item->resetColors(); // @todo should have a visitor to give the color of the parent face
} }
sm_item->resetColors();
sm_item->invalidateOpenGLBuffers();
scene->itemChanged(sm_item); scene->itemChanged(sm_item);
} // end of the loop on the selected items } // end of the loop on the selected items

View File

@ -22,6 +22,7 @@
#include <CGAL/Polygon_mesh_processing/orientation.h> #include <CGAL/Polygon_mesh_processing/orientation.h>
#include <CGAL/Polygon_mesh_processing/repair.h> #include <CGAL/Polygon_mesh_processing/repair.h>
#include <CGAL/Polygon_mesh_processing/repair_polygon_soup.h> #include <CGAL/Polygon_mesh_processing/repair_polygon_soup.h>
#include <CGAL/Polygon_mesh_processing/triangulate_faces.h>
#include <CGAL/Polygon_2.h> #include <CGAL/Polygon_2.h>
#include <CGAL/version.h> #include <CGAL/version.h>
@ -419,6 +420,32 @@ void Scene_polygon_soup_item::inside_out()
invalidateOpenGLBuffers(); invalidateOpenGLBuffers();
} }
void Scene_polygon_soup_item::repair(bool erase_dup, bool req_same_orientation)
{
QApplication::setOverrideCursor(Qt::BusyCursor);
CGAL::Polygon_mesh_processing::repair_polygon_soup(
d->soup->points,
d->soup->polygons,
CGAL::parameters::erase_all_duplicates(erase_dup)
.require_same_orientation(req_same_orientation));
QApplication::restoreOverrideCursor();
invalidateOpenGLBuffers();
}
bool Scene_polygon_soup_item::triangulate()
{
QApplication::setOverrideCursor(Qt::BusyCursor);
bool success = true;
CGAL::Polygon_mesh_processing::triangulate_polygons(d->soup->points, d->soup->polygons);
QApplication::restoreOverrideCursor();
invalidateOpenGLBuffers();
return success;
}
bool bool
Scene_polygon_soup_item::orient(std::vector<std::size_t>& non_manifold_vertices) Scene_polygon_soup_item::orient(std::vector<std::size_t>& non_manifold_vertices)
{ {
@ -894,20 +921,6 @@ void Scene_polygon_soup_item::computeElements() const
QApplication::restoreOverrideCursor(); QApplication::restoreOverrideCursor();
} }
void Scene_polygon_soup_item::repair(bool erase_dup, bool req_same_orientation)
{
QApplication::setOverrideCursor(Qt::BusyCursor);
CGAL::Polygon_mesh_processing::repair_polygon_soup(
d->soup->points,
d->soup->polygons,
CGAL::parameters::
erase_all_duplicates(erase_dup)
.require_same_orientation(req_same_orientation));
QApplication::restoreOverrideCursor();
// CGAL::Three::Three::information(
}
CGAL::Three::Scene_item::Header_data Scene_polygon_soup_item::header() const CGAL::Three::Scene_item::Header_data Scene_polygon_soup_item::header() const
{ {
CGAL::Three::Scene_item::Header_data data; CGAL::Three::Scene_item::Header_data data;

View File

@ -187,6 +187,7 @@ public Q_SLOTS:
bool exportAsSurfaceMesh(SMesh*); bool exportAsSurfaceMesh(SMesh*);
void inside_out(); void inside_out();
void repair(bool erase_dup, bool req_same_orientation); void repair(bool erase_dup, bool req_same_orientation);
bool triangulate();
void setDisplayNonManifoldEdges(const bool); void setDisplayNonManifoldEdges(const bool);
bool displayNonManifoldEdges() const; bool displayNonManifoldEdges() const;