ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
qTreeIso.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #include "qTreeIso.h"
9 
10 // Qt
11 #include <QApplication>
12 #include <QComboBox>
13 #include <QElapsedTimer>
14 #include <QMainWindow>
15 #include <QMessageBox>
16 #include <QProgressDialog>
17 
18 // Local
19 #include "ccTreeIsoDlg.h"
20 #include "qTreeIsoCommands.h"
21 
22 // System
23 #include <assert.h>
24 
25 #include <iostream>
26 #include <string>
27 #include <vector>
28 
29 // qCC_db
30 #include <ecvGenericPointCloud.h>
31 #include <ecvHObjectCaster.h>
32 #include <ecvMesh.h>
33 #include <ecvOctree.h>
34 #include <ecvPointCloud.h>
35 
36 // TreeIso
37 #include <TreeIso.h>
38 
39 qTreeIso::qTreeIso(QObject* parent)
40  : QObject(parent),
41  ccStdPluginInterface(":/CC/plugin/qTreeIso/info.json"),
42  m_action(nullptr) {}
43 
44 void qTreeIso::onNewSelection(const ccHObject::Container& selectedEntities) {
45  if (m_action) {
46  bool hasCloud = false;
47  for (ccHObject* entity : selectedEntities) {
48  if (entity && entity->isA(CV_TYPES::POINT_CLOUD)) {
49  hasCloud = true;
50  break;
51  }
52  }
53  m_action->setEnabled(hasCloud);
54  }
55 }
56 
57 QList<QAction*> qTreeIso::getActions() {
58  if (!m_action) {
59  m_action = new QAction(getName(), this);
60  m_action->setToolTip(getDescription());
61  m_action->setIcon(getIcon());
62 
63  // connect appropriate signal
64  connect(m_action, &QAction::triggered, this, &qTreeIso::doAction);
65  }
66 
67  return {m_action};
68 }
69 
71  Parameters parameters;
72  ccTreeIsoDlg treeisoDlg(m_app ? m_app->getMainWindow() : nullptr);
73 
74  connect(treeisoDlg.pushButtonInitSeg, &QPushButton::clicked, [&] {
75  parameters.min_nn1 = treeisoDlg.spinBoxK1->value();
76  parameters.reg_strength1 = treeisoDlg.doubleSpinBoxLambda1->value();
77  ;
78  parameters.decimate_res1 = treeisoDlg.doubleSpinBoxDecRes1->value();
79 
80  init_segs(parameters, &treeisoDlg);
81  });
82 
83  connect(treeisoDlg.pushButtonInterSeg, &QPushButton::clicked, [&] {
84  parameters.min_nn2 = treeisoDlg.spinBoxK2->value();
85  parameters.reg_strength2 = treeisoDlg.doubleSpinBoxLambda2->value();
86  parameters.decimate_res2 = treeisoDlg.doubleSpinBoxDecRes2->value();
87  parameters.max_gap = treeisoDlg.doubleSpinBoxMaxGap->value();
88 
89  intermediate_segs(parameters, &treeisoDlg);
90  });
91 
92  connect(treeisoDlg.pushButtonReseg, &QPushButton::clicked, [&] {
93  parameters.rel_height_length_ratio =
94  treeisoDlg.doubleSpinBoxRelHLRatio->value();
95  parameters.vertical_weight = treeisoDlg.doubleSpinBoxVWeight->value();
96 
97  final_segs(parameters, &treeisoDlg);
98  });
99  treeisoDlg.pushButtonInitSeg->setEnabled(true);
100 
101  if (treeisoDlg.exec()) {
102  if (m_app) {
103  m_app->refreshAll();
104  } else {
105  // m_app should have already been initialized by CC when plugin is
106  // loaded!
107  assert(false);
108  }
109  }
110 }
111 
112 void qTreeIso::init_segs(const Parameters& parameters,
113  QWidget* parent /*=nullptr*/) {
114  // display the progress dialog
115  QProgressDialog* progressDlg = new QProgressDialog(parent);
116  progressDlg->setWindowTitle("TreeIso Step 1. Initial segmention");
117  progressDlg->setLabelText(tr("Computing...."));
118  progressDlg->setCancelButton(nullptr);
119  progressDlg->setRange(0, 0); // infinite progress bar
120  progressDlg->show();
121 
122  if (!TreeIso::Init_seg(parameters.min_nn1, parameters.reg_strength1,
123  parameters.decimate_res1, m_app, progressDlg)) {
124  m_app->dispToConsole("Not enough memory",
126  return;
127  }
128 
129  progressDlg->close();
130  QApplication::processEvents();
131 
132  m_app->updateUI();
133  m_app->refreshAll();
134 }
135 
136 void qTreeIso::intermediate_segs(const Parameters& parameters,
137  QWidget* parent /*=nullptr*/) {
138  // display the progress dialog
139  QProgressDialog* progressDlg = new QProgressDialog(parent);
140  progressDlg->setWindowTitle("TreeIso Step 2. Interim segmention");
141  progressDlg->setLabelText(tr("Computing...."));
142  progressDlg->setCancelButton(nullptr);
143  progressDlg->setRange(0, 0); // infinite progress bar
144  progressDlg->show();
145 
146  if (!TreeIso::Intermediate_seg(parameters.min_nn2, parameters.reg_strength2,
147  parameters.decimate_res2, parameters.max_gap,
148  m_app, progressDlg)) {
149  progressDlg->hide();
150  QApplication::processEvents();
151  m_app->updateUI();
152  m_app->refreshAll();
153  return;
154  }
155 
156  progressDlg->hide();
157  QApplication::processEvents();
158 
159  m_app->updateUI();
160  m_app->refreshAll();
161 }
162 
163 void qTreeIso::final_segs(const Parameters& parameters,
164  QWidget* parent /*=nullptr*/) {
165  // display the progress dialog
166  QProgressDialog* progressDlg = new QProgressDialog(parent);
167  progressDlg->setWindowTitle("TreeIso Step 3. Final segmention");
168  progressDlg->setLabelText(tr("Computing...."));
169  progressDlg->setCancelButton(nullptr);
170  progressDlg->setRange(0, 0); // infinite progress bar
171  progressDlg->show();
172 
173  if (!TreeIso::Final_seg(parameters.min_nn2,
174  parameters.rel_height_length_ratio,
175  parameters.vertical_weight, m_app, progressDlg)) {
176  progressDlg->hide();
177  QApplication::processEvents();
178  m_app->updateUI();
179  m_app->refreshAll();
180  return;
181  }
182 
183  progressDlg->close();
184  QApplication::processEvents();
185 
186  m_app->updateUI();
187  m_app->refreshAll();
188 }
189 
190 void qTreeIso::registerCommands(ccCommandLineInterface* cmd) {
191  if (!cmd) {
192  assert(false);
193  return;
194  }
195  cmd->registerCommand(
197 }
static bool Init_seg(const unsigned min_nn1, const float regStrength1, const float PR_DECIMATE_RES1, ecvMainAppInterface *app, QProgressDialog *progressDlg)
Definition: TreeIso.cpp:835
static bool Final_seg(const unsigned PR_MIN_NN3, const float PR_REL_HEIGHT_LENGTH_RATIO, const float PR_VERTICAL_WEIGHT, ecvMainAppInterface *app, QProgressDialog *progressDlg)
Definition: TreeIso.cpp:911
static bool Intermediate_seg(const unsigned PR_MIN_NN2, const float PR_REG_STRENGTH2, const float PR_DECIMATE_RES2, const float PR_MAX_GAP, ecvMainAppInterface *app, QProgressDialog *progressDlg)
Definition: TreeIso.cpp:871
Command line interface.
virtual bool registerCommand(Command::Shared command)=0
Registers a new command.
virtual QString getName() const override
Returns (short) name (for menu entry, etc.)
virtual QString getDescription() const override
Returns long name/description (for tooltip, etc.)
virtual QIcon getIcon() const override
Returns icon.
Hierarchical CLOUDVIEWER Object.
Definition: ecvHObject.h:25
std::vector< ccHObject * > Container
Standard instances container (for children, etc.)
Definition: ecvHObject.h:337
Standard ECV plugin interface.
ecvMainAppInterface * m_app
Main application interface.
Dialog for qTreeIso plugin.
Definition: ccTreeIsoDlg.h:18
virtual void updateUI()=0
virtual QMainWindow * getMainWindow()=0
Returns main window.
virtual void refreshAll(bool only2D=false, bool forceRedraw=true)=0
Redraws all GL windows that have the 'refresh' flag on.
virtual void dispToConsole(QString message, ConsoleMessageLevel level=STD_CONSOLE_MESSAGE)=0
void final_segs(const Parameters &parameters, QWidget *parent=nullptr)
Definition: qTreeIso.cpp:163
QAction * m_action
Associated action.
Definition: qTreeIso.h:85
void init_segs(const Parameters &parameters, QWidget *parent=nullptr)
Definition: qTreeIso.cpp:112
void intermediate_segs(const Parameters &parameters, QWidget *parent=nullptr)
Definition: qTreeIso.cpp:136
void doAction()
Slot called when associated ation is triggered.
Definition: qTreeIso.cpp:70
@ POINT_CLOUD
Definition: CVTypes.h:104
qTreeIso command line processor
QSharedPointer< Command > Shared
Shared type.