8 #include "../include/ccCloudLayersDlg.h"
10 #include "../include/ccColorStyledDelegate.h"
11 #include "../include/ccMouseCircle.h"
14 #include <QColorDialog>
16 #include <QMessageBox>
18 #include <QSortFilterProxyModel>
29 m_mouseCircle(nullptr) {
32 setWindowTitle(QString(
"Cloud layers plugin"));
35 setWindowFlags(Qt::Tool |
36 Qt::CustomizeWindowHint );
42 connect(pbAdd, &QPushButton::clicked,
this, &ccCloudLayersDlg::addClicked);
43 connect(pbDelete, &QPushButton::clicked,
this,
44 &ccCloudLayersDlg::deleteClicked);
45 connect(pbStart, &QPushButton::clicked,
this,
46 &ccCloudLayersDlg::startClicked);
47 connect(pbPause, &QPushButton::clicked,
this,
48 &ccCloudLayersDlg::pauseClicked);
49 connect(pbApply, &QPushButton::clicked,
this,
50 &ccCloudLayersDlg::applyClicked);
51 connect(pbClose, &QPushButton::clicked,
this,
52 &ccCloudLayersDlg::closeClicked);
55 connect(cbScalarField, qOverload<int>(&QComboBox::currentIndexChanged),
56 this, &ccCloudLayersDlg::scalarFieldIndexChanged);
57 connect(cbInput, qOverload<int>(&QComboBox::currentIndexChanged),
this,
58 &ccCloudLayersDlg::inputClassIndexChanged);
59 connect(cbOutput, qOverload<int>(&QComboBox::currentIndexChanged),
this,
60 &ccCloudLayersDlg::outputClassIndexChanged);
63 connect(tableView, &QTableView::doubleClicked,
this,
64 &ccCloudLayersDlg::tableViewDoubleClicked);
68 &ccCloudLayersDlg::codeChanged);
70 &ccCloudLayersDlg::colorChanged);
72 m_presets.append(QString(
"All Points"));
73 m_presets.append(QString(
"Visible Points"));
84 m_mouseCircle =
nullptr;
88 void ccCloudLayersDlg::reject() {
90 if (QMessageBox::question(
92 "The cloud has been modified, are you sure you want exit?",
93 QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) {
114 &ccCloudLayersDlg::mouseMoved);
120 if (m_mouseCircle && m_mouseCircle->
isVisible()) pauseClicked();
122 if (accepted && m_helper) {
141 cbScalarField->clear();
150 void ccCloudLayersDlg::resetUI() {
151 pbStart->setEnabled(
true);
152 pbPause->setEnabled(
false);
155 void ccCloudLayersDlg::initTableView() {
156 QSortFilterProxyModel* proxyModel =
new QSortFilterProxyModel(
this);
157 proxyModel->setSourceModel(&m_asprsModel);
158 tableView->setModel(proxyModel);
159 tableView->setSortingEnabled(
true);
167 QHeaderView::Stretch);
168 tableView->horizontalHeader()->setSectionResizeMode(
170 tableView->horizontalHeader()->setSectionResizeMode(
172 tableView->horizontalHeader()->setSectionResizeMode(
174 tableView->horizontalHeader()->setSectionResizeMode(
178 void ccCloudLayersDlg::saveSettings() {
180 settings.beginGroup(
"qCloudLayers");
182 if (cbScalarField->currentIndex() >= 0)
183 settings.setValue(
"ScalarField", cbScalarField->currentText());
184 if (cbInput->currentIndex() >= 0)
185 settings.setValue(
"InputClass", cbInput->currentText());
186 if (cbOutput->currentIndex() >= 0)
187 settings.setValue(
"OutputClass", cbOutput->currentText());
189 settings.beginGroup(
"Window");
190 { settings.setValue(
"geometry", saveGeometry()); }
196 void ccCloudLayersDlg::loadSettings() {
202 settings.beginGroup(
"qCloudLayers");
204 QString sfName = settings.value(
"ScalarField").toString();
209 sfName =
"Classification";
217 cbScalarField->setCurrentIndex(sfIndex);
219 QString inputName = settings.value(
"InputClass").toString();
223 int index = m_presets.indexOf(inputName);
224 cbInput->setCurrentIndex(
std::max(0, index));
226 cbInput->setCurrentIndex(m_asprsModel.
indexOf(inputName) +
230 QString outputName = settings.value(
"OutputClass").toString();
231 int outIndex = m_asprsModel.
indexOf(outputName);
232 cbOutput->setCurrentIndex(outIndex == -1 ? 0 : outIndex);
234 settings.beginGroup(
"Window");
235 { restoreGeometry(settings.value(
"geometry").toByteArray()); }
241 void ccCloudLayersDlg::addClicked() {
243 tableView->selectRow(index.row());
244 tableView->setCurrentIndex(index);
249 void ccCloudLayersDlg::deleteClicked() {
250 QItemSelectionModel* select = tableView->selectionModel();
251 if (!select->hasSelection())
return;
254 "Are you sure you want to delete this record(s)?",
256 QMessageBox::No) == QMessageBox::No) {
260 QModelIndexList mapIndices = select->selectedIndexes();
261 std::sort(mapIndices.begin(), mapIndices.end());
263 QModelIndexList sourceIndices;
264 for (QModelIndex index : mapIndices) {
265 QModelIndex sourceIndex =
266 static_cast<QSortFilterProxyModel*
>(tableView->model())
267 ->mapToSource(index);
268 sourceIndices.append(sourceIndex);
272 ? &(m_asprsModel.
getData().front())
274 for (
int i = mapIndices.size(); i > 0; --i) {
276 m_asprsModel.
getData()[sourceIndices[i - 1].row()];
277 int affected = m_helper ? m_helper->
moveItem(from, to) : 0;
279 to->
count += affected;
282 tableView->model()->removeRows(mapIndices[i - 1].row(), 1);
290 void ccCloudLayersDlg::startClicked() {
303 pbStart->setEnabled(
false);
304 pbPause->setEnabled(
true);
307 void ccCloudLayersDlg::pauseClicked() {
314 ecvDisplayTools::PICKING_MODE::DEFAULT_PICKING);
318 pbStart->setEnabled(
true);
319 pbPause->setEnabled(
false);
322 void ccCloudLayersDlg::applyClicked() {
334 void ccCloudLayersDlg::closeClicked() {
337 if (QMessageBox::question(
339 "The cloud has been modified, are you sure you want "
341 QMessageBox::Yes, QMessageBox::No) == QMessageBox::No) {
352 void ccCloudLayersDlg::mouseMoved(
int x,
int y, Qt::MouseButtons buttons) {
356 if (buttons != Qt::LeftButton) {
370 std::map<ScalarType, int> affected;
371 m_helper->
mouseMove(center, radius * radius, affected);
374 for (
const auto& kv : affected) {
375 auto item = m_asprsModel.
find(kv.first);
376 if (item) item->
count += kv.second;
382 bool ccCloudLayersDlg::eventFilter(QObject* obj, QEvent*
event) {
383 if (
event->type() == QEvent::KeyPress) {
384 QKeyEvent* ev =
static_cast<QKeyEvent*
>(
event);
385 if (ev->key() == Qt::Key::Key_Alt) {
389 }
else if (
event->type() == QEvent::KeyRelease) {
390 QKeyEvent* ev =
static_cast<QKeyEvent*
>(
event);
391 if (ev->key() == Qt::Key::Key_Alt) {
400 void ccCloudLayersDlg::scalarFieldIndexChanged(
int index) {
411 void ccCloudLayersDlg::inputClassIndexChanged(
int index) {
416 if (cbInput->currentIndex() < 0) {
418 params.visiblePoints =
false;
424 QString inputName = cbInput->itemText(cbInput->currentIndex());
425 params.anyPoints = (inputName == m_presets[0]);
426 params.visiblePoints = (inputName == m_presets[1]);
433 void ccCloudLayersDlg::outputClassIndexChanged(
int index) {
438 if (cbInput->currentIndex() < 0) {
443 QString outputName = cbOutput->itemText(cbOutput->currentIndex());
444 params.output = m_asprsModel.
find(outputName);
449 m_helper->
changeCode(item,
static_cast<ScalarType
>(oldCode));
464 void ccCloudLayersDlg::tableViewDoubleClicked(
const QModelIndex& index) {
468 index.model()->data(index, Qt::DisplayRole).value<QColor>();
469 QColor
color = QColorDialog::getColor(currColor,
this,
"Pick a color",
470 QColorDialog::DontUseNativeDialog);
473 tableView->model()->setData(index,
color, Qt::EditRole);
476 void ccCloudLayersDlg::updateInputOutput() {
477 auto data = m_asprsModel.
getData();
480 cbInput->addItems(m_presets);
481 for (
int i = 0; i < data.size(); ++i) cbInput->addItem(data[i].name);
484 for (
int i = 0; i < data.size(); ++i) cbOutput->addItem(data[i].name);
487 void ccCloudLayersDlg::swapInputOutput() {
488 int inputIndex = cbInput->currentIndex();
489 int outputIndex = cbOutput->currentIndex();
491 if (inputIndex < 0 || outputIndex < 0)
return;
493 QString text = cbInput->itemText(cbInput->currentIndex());
494 bool isPresets = m_presets.contains(text);
497 cbInput->setCurrentIndex(outputIndex + m_presets.size());
498 cbOutput->setCurrentIndex(inputIndex - m_presets.size());
501 inputIndex = cbInput->currentIndex();
502 outputIndex = cbOutput->currentIndex();
float PointCoordinateType
Type of the coordinates of a (N-D) point.
cmdLineReadable * params[]
void colorChanged(AsprsItem &item)
AsprsItem * find(QString name)
int indexOf(QString name) const
QModelIndex createNewItem()
void codeChanged(AsprsItem &item, int oldCode)
const QList< AsprsItem > & getData() const
void stop(bool accepted) override
Stops process/dialog.
void setPointCloud(ccPointCloud *cloud)
bool start() override
inherited from ccOverlayDialog
virtual ~ccCloudLayersDlg()
Destructor.
ccCloudLayersDlg(ecvMainAppInterface *app, QWidget *parent=nullptr)
Default constructor.
void projectCloud(const ccGLCameraParameters &camera)
void apply(QList< ccAsprsModel::AsprsItem > &items)
int moveItem(const ccAsprsModel::AsprsItem &from, const ccAsprsModel::AsprsItem *to, bool redrawDisplay=false)
void keepCurrentSFVisible()
void mouseMove(const CCVector2 ¢er, float squareDist, std::map< ScalarType, int > &affected)
void changeCode(const ccAsprsModel::AsprsItem &item, ScalarType oldCode)
void setScalarFieldIndex(int index)
void setVisible(bool value)
QStringList getScalarFields()
Parameters & getParameters()
virtual bool isVisible() const
Returns whether entity is visible or not.
virtual void setVisible(bool state)
Sets entity visibility.
void setAllowScroll(bool state)
Generic overlay dialog interface.
virtual void stop(bool accepted)
Stops process/dialog.
virtual bool start()
Starts process.
QWidget * m_associatedWin
Associated (MDI) window.
A 3D cloud and its associated features (color, normals, scalar fields, etc.)
Main application interface (for plugins)
virtual QWidget * getActiveWindow()=0
virtual void freezeUI(bool state)=0
Freezes/unfreezes UI.
OpenGL camera parameters.