diff options
Diffstat (limited to 'src/GudhUI/gui/MainWindow.cpp')
-rw-r--r-- | src/GudhUI/gui/MainWindow.cpp | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/src/GudhUI/gui/MainWindow.cpp b/src/GudhUI/gui/MainWindow.cpp new file mode 100644 index 00000000..85745e93 --- /dev/null +++ b/src/GudhUI/gui/MainWindow.cpp @@ -0,0 +1,283 @@ +#include "MainWindow.h" + +#include <QWidget> +#include <QInputDialog> +#include <QFileDialog> + +#include <fenv.h> + + +#include "gui/Menu_k_nearest_neighbors.h" +#include "gui/Menu_uniform_neighbors.h" +#include "gui/Menu_edge_contraction.h" +#include "gui/Menu_persistence.h" + + +MainWindow::MainWindow(QWidget* parent): +menu_k_nearest_neighbors_(new Menu_k_nearest_neighbors(this)), +menu_uniform_neighbors_(new Menu_uniform_neighbors(this)), +menu_edge_contraction_(new Menu_edge_contraction(this,model_)), +menu_persistence_(new Menu_persistence(this)) +{ +#ifndef NDEBUG // catch nan +feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW); +#endif + + setupUi(this); + + viewer_instructor_ = new Viewer_instructor( + this, + this->viewer, + model_.complex_ + ); + + connectActions(); + + update_view(); +} + +void +MainWindow::closeEvent(QCloseEvent *event){ + exit(0); +} + + +void +MainWindow::connectActions(){ + QObject::connect(this->actionLoad_complex, SIGNAL(triggered()), this, + SLOT(off_file_open())); + QObject::connect(this->actionLoad_points, SIGNAL(triggered()), this, + SLOT(off_points_open())); + QObject::connect(this->actionSave_complex, SIGNAL(triggered()), this, + SLOT(off_file_save())); + QObject::connect(this->actionSave_points, SIGNAL(triggered()), this, + SLOT(off_points_save())); + + QObject::connect(this->actionShow_graph_stats, SIGNAL(triggered()), this, + SLOT(show_graph_stats())); + QObject::connect(this->actionShow_complex_stats, SIGNAL(triggered()), this, + SLOT(show_complex_stats())); + QObject::connect(this->actionShow_complex_dimension, SIGNAL(triggered()), this, + SLOT(show_complex_dimension())); + + QObject::connect(this->actionUniform_proximity_graph, SIGNAL(triggered()), this, + SLOT(build_rips_menu())); + QObject::connect(this->actionK_nearest_neighbors_graph, SIGNAL(triggered()), this, + SLOT(build_k_nearest_neighbors_menu())); + + + QObject::connect(this->actionContract_edges, SIGNAL(triggered()), this, + SLOT(contract_edge_menu())); + + QObject::connect(this->actionCollapse_vertices, SIGNAL(triggered()), this, + SLOT(collapse_vertices())); + + QObject::connect(this->actionCollapse_edges, SIGNAL(triggered()), this, + SLOT(collapse_edges())); + + QObject::connect(this->actionNoise, SIGNAL(triggered()), this, + SLOT(uniform_noise())); + QObject::connect(this->actionLloyd, SIGNAL(triggered()), this, + SLOT(lloyd())); + + + //view + QObject::connect(this->actionPoints, SIGNAL(triggered()), this->viewer_instructor_, + SLOT(change_draw_vertices())); + QObject::connect(this->actionEdges, SIGNAL(triggered()), this->viewer_instructor_, + SLOT(change_draw_edges())); + QObject::connect(this->actionTriangles, SIGNAL(triggered()), this->viewer_instructor_, + SLOT(change_draw_triangles())); + + //topology + QObject::connect(this->actionShow_homology_group, SIGNAL(triggered()), this, + SLOT(show_homology_group())); + QObject::connect(this->actionEuler_characteristic, SIGNAL(triggered()), this, + SLOT(show_euler_characteristic())); + QObject::connect(this->actionPersistence, SIGNAL(triggered()), this, + SLOT(persistence_menu())); + + + + QObject::connect(this, SIGNAL(sceneChanged()), this->viewer_instructor_, + SLOT(sceneChanged())); + +} + +void +MainWindow::init_view() const{ + viewer_instructor_->initialize_bounding_box(); + viewer_instructor_->show_entire_scene(); + update_view(); +} + + +void +MainWindow::update_view() const{ + emit (sceneChanged()); +} + + + +/** + * open a file chooser to choose an off to load + */ +void +MainWindow::off_file_open(){ + QString fileName = QFileDialog::getOpenFileName(this, tr("Open off File"), + "~/", tr("off files (*.off)")); + if (!fileName.isEmpty()){ + model_.off_file_open(fileName.toStdString()); + init_view(); + } +} + +void +MainWindow::off_points_open(){ + QString fileName = QFileDialog::getOpenFileName(this, tr("Open points in a off file"), + "~/", tr("off files (*.off)")); + if (!fileName.isEmpty()){ + model_.off_points_open(fileName.toStdString()); + init_view(); + } +} + + +/** + * open a file chooser to choose an off to save + */ +void +MainWindow::off_file_save(){ + QString fileName = QFileDialog::getOpenFileName(this, tr("Save to off File"), + "~/", tr("off files (*.off)")); + if (!fileName.isEmpty()) + { + model_.off_file_save(fileName.toStdString()); + } +} + +/** + * open a file chooser to choose an off to save + */ +void +MainWindow::off_points_save(){ + QString fileName = QFileDialog::getOpenFileName(this, tr("Save to off File"), + "~/", tr("off files (*.off)")); + if (!fileName.isEmpty()) + { + model_.off_points_save(fileName.toStdString()); + } +} + + +void +MainWindow::show_graph_stats(){ + model_.show_graph_stats(); +} + +void +MainWindow::show_complex_stats(){ + model_.show_complex_stats(); +} + +void +MainWindow::show_complex_dimension(){ + model_.show_complex_dimension(); +} + + +void +MainWindow::build_rips_menu(){ + menu_uniform_neighbors_->show(); +} + +void +MainWindow::build_rips(double alpha){ + model_.build_rips(alpha); + update_view(); +} + +void +MainWindow::build_k_nearest_neighbors_menu(){ + menu_k_nearest_neighbors_->show(); +} + +void +MainWindow::build_k_nearest_neighbors(unsigned k){ + model_.build_k_nearest_neighbors(k); + update_view(); +} + +void +MainWindow::contract_edge_menu(){ + menu_edge_contraction_->show(); +} + +void +MainWindow::contract_edges(unsigned num_collapses){ + std::cerr <<"Collapse "<<num_collapses<< " vertices\n"; + model_.contract_edges(num_collapses); + update_view(); +} + + +void +MainWindow::collapse_edges(){ + std::cerr <<"Collapse "<<100<< " edges\n"; + model_.collapse_edges(100); + update_view(); +} + + + +void +MainWindow::collapse_vertices(){ + std::cerr <<"Collapse vertices edges\n"; + model_.collapse_vertices(0); + update_view(); +} + + +void +MainWindow::uniform_noise(){ + bool ok; + double amplitude = QInputDialog::getDouble(this, tr("Uniform noise"), + tr("Amplitude:"), 0, 0, 10000, 3, &ok); + srand(time(NULL)); + if (ok) + model_.uniform_noise(amplitude); +} + + +void +MainWindow::lloyd(){ + //todo 1 ask lloyd parameters + model_.lloyd(0,0); + update_view(); +} + +void +MainWindow::show_homology_group(){ + model_.show_homology_group(); +} + +void +MainWindow::show_euler_characteristic(){ + model_.show_euler_characteristic(); +} + + + +void +MainWindow::persistence_menu(){ + menu_persistence_->show(); +} + +void +MainWindow::compute_persistence(int p,double threshold,int max_dim,double min_pers){ + model_.show_persistence(p,threshold,max_dim,min_pers); +} + + + +#include "MainWindow.moc" |