diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt b/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt index 6564637b814..0c603e0ea30 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/CMakeLists.txt @@ -96,7 +96,11 @@ target_link_libraries(selection_sm_plugin scene_surface_mesh_selection_item scen target_compile_definitions(selection_sm_plugin PUBLIC "-DUSE_SURFACE_MESH" ) polyhedron_demo_plugin(self_intersection_plugin Self_intersection_plugin) -target_link_libraries(self_intersection_plugin scene_polyhedron_item scene_polyhedron_selection_item scene_surface_mesh_item) +target_link_libraries(self_intersection_plugin scene_polyhedron_item scene_polyhedron_selection_item ) + +polyhedron_demo_plugin(self_intersection_sm_plugin Self_intersection_plugin) +target_link_libraries(self_intersection_sm_plugin scene_surface_mesh_selection_item scene_surface_mesh_item) +target_compile_definitions(self_intersection_sm_plugin PUBLIC "-DUSE_SURFACE_MESH" ) polyhedron_demo_plugin(triangulate_facets_plugin Triangulate_facets_plugin) target_link_libraries(triangulate_facets_plugin scene_polyhedron_item scene_surface_mesh_item) diff --git a/Polyhedron/demo/Polyhedron/Plugins/PMP/Self_intersection_plugin.cpp b/Polyhedron/demo/Polyhedron/Plugins/PMP/Self_intersection_plugin.cpp index cef78673269..d7827a4b548 100644 --- a/Polyhedron/demo/Polyhedron/Plugins/PMP/Self_intersection_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Plugins/PMP/Self_intersection_plugin.cpp @@ -2,15 +2,7 @@ #include #include #include -#include "opengl_tools.h" -#include "Kernel_type.h" -#include "Polyhedron_type.h" -#include "Scene_polyhedron_item.h" -#include "Scene_surface_mesh_item.h" -#include "Scene_polyhedron_selection_item.h" - #include - #include #include #include @@ -18,6 +10,19 @@ #include #include +#include "opengl_tools.h" +#include "Kernel_type.h" +#include "Scene_polyhedron_selection_item.h" + +#ifdef USE_SURFACE_MESH +#include "Scene_surface_mesh_item.h" +typedef Scene_surface_mesh_item Scene_face_graph_item; +#else +#include "Scene_polyhedron_item.h" +typedef Scene_polyhedron_item Scene_face_graph_item; +#endif + +typedef Scene_face_graph_item::Face_graph Face_graph; typedef Kernel::Triangle_3 Triangle; using namespace CGAL::Three; class Polyhedron_demo_self_intersection_plugin : @@ -49,8 +54,7 @@ public: bool applicable(QAction*) const { return - (qobject_cast(scene->item(scene->mainSelectionIndex())) || - qobject_cast(scene->item(scene->mainSelectionIndex()))); + qobject_cast(scene->item(scene->mainSelectionIndex())); } public Q_SLOTS: @@ -79,54 +83,42 @@ bool selfIntersect(Mesh* mesh, std::vector::face_descriptor Face_descriptor; - typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; - typedef Surface_mesh::Vertex_index Vertex_index; + typedef boost::graph_traits::face_descriptor Face_descriptor; + typedef boost::graph_traits::halfedge_descriptor halfedge_descriptor; QApplication::setOverrideCursor(Qt::WaitCursor); bool found = false; - std::vector selected_polys; - std::vector selected_sms; + std::vector selected_polys; Q_FOREACH(Scene_interface::Item_id index, scene->selectionIndices()) { - Scene_polyhedron_item* poly_item = - qobject_cast(scene->item(index)); + Scene_face_graph_item* poly_item = + qobject_cast(scene->item(index)); if(poly_item) { selected_polys.push_back(poly_item); } - else - { - Scene_surface_mesh_item* sm_item = - qobject_cast(scene->item(index)); - if(sm_item) - { - selected_sms.push_back(sm_item); - } - } } - Q_FOREACH(Scene_polyhedron_item* poly_item, selected_polys) + Q_FOREACH(Scene_face_graph_item* poly_item, selected_polys) { - typedef boost::graph_traits::face_descriptor Face_descriptor; - Polyhedron* pMesh = poly_item->polyhedron(); - std::vector > facets; - // add intersecting triangles to a selection_item. - if(selfIntersect(pMesh, facets)) + Face_graph* mesh = poly_item->face_graph(); + std::vector > faces; + // add intersecting triangles to a new Surface_mesh. + if(selfIntersect(mesh, faces)) { + //add the faces Scene_polyhedron_selection_item* selection_item = new Scene_polyhedron_selection_item(poly_item, mw); - for(std::vector >::iterator fb = facets.begin(); - fb != facets.end(); ++fb) { + for(std::vector >::iterator fb = faces.begin(); + fb != faces.end(); ++fb) { selection_item->selected_facets.insert(fb->first); selection_item->selected_facets.insert(fb->second); - Polyhedron::Halfedge_around_facet_circulator hc = (fb->first)->facet_begin(), cend = hc; - CGAL_For_all(hc,cend) { - selection_item->selected_edges.insert(edge(hc, *selection_item->polyhedron())); + //add the edges + BOOST_FOREACH(halfedge_descriptor he_circ, halfedges_around_face( halfedge(fb->first, *mesh), *mesh)) + { + selection_item->selected_edges.insert(edge(he_circ, *mesh)); } - hc = (fb->second)->facet_begin(); - cend = hc; - CGAL_For_all(hc,cend) { - selection_item->selected_edges.insert(edge(hc, *selection_item->polyhedron())); + BOOST_FOREACH(halfedge_descriptor he_circ, halfedges_around_face( halfedge(fb->second, *mesh), *mesh)) + { + selection_item->selected_edges.insert(edge(he_circ, *mesh)); } } selection_item->invalidateOpenGLBuffers(); @@ -138,51 +130,6 @@ void Polyhedron_demo_self_intersection_plugin::on_actionSelfIntersection_trigger found = true; } } - - Q_FOREACH(Scene_surface_mesh_item* sm_item, selected_sms) - { - Surface_mesh* sMesh = sm_item->polyhedron(); - std::vector > faces; - // add intersecting triangles to a new Surface_mesh. - if(selfIntersect(sMesh, faces)) - { - //add the faces - Surface_mesh* new_mesh = new Surface_mesh(); - for(std::vector >::iterator fb = faces.begin(); - fb != faces.end(); ++fb) - { - std::vector face_vertices; - BOOST_FOREACH(halfedge_descriptor he_circ, halfedges_around_face( halfedge(fb->first, *sMesh), *sMesh)) - { - face_vertices.push_back(new_mesh->add_vertex(get(sMesh->points(), target(he_circ, *sMesh)))); - } - new_mesh->add_face(face_vertices); - face_vertices.clear(); - BOOST_FOREACH(halfedge_descriptor he_circ, halfedges_around_face( halfedge(fb->second, *sMesh), *sMesh)) - { - face_vertices.push_back(new_mesh->add_vertex(get(sMesh->points(), target(he_circ, *sMesh)))); - } - new_mesh->add_face(face_vertices); - } - //add the edges - BOOST_FOREACH(Face_descriptor fd, new_mesh->faces()) - { - BOOST_FOREACH(halfedge_descriptor he_circ, halfedges_around_face( halfedge(fd, *new_mesh), *new_mesh)) - { - new_mesh->add_edge(source(he_circ, *new_mesh), target(he_circ, *new_mesh)); - } - } - Scene_surface_mesh_item* ism_item = new Scene_surface_mesh_item(new_mesh); - ism_item->invalidateOpenGLBuffers(); - ism_item->setName(tr("%1(intersecting triangles)").arg(sm_item->name())); - ism_item->setColor(QColor(Qt::gray).darker(200)); - sm_item->setRenderingMode(Wireframe); - scene->addItem(ism_item); - scene->itemChanged(sm_item); - scene->itemChanged(ism_item); - found = true; - } - } QApplication::restoreOverrideCursor(); if(!found) QMessageBox::information(mw, tr("No self intersection"),