From a96911a47d00b5a816f960fde42feeb08d9eaa3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Tayeb?= Date: Wed, 24 Feb 2010 10:56:56 +0000 Subject: [PATCH] Fix cutting_plane plugin. --- .../Polyhedron/Polyhedron_demo_cut_plugin.cpp | 138 +++++++++++------- 1 file changed, 85 insertions(+), 53 deletions(-) diff --git a/Polyhedron/demo/Polyhedron/Polyhedron_demo_cut_plugin.cpp b/Polyhedron/demo/Polyhedron/Polyhedron_demo_cut_plugin.cpp index 95b9a6cd094..2eea18cd66e 100644 --- a/Polyhedron/demo/Polyhedron/Polyhedron_demo_cut_plugin.cpp +++ b/Polyhedron/demo/Polyhedron/Polyhedron_demo_cut_plugin.cpp @@ -1,4 +1,5 @@ #include +#include #include "Messages_interface.h" #include "Scene_item_with_display_list.h" @@ -9,8 +10,9 @@ #include #include -#include +#include #include +#include #include @@ -22,12 +24,13 @@ #include #include -typedef CGAL::Simple_cartesian Simple_cartesian_kernel; +//typedef CGAL::Simple_cartesian Epic_kernel; +typedef CGAL::Exact_predicates_inexact_constructions_kernel Epic_kernel; -typedef class CGAL::AABB_polyhedron_triangle_primitive< - Simple_cartesian_kernel, +typedef class CGAL::AABB_polyhedron_segment_primitive< + Epic_kernel, Polyhedron> AABB_primitive; -typedef class CGAL::AABB_traits AABB_traits; typedef class CGAL::AABB_tree AABB_tree; @@ -131,8 +134,8 @@ public: for(size_t i = 0, end = edges.size(); i < end; ++i) { - const Simple_cartesian_kernel::Point_3& a = edges[i].source(); - const Simple_cartesian_kernel::Point_3& b = edges[i].target(); + const Epic_kernel::Point_3& a = edges[i].source(); + const Epic_kernel::Point_3& b = edges[i].target(); ::glVertex3d(a.x(), a.y(), a.z()); ::glVertex3d(b.x(), b.y(), b.z()); } @@ -140,7 +143,7 @@ public: } public: - std::vector edges; + std::vector edges; }; // end class Scene_edges_item @@ -154,6 +157,8 @@ class Polyhedron_demo_cut_plugin : public: Polyhedron_demo_cut_plugin() : QObject(), edges_item(0) { } + + virtual ~Polyhedron_demo_cut_plugin(); void init(QMainWindow* mainWindow, Scene_interface* scene_interface, Messages_interface* m); @@ -178,6 +183,17 @@ private: Trees trees; }; // end Polyhedron_demo_cut_plugin + +Polyhedron_demo_cut_plugin::~Polyhedron_demo_cut_plugin() +{ + for ( Trees::iterator it = trees.begin(), end = trees.end() ; + it != end ; ++it) + { + delete it->second; + } +} + + void Polyhedron_demo_cut_plugin::init(QMainWindow* mainWindow, Scene_interface* scene_interface, Messages_interface* m) @@ -210,55 +226,71 @@ void Polyhedron_demo_cut_plugin::createCutPlane() { this, SLOT(cut())); scene->addItem(plane_item); actionCreateCutPlane->setEnabled(false); + + // Hide polyhedrons and call cut() (avoid that nothing shows up until user + // decides to move the plane item) + for(size_t i = 0, end = scene->numberOfEntries(); i < end; ++i) { + Scene_item* item = scene->item(i); + Scene_polyhedron_item* poly_item = qobject_cast(item); + if ( NULL != poly_item ) + poly_item->setVisible(false); + } + cut(); } -// ST 27/04/2009: Function disabled -// TODO: Fix compilation with AABB_tree 3.5 - void Polyhedron_demo_cut_plugin::cut() { -// QApplication::setOverrideCursor(Qt::WaitCursor); -// if(!edges_item) { -// edges_item = new Scene_edges_item; -// edges_item->setName("Edges of the cut"); -// edges_item->setColor(Qt::red); -// connect(edges_item, SIGNAL(destroyed()), -// this, SLOT(reset_edges())); -// scene->addItem(edges_item); -// } -// const qglviewer::Vec& pos = plane_item->manipulatedFrame()->position(); -// const qglviewer::Vec& n = -// plane_item->manipulatedFrame()->inverseTransformOf(qglviewer::Vec(0.f, 0.f, 1.f)); -// Simple_cartesian_kernel::Plane_3 plane(n[0], n[1], n[2], - n * pos); -// std::cerr << plane << std::endl; -// edges_item->edges.clear(); -// QTime time; -// time.start(); -// for(size_t i = 0, end = scene->numberOfEntries(); i < end; ++i) { -// Scene_item* item = scene->item(i); -// Scene_polyhedron_item* poly_item = qobject_cast(item); -// if(!poly_item) continue; -// Trees::iterator it = trees.find(poly_item); -// if(it == trees.end()) { -// it = trees.insert(trees.begin(), -// std::make_pair(poly_item, -// new AABB_tree(poly_item->polyhedron()->facets_begin(), -// poly_item->polyhedron()->facets_end() ))); -// Scene_aabb_item* aabb_item = new Scene_aabb_item(*it->second); -// aabb_item->setName(tr("AABB tree of %1").arg(poly_item->name())); -// aabb_item->setRenderingMode(Wireframe); -// aabb_item->setVisible(false); -// scene->addItem(aabb_item); -// std::cerr << "size: " << it->second->size() << std::endl; -// } -// if(!CGAL::do_intersect(plane, it->second->bbox())) -// std::cerr << "no intersection\n"; -// std::cerr << "all_intersection\n"; -// //it->second.all_intersection(plane, std::back_inserter(edges_item->edges)); -// } -// messages->information(QString("cut (%1 ms). %2 edges.").arg(time.elapsed()).arg(edges_item->edges.size())); -// scene->itemChanged(edges_item); -// QApplication::restoreOverrideCursor(); + QApplication::setOverrideCursor(Qt::WaitCursor); + if(!edges_item) { + edges_item = new Scene_edges_item; + edges_item->setName("Edges of the cut"); + edges_item->setColor(Qt::red); + connect(edges_item, SIGNAL(destroyed()), + this, SLOT(reset_edges())); + scene->addItem(edges_item); + } + const qglviewer::Vec& pos = plane_item->manipulatedFrame()->position(); + const qglviewer::Vec& n = + plane_item->manipulatedFrame()->inverseTransformOf(qglviewer::Vec(0.f, 0.f, 1.f)); + Epic_kernel::Plane_3 plane(n[0], n[1], n[2], - n * pos); + //std::cerr << plane << std::endl; + edges_item->edges.clear(); + QTime time; + time.start(); + for(size_t i = 0, end = scene->numberOfEntries(); i < end; ++i) { + Scene_item* item = scene->item(i); + Scene_polyhedron_item* poly_item = qobject_cast(item); + if(!poly_item) continue; + Trees::iterator it = trees.find(poly_item); + if(it == trees.end()) { + it = trees.insert(trees.begin(), + std::make_pair(poly_item, + new AABB_tree(poly_item->polyhedron()->edges_begin(), + poly_item->polyhedron()->edges_end() ))); + Scene_aabb_item* aabb_item = new Scene_aabb_item(*it->second); + aabb_item->setName(tr("AABB tree of %1").arg(poly_item->name())); + aabb_item->setRenderingMode(Wireframe); + aabb_item->setVisible(false); + scene->addItem(aabb_item); + //std::cerr << "size: " << it->second->size() << std::endl; + } + + if(!CGAL::do_intersect(plane, it->second->bbox())) + continue; + + std::vector intersections; + it->second->all_intersected_primitives(plane, std::back_inserter(intersections)); + + for ( std::vector::iterator it = intersections.begin(), + end = intersections.end() ; it != end ; ++it ) + { + edges_item->edges.push_back(it->datum()); + } + } + + messages->information(QString("cut (%1 ms). %2 edges.").arg(time.elapsed()).arg(edges_item->edges.size())); + scene->itemChanged(edges_item); + QApplication::restoreOverrideCursor(); } void Polyhedron_demo_cut_plugin::enableAction() {