| |
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| |
|
| |
|
| | #include <Gui/CommandT.h>
|
| | #include <Gui/Selection/Selection.h>
|
| | #include <Gui/WaitCursor.h>
|
| | #include <Mod/Mesh/App/MeshFeature.h>
|
| |
|
| | #include "DlgDecimating.h"
|
| | #include "ui_DlgDecimating.h"
|
| |
|
| |
|
| | using namespace MeshGui;
|
| |
|
| |
|
| |
|
| | DlgDecimating::DlgDecimating(QWidget* parent, Qt::WindowFlags fl)
|
| | : QWidget(parent, fl)
|
| | , ui(new Ui_DlgDecimating)
|
| | {
|
| | ui->setupUi(this);
|
| | connect(
|
| | ui->checkAbsoluteNumber,
|
| | &QCheckBox::toggled,
|
| | this,
|
| | &DlgDecimating::onCheckAbsoluteNumberToggled
|
| | );
|
| | ui->spinBoxReduction->setMinimumWidth(60);
|
| | ui->checkAbsoluteNumber->setEnabled(false);
|
| | onCheckAbsoluteNumberToggled(false);
|
| | }
|
| |
|
| | DlgDecimating::~DlgDecimating() = default;
|
| |
|
| | bool DlgDecimating::isAbsoluteNumber() const
|
| | {
|
| | return ui->checkAbsoluteNumber->isChecked();
|
| | }
|
| |
|
| | int DlgDecimating::targetNumberOfTriangles() const
|
| | {
|
| | if (ui->checkAbsoluteNumber->isChecked()) {
|
| | return ui->spinBoxReduction->value();
|
| | }
|
| |
|
| | return int(numberOfTriangles * (1.0 - reduction()));
|
| | }
|
| |
|
| | void DlgDecimating::setNumberOfTriangles(int num)
|
| | {
|
| | numberOfTriangles = num;
|
| | ui->checkAbsoluteNumber->setEnabled(num > 0);
|
| | if (num <= 0) {
|
| | ui->checkAbsoluteNumber->setChecked(false);
|
| | }
|
| | }
|
| |
|
| | void DlgDecimating::onCheckAbsoluteNumberToggled(bool on)
|
| | {
|
| | ui->sliderReduction->setDisabled(on);
|
| | ui->groupBoxTolerance->setDisabled(on);
|
| |
|
| | if (on) {
|
| | disconnect(
|
| | ui->sliderReduction,
|
| | qOverload<int>(&QSlider::valueChanged),
|
| | ui->spinBoxReduction,
|
| | &QSpinBox::setValue
|
| | );
|
| | disconnect(
|
| | ui->spinBoxReduction,
|
| | qOverload<int>(&QSpinBox::valueChanged),
|
| | ui->sliderReduction,
|
| | &QSlider::setValue
|
| | );
|
| | ui->spinBoxReduction->setRange(1, numberOfTriangles);
|
| | ui->spinBoxReduction->setValue(int(numberOfTriangles * (1.0 - reduction())));
|
| | ui->spinBoxReduction->setSuffix(QString());
|
| | ui->checkAbsoluteNumber->setText(tr("Absolute number (Maximum: %1)").arg(numberOfTriangles));
|
| | }
|
| | else {
|
| | ui->spinBoxReduction->setRange(0, 100);
|
| | ui->spinBoxReduction->setValue(ui->sliderReduction->value());
|
| | ui->spinBoxReduction->setSuffix(QStringLiteral("%"));
|
| | ui->checkAbsoluteNumber->setText(tr("Absolute number"));
|
| | connect(
|
| | ui->sliderReduction,
|
| | qOverload<int>(&QSlider::valueChanged),
|
| | ui->spinBoxReduction,
|
| | &QSpinBox::setValue
|
| | );
|
| | connect(
|
| | ui->spinBoxReduction,
|
| | qOverload<int>(&QSpinBox::valueChanged),
|
| | ui->sliderReduction,
|
| | &QSlider::setValue
|
| | );
|
| | }
|
| | }
|
| |
|
| | double DlgDecimating::tolerance() const
|
| | {
|
| | return ui->spinBoxTolerance->value();
|
| | }
|
| |
|
| | |
| | |
| | |
| |
|
| | double DlgDecimating::reduction() const
|
| | {
|
| | double max = static_cast<double>(ui->sliderReduction->maximum());
|
| | double min = static_cast<double>(ui->sliderReduction->minimum());
|
| | double val = static_cast<double>(ui->sliderReduction->value());
|
| | return (val - min) / (max - min);
|
| | }
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | TaskDecimating::TaskDecimating()
|
| | {
|
| | widget = new DlgDecimating();
|
| | addTaskBox(widget, false, nullptr);
|
| |
|
| | std::vector<Mesh::Feature*> meshes = Gui::Selection().getObjectsOfType<Mesh::Feature>();
|
| | if (meshes.size() == 1) {
|
| | Mesh::Feature* mesh = meshes.front();
|
| | const Mesh::MeshObject& mm = mesh->Mesh.getValue();
|
| | widget->setNumberOfTriangles(static_cast<int>(mm.countFacets()));
|
| | }
|
| | }
|
| |
|
| | bool TaskDecimating::accept()
|
| | {
|
| | std::vector<Mesh::Feature*> meshes = Gui::Selection().getObjectsOfType<Mesh::Feature>();
|
| | if (meshes.empty()) {
|
| | return true;
|
| | }
|
| | Gui::Selection().clearSelection();
|
| |
|
| | Gui::WaitCursor wc;
|
| | Gui::Command::openCommand(QT_TRANSLATE_NOOP("Command", "Mesh Decimating"));
|
| |
|
| | float tolerance = float(widget->tolerance());
|
| | float reduction = float(widget->reduction());
|
| | bool absolute = widget->isAbsoluteNumber();
|
| | int targetSize = 0;
|
| | if (absolute) {
|
| | targetSize = widget->targetNumberOfTriangles();
|
| | }
|
| | for (auto mesh : meshes) {
|
| | if (absolute) {
|
| | Gui::cmdAppObjectArgs(mesh, "decimate(%i)", targetSize);
|
| | }
|
| | else {
|
| | Gui::cmdAppObjectArgs(mesh, "decimate(%f, %f)", tolerance, reduction);
|
| | }
|
| | }
|
| |
|
| | Gui::Command::commitCommand();
|
| | return true;
|
| | }
|
| |
|
| | #include "moc_DlgDecimating.cpp"
|
| |
|