Mesh_3_demo:

+ Add progress information in the message box which pops-up at optimization process launch
This commit is contained in:
Stéphane Tayeb 2010-06-21 15:59:15 +00:00
parent ed0b940802
commit 1fe95b701d
4 changed files with 236 additions and 18 deletions

View File

@ -63,6 +63,8 @@ class Mesh_3_optimization_plugin :
Q_OBJECT Q_OBJECT
Q_INTERFACES(Plugin_interface); Q_INTERFACES(Plugin_interface);
public: public:
Mesh_3_optimization_plugin();
virtual void init(QMainWindow*, Scene_interface*, Messages_interface*); virtual void init(QMainWindow*, Scene_interface*, Messages_interface*);
inline virtual QList<QAction*> actions() const; inline virtual QList<QAction*> actions() const;
@ -73,6 +75,7 @@ public slots:
void exude(); void exude();
void optimization_done(Optimizer_thread* t); void optimization_done(Optimizer_thread* t);
void status_report(QString s);
private: private:
Scene_c3t3_item* get_c3t3_item() const; Scene_c3t3_item* get_c3t3_item() const;
@ -94,6 +97,18 @@ private:
}; // end class Mesh_3_optimization_plugin }; // end class Mesh_3_optimization_plugin
Mesh_3_optimization_plugin::
Mesh_3_optimization_plugin()
: actionOdt(NULL)
, actionLloyd(NULL)
, actionPerturb(NULL)
, actionExude(NULL)
, msg(NULL)
, message_box_(NULL)
, source_item_(NULL)
{
}
void void
Mesh_3_optimization_plugin:: Mesh_3_optimization_plugin::
init(QMainWindow* mainWindow, init(QMainWindow* mainWindow,
@ -508,10 +523,23 @@ launch_thread(Optimizer_thread* opt_thread, const QString& window_text)
QObject::connect(opt_thread, SIGNAL(done(Optimizer_thread*)), QObject::connect(opt_thread, SIGNAL(done(Optimizer_thread*)),
this, SLOT(optimization_done(Optimizer_thread*))); this, SLOT(optimization_done(Optimizer_thread*)));
QObject::connect(opt_thread, SIGNAL(status_report(QString)),
this, SLOT(status_report(QString)));
opt_thread->start(); opt_thread->start();
} }
void
Mesh_3_optimization_plugin::
status_report(QString str)
{
if ( NULL == message_box_ ) { return; }
message_box_->setInformativeText(str);
}
QString QString
translate(CGAL::Mesh_optimization_return_code rc) translate(CGAL::Mesh_optimization_return_code rc)
{ {

View File

@ -11,10 +11,21 @@
#include <CGAL/Bbox_3.h> #include <CGAL/Bbox_3.h>
#include <fstream> #include <fstream>
#include <cstddef>
namespace cgp = CGAL::parameters; namespace cgp = CGAL::parameters;
// -----------------------------------
// Helper function
// -----------------------------------
QString translate_bool(const bool b)
{
return b ? QString("done")
: QString("in progress");
}
// ----------------------------------- // -----------------------------------
// Optimization_function_base template class // Optimization_function_base template class
// ----------------------------------- // -----------------------------------
@ -155,6 +166,89 @@ Optimizer_thread* cgal_code_optimization(Scene_c3t3_item& c3t3_item,
// -----------------------------------
// Global optimization
// -----------------------------------
struct Global_optimization_status
{
bool compute_moves_done;
bool move_points_done;
bool rebuild_restricted_delaunay_done;
int iteration_done;
Global_optimization_status()
: compute_moves_done(false)
, move_points_done(false)
, rebuild_restricted_delaunay_done(false)
, iteration_done(-1) {}
};
struct Global_visitor
{
Global_visitor(Global_optimization_status* status) : p_status_(status) {}
Global_visitor(const Global_visitor& rhs) : p_status_(rhs.p_status_) {}
void after_compute_moves() { p_status_->compute_moves_done = true; }
void after_move_points() { p_status_->move_points_done = true; }
void after_rebuild_restricted_delaunay() { p_status_->rebuild_restricted_delaunay_done = true; }
void end_of_iteration(int iteration_number)
{
p_status_->iteration_done = iteration_number;
p_status_->compute_moves_done = false;
p_status_->move_points_done = false;
p_status_->rebuild_restricted_delaunay_done = false;
}
private:
Global_optimization_status* p_status_;
};
template <typename Domain>
class Global_optimization_function
: public Optimization_function_base< Domain >
{
typedef Global_visitor Visitor;
typedef Optimization_function_base< Domain > Base;
public:
/// Constructor
Global_optimization_function(C3t3& c3t3, Domain* d)
: Base(c3t3,d)
, status_() {}
/// Destructor
virtual ~Global_optimization_function() {}
// Logs
virtual QString status(double time_period) const
{
QString res = QString("Iteration %1<br /><br />"
"Compute moves: %2<br />")
.arg(status_.iteration_done + 2)
.arg(translate_bool(status_.compute_moves_done));
if ( status_.compute_moves_done )
{
res += QString("Move points: %1<br />")
.arg(translate_bool(status_.move_points_done));
}
if ( status_.move_points_done )
{
res += QString("Rebuild restricted Delaunay: %1")
.arg(translate_bool(status_.rebuild_restricted_delaunay_done));
}
return res;
}
protected:
Global_optimization_status status_;
};
// ----------------------------------- // -----------------------------------
// Odt // Odt
// ----------------------------------- // -----------------------------------
@ -183,7 +277,7 @@ struct Odt_parameters
*/ */
template <typename Domain> template <typename Domain>
class Optimization_function < Domain, Odt_parameters > class Optimization_function < Domain, Odt_parameters >
: public Optimization_function_base< Domain > : public Global_optimization_function< Domain >
{ {
// Private types // Private types
typedef C3t3::Triangulation Tr; typedef C3t3::Triangulation Tr;
@ -191,10 +285,11 @@ class Optimization_function < Domain, Odt_parameters >
typedef CGAL::Mesh_3::Mesh_sizing_field<Tr> Sizing; typedef CGAL::Mesh_3::Mesh_sizing_field<Tr> Sizing;
typedef CGAL::Mesh_3::Odt_move<C3t3,Sizing> Move; typedef CGAL::Mesh_3::Odt_move<C3t3,Sizing> Move;
typedef Global_visitor Visitor;
typedef typename CGAL::Mesh_3::Mesh_global_optimizer<C3t3,Domain,Move> Odt_optimizer; typedef typename CGAL::Mesh_3::Mesh_global_optimizer<C3t3,Domain,Move,Visitor> Odt_optimizer;
typedef Optimization_function_base< Domain > Base; typedef Global_optimization_function< Domain > Base;
public: public:
/// Constructor /// Constructor
@ -233,7 +328,7 @@ protected:
: p_.max_iteration_nb; : p_.max_iteration_nb;
// Launch optimization // Launch optimization
return (*odt_)(max_iteration_nb); return (*odt_)(max_iteration_nb, Visitor(&(this->status_)));
} }
private: private:
@ -292,7 +387,7 @@ struct Lloyd_parameters
*/ */
template <typename Domain> template <typename Domain>
class Optimization_function < Domain, Lloyd_parameters > class Optimization_function < Domain, Lloyd_parameters >
: public Optimization_function_base< Domain > : public Global_optimization_function< Domain >
{ {
// Private types // Private types
typedef C3t3::Triangulation Tr; typedef C3t3::Triangulation Tr;
@ -300,10 +395,11 @@ class Optimization_function < Domain, Lloyd_parameters >
typedef CGAL::Mesh_3::Mesh_sizing_field<Tr> Sizing; typedef CGAL::Mesh_3::Mesh_sizing_field<Tr> Sizing;
typedef CGAL::Mesh_3::Lloyd_move<C3t3,Sizing> Move; typedef CGAL::Mesh_3::Lloyd_move<C3t3,Sizing> Move;
typedef Global_visitor Visitor;
typedef typename CGAL::Mesh_3::Mesh_global_optimizer<C3t3,Domain,Move> Lloyd_optimizer; typedef typename CGAL::Mesh_3::Mesh_global_optimizer<C3t3,Domain,Move,Visitor> Lloyd_optimizer;
typedef Optimization_function_base< Domain > Base; typedef Global_optimization_function< Domain > Base;
public: public:
/// Constructor /// Constructor
@ -342,7 +438,7 @@ protected:
: p_.max_iteration_nb; : p_.max_iteration_nb;
// Launch optimization // Launch optimization
return (*lloyd_)(max_iteration_nb); return (*lloyd_)(max_iteration_nb, Visitor(&(this->status_)));
} }
private: private:
@ -390,6 +486,27 @@ struct Perturb_parameters
}; };
struct Perturb_status
{
double bound_reached;
double vertices_left;
Perturb_status() : bound_reached(0), vertices_left(0) {}
};
struct Perturb_visitor
{
Perturb_visitor(Perturb_status* status) : p_status_(status) {}
Perturb_visitor(const Perturb_visitor& rhs) : p_status_(rhs.p_status_) {}
void bound_reached(const double bound) { p_status_->bound_reached = bound; }
void end_of_perturbation_iteration(std::size_t v) { p_status_->vertices_left = v;}
private:
Perturb_status* p_status_;
};
/** /**
* @class Perturb_function * @class Perturb_function
* Partial specialization of class Optimization_function for perturbation * Partial specialization of class Optimization_function for perturbation
@ -400,10 +517,11 @@ class Optimization_function < Domain, Perturb_parameters >
: public Optimization_function_base< Domain > : public Optimization_function_base< Domain >
{ {
// Private types // Private types
typedef C3t3::Triangulation::Geom_traits Gt; typedef C3t3::Triangulation::Geom_traits Gt;
typedef CGAL::Mesh_3::Min_dihedral_angle_criterion<Gt> Sc; typedef CGAL::Mesh_3::Min_dihedral_angle_criterion<Gt> Sc;
typedef Perturb_visitor Visitor;
typedef CGAL::Mesh_3::Sliver_perturber<C3t3,Domain,Sc> Perturber; typedef CGAL::Mesh_3::Sliver_perturber<C3t3,Domain,Sc,Visitor> Perturber;
typedef Optimization_function_base< Domain > Base; typedef Optimization_function_base< Domain > Base;
@ -423,6 +541,13 @@ public:
/// Log strings /// Log strings
virtual QString name() const { return QString("Perturb"); } virtual QString name() const { return QString("Perturb"); }
virtual QStringList parameters_log() const { return p_.log(); } virtual QStringList parameters_log() const { return p_.log(); }
virtual QString status(double time_period) const
{
return QString("Dihedral angle reached: %1<br /><br />"
"Vertices left in queue (to reach next bound): %2")
.arg(status_.bound_reached)
.arg(status_.vertices_left);
}
protected: protected:
/// Launch sliver perturbation /// Launch sliver perturbation
@ -450,14 +575,17 @@ protected:
// Set max time // Set max time
perturb_->set_time_limit(p_.time_limit); perturb_->set_time_limit(p_.time_limit);
// Set sliver bound (0 means no sliver bound)
if ( 0 == p_.sliver_bound ) { p_.sliver_bound = Sc::max_value; }
// Launch perturber // Launch perturber
if ( p_.sliver_bound != 0 ) { return (*perturb_)(p_.sliver_bound); } return (*perturb_)(p_.sliver_bound, 1, Visitor(&status_));
else { return (*perturb_)(); }
} }
private: private:
Perturber* perturb_; Perturber* perturb_;
Perturb_parameters p_; Perturb_parameters p_;
Perturb_status status_;
}; };
@ -495,6 +623,26 @@ struct Exude_parameters
}; };
struct Exude_status
{
double cells_left_in_queue;
double vertices_pumped;
Exude_status() : cells_left_in_queue(0), vertices_pumped(0) {}
};
struct Exude_visitor
{
Exude_visitor(Exude_status* status) : p_status_(status) {}
Exude_visitor(const Exude_visitor& rhs) : p_status_(rhs.p_status_) {}
void after_cell_pumped(std::size_t n) { p_status_->cells_left_in_queue = n; }
private:
Exude_status* p_status_;
};
/** /**
* @class Exude_function * @class Exude_function
* Partial specialization of class Optimization_function for exudation * Partial specialization of class Optimization_function for exudation
@ -507,7 +655,8 @@ class Optimization_function < Domain, Exude_parameters >
// Private types // Private types
typedef C3t3::Triangulation::Geom_traits Gt; typedef C3t3::Triangulation::Geom_traits Gt;
typedef CGAL::Mesh_3::Min_dihedral_angle_criterion<Gt> Sc; typedef CGAL::Mesh_3::Min_dihedral_angle_criterion<Gt> Sc;
typedef CGAL::Mesh_3::Slivers_exuder<C3t3, Sc> Exuder; typedef Exude_visitor Visitor;
typedef CGAL::Mesh_3::Slivers_exuder<C3t3,Sc,Visitor> Exuder;
typedef Optimization_function_base< Domain > Base; typedef Optimization_function_base< Domain > Base;
@ -527,6 +676,13 @@ public:
// Log strings // Log strings
virtual QString name() const { return QString("Exude"); } virtual QString name() const { return QString("Exude"); }
virtual QStringList parameters_log() const { return p_.log(); } virtual QStringList parameters_log() const { return p_.log(); }
virtual QString status(double time_period) const
{
return QString("Cells left in queue: %1<br />")
//"Vertices pumped: %2")
.arg(status_.cells_left_in_queue);
//.arg(status_.vertices_pumped);
}
protected: protected:
/// Launch sliver exudation /// Launch sliver exudation
@ -544,12 +700,13 @@ protected:
exude_->set_time_limit(p_.time_limit); exude_->set_time_limit(p_.time_limit);
// Launch exudation // Launch exudation
return (*exude_)(p_.sliver_bound); return (*exude_)(p_.sliver_bound, Visitor(&status_));
} }
private: private:
Exuder* exude_; Exuder* exude_;
Exude_parameters p_; Exude_parameters p_;
Exude_status status_;
}; };

View File

@ -22,9 +22,27 @@
//****************************************************************************** //******************************************************************************
#include <QTime> #include <QTime>
#include <QTimer>
#include "Optimizer_thread.h" #include "Optimizer_thread.h"
#include "Scene_c3t3_item.h" #include "Scene_c3t3_item.h"
Optimizer_thread::
Optimizer_thread(Optimization_function_interface* f, Scene_c3t3_item* item)
: f_(f)
, item_(item)
, rc_()
, time_(0)
, timer_(new QTimer(this))
, timer_period_(1)
{
connect(timer_, SIGNAL(timeout()),
this, SLOT(emit_status()));
timer_->start(timer_period_*1000);
}
Optimizer_thread::~Optimizer_thread() Optimizer_thread::~Optimizer_thread()
{ {
delete f_; delete f_;
@ -52,5 +70,12 @@ stop()
f_->stop(); f_->stop();
} }
void
Optimizer_thread::
emit_status()
{
emit (status_report(f_->status(timer_period_)));
}
#include "Optimizer_thread.moc" #include "Optimizer_thread.moc"

View File

@ -28,6 +28,7 @@
#include <QObject> #include <QObject>
#include <QString> #include <QString>
#include <QStringList> #include <QStringList>
#include <QTimer>
#include <CGAL/Mesh_optimization_return_code.h> #include <CGAL/Mesh_optimization_return_code.h>
@ -47,6 +48,7 @@ public:
// Logs // Logs
virtual QString name() const = 0; virtual QString name() const = 0;
virtual QStringList parameters_log() const = 0; virtual QStringList parameters_log() const = 0;
virtual QString status(double time_period) const = 0;
}; };
@ -54,9 +56,7 @@ class Optimizer_thread : public QThread
{ {
Q_OBJECT Q_OBJECT
public: public:
Optimizer_thread(Optimization_function_interface* f, Scene_c3t3_item* item) Optimizer_thread(Optimization_function_interface* f, Scene_c3t3_item* item);
: f_(f), item_(item), rc_(), time_(0) {}
virtual ~Optimizer_thread(); virtual ~Optimizer_thread();
// Scene item // Scene item
@ -74,9 +74,15 @@ public slots:
// Stop // Stop
void stop(); void stop();
private slots:
// emit signal status report
void emit_status();
signals: signals:
// Emitted at the end of the process // Emitted at the end of the process
void done(Optimizer_thread*); void done(Optimizer_thread*);
// Informs about status of the process
void status_report(QString);
protected: protected:
// Overload of QThread function // Overload of QThread function
@ -87,6 +93,8 @@ private:
Scene_c3t3_item* item_; Scene_c3t3_item* item_;
CGAL::Mesh_optimization_return_code rc_; CGAL::Mesh_optimization_return_code rc_;
double time_; // in seconds double time_; // in seconds
QTimer* timer_;
double timer_period_;
}; };
#endif // DEMO_MESH_3_OPTIMIZER_THREAD_H #endif // DEMO_MESH_3_OPTIMIZER_THREAD_H