#include "main_window.h" #include "mesh_processor.h" #include #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent), toolbar(this), mesh_viewer() { setCentralWidget(&mesh_viewer); // addToolBar(Qt::RightToolBarArea, &toolbar); // open_action = toolbar.addAction("Ouvrir…", [&](){ // emit open(QFileDialog::getOpenFileName(this, "Ouvrir un maillage")); // }); // toolbar_actions.append(toolbar.addAction("Fractionner", [&](){ // QVector> fragments = shatter(mesh); // mesh_viewer.removeOpenGLMesh(glm); // for (auto &[pos, fragment] : fragments) { // fragment.triangulate(); // QMatrix4x4 mat; // float scale = 1.2; // mat.translate(pos[0] * scale, pos[1] * scale, pos[2] * scale); // mesh_viewer.addOpenGLMeshFromOpenMesh(&fragment, mat); // } // })); QMenuBar *menu_bar = new QMenuBar(); setMenuBar(menu_bar); // File menu QMenu *file_menu = new QMenu("Fichier"); open_action = file_menu->addAction("Ouvrir…", [&](){ emit open(QFileDialog::getOpenFileName(this, "Ouvrir un maillage")); }); save_action = file_menu->addAction("Enregistrer sous…", [&]() { emit save(QFileDialog::getSaveFileName(this, "Enregistrer un maillage")); }); menu_bar->addMenu(file_menu); if (!mesh_viewer.isInitialized()) { open_action->setEnabled(false); connect(&mesh_viewer, &MeshViewer::initialized, [&]() { open_action->setEnabled(true); }); } addToolBar(Qt::RightToolBarArea, &toolbar); // Hole filling tools QGroupBox *hole_box = new QGroupBox("Remplissage de trous"); QGridLayout *hole_layout = new QGridLayout(); hole_box->setLayout(hole_layout); QPushButton *fill_holes_dumb = new QPushButton("Remplir bêtement"); connect(fill_holes_dumb, &QPushButton::clicked, this, &MainWindow::fillHolesDumbClicked); hole_layout->addWidget(fill_holes_dumb, 0, 0); QPushButton *fill_holes_implicit = new QPushButton("Remplir par une surface implicite"); connect(fill_holes_implicit, &QPushButton::clicked, this, &MainWindow::fillHolesImplicitClicked); hole_layout->addWidget(fill_holes_implicit, 1, 0); const double implicit_scale_min = 0; const double implicit_scale_max = 10; QLabel *implicit_scale_text = new QLabel("Échelle du remplissage implicite", this); hole_layout->addWidget(implicit_scale_text, 2, 0); QDoubleSpinBox *implicit_scale_sb = new QDoubleSpinBox(this); implicit_scale_sb->setMinimum(implicit_scale_min); implicit_scale_sb->setMaximum(implicit_scale_max); hole_layout->addWidget(implicit_scale_sb, 3, 0); QSlider *implicit_scale = new QSlider(Qt::Horizontal, this); connect(implicit_scale, &QSlider::valueChanged, [=](int v) { double val = v / 100. * (implicit_scale_max - implicit_scale_min) + implicit_scale_min; fillHolesImplicitScaleChanged(val); if (val != implicit_scale_sb->value()) { implicit_scale_sb->setValue(val); } }); connect(implicit_scale_sb, QOverload::of(&QDoubleSpinBox::valueChanged), [=](double v) { if (v != implicit_scale_sb->value()) { implicit_scale->setValue(v); } }); hole_layout->addWidget(implicit_scale, 3, 1); const double implicit_discr_min = 0; const double implicit_discr_max = .1; QLabel *implicit_discr_text = new QLabel("Taux de discrétisation du remplissage implicite", this); hole_layout->addWidget(implicit_discr_text, 4, 0); QDoubleSpinBox *implicit_discr_sb = new QDoubleSpinBox(this); implicit_discr_sb->setMinimum(implicit_discr_min); implicit_discr_sb->setMaximum(implicit_discr_max); hole_layout->addWidget(implicit_discr_sb, 5, 0); QSlider *implicit_discr = new QSlider(Qt::Horizontal, this); connect(implicit_discr, &QSlider::valueChanged, [=](int v) { double val = v / 100. * (implicit_discr_max - implicit_discr_min) + implicit_discr_min; fillHolesImplicitDiscrChanged(val); if (val != implicit_discr_sb->value()) { implicit_discr_sb->setValue(val); } }); connect(implicit_discr_sb, QOverload::of(&QDoubleSpinBox::valueChanged), [=](double v) { if (v != implicit_discr_sb->value()) { implicit_discr->setValue(v); } }); hole_layout->addWidget(implicit_discr, 5, 1); toolbar.addWidget(hole_box); // Smoothing tools QGroupBox *smooth_box = new QGroupBox("Adoucissement"); QLayout *smooth_layout = new QVBoxLayout(); smooth_box->setLayout(smooth_layout); QPushButton *smooth = new QPushButton("Adoucir"); connect(smooth, &QPushButton::clicked, this, &MainWindow::smoothClicked); smooth_layout->addWidget(smooth); toolbar.addWidget(smooth_box); // Curvature tools QGroupBox *curvature_box = new QGroupBox("Analyse de courbure"); QLayout *curvature_layout = new QVBoxLayout(); curvature_box->setLayout(curvature_layout); QPushButton *patch_mode = new QPushButton( "Afficher le patch de la sélection"); patch_mode->setCheckable(true); connect(patch_mode, &QPushButton::toggled, this, &MainWindow::patchViewToggled); curvature_layout->addWidget(patch_mode); toolbar.addWidget(curvature_box); }