28 #include <type_traits>
32 #include <IceUtil/Time.h>
38 #include <VisionX/interface/core/PointCloudProviderInterface.h>
41 #include <QMainWindow>
53 qRegisterMetaType<IceGrid::ObjectInfoSeq>(
"IceGrid::ObjectInfoSeq");
85 QMetaObject::invokeMethod(widget.refreshButton,
"setEnabled", Q_ARG(
bool,
true));
91 QMetaObject::invokeMethod(widget.refreshButton,
"setEnabled", Q_ARG(
bool,
false));
92 QMetaObject::invokeMethod(
this,
"disconnectQt");
96 WidgetController::disconnectQt()
104 for (
int row = 0; row < widget.providerList->count(); row++)
106 QListWidgetItem* item = widget.providerList->item(row);
107 const std::string subscriber = item->text().toStdString();
110 << icemanager->getIceGridSession()->getComponentState(subscriber)
114 if (icemanager->getIceGridSession()->getComponentState(subscriber) !=
121 delete this->widget.providerList->takeItem(this->widget.providerList->row(item));
152 widget.pointCloudDisplay->getDisplay()->getRootNode()->addChild(manager);
155 widget.tableWidget->verticalHeader()->setVisible(
false);
158 widget.tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
167 connect(widget.backgroundButton, SIGNAL(clicked()),
this, SLOT(
selectColor()));
170 connect(widget.providerList,
171 SIGNAL(itemPressed(QListWidgetItem*)),
176 connect(widget.providerList,
177 SIGNAL(itemChanged(QListWidgetItem*)),
182 connect(widget.saveButton, SIGNAL(clicked()),
this, SLOT(
savePointCloud()));
185 connect(widget.doubleSpinBoxPointSize,
186 SIGNAL(valueChanged(
double)),
188 SLOT(setPointSize(
double)));
194 std::lock_guard<std::mutex> lock(mutex);
206 pcl::PointCloud<PointT>::Ptr providerBuffer(
new pcl::PointCloud<PointT>());
210 const visionx::PointContentType pointContentType = info->type;
212 bool colorFromLabel =
213 tools::isLabeled(pointContentType) && this->widget.colorMode_label->isChecked();
215 switch (pointContentType)
217 case visionx::PointContentType::ePoints:
218 getPointCloudAs(providerName, *providerBuffer);
220 case visionx::PointContentType::eColoredPoints:
221 getPointCloudAs(providerName, *providerBuffer);
223 case visionx::PointContentType::eColoredLabeledPoints:
224 getPointCloudAs(providerName, *providerBuffer);
226 case visionx::PointContentType::eLabeledPoints:
227 getPointCloudAs(providerName, *providerBuffer);
236 new CoinPointCloud(providerBuffer, pointContentType, colorFromLabel, pointSize);
241 template <
class Po
intCloudT>
243 WidgetController::getPointCloudAs(
const std::string& providerName,
248 typename pcl::PointCloud<InputPointT>::Ptr inputCloudPtr(
249 new pcl::PointCloud<InputPointT>());
252 pcl::copyPointCloud(*inputCloudPtr, targetPointCloud);
262 widget.pointCloudDisplay->getDisplay()->cameraViewAll();
263 recenterCamera =
false;
266 auto* item = widget.providerList->currentItem();
267 if (item && providerName == item->text())
279 widget.loadingStatusLabel->setText(QString::fromStdString(
"Loading..."));
285 for (
const auto&
object : objects)
287 const std::string name =
288 this->
getIceManager()->getCommunicator()->proxyToString(
object.proxy);
289 const std::string shortName = name.substr(0, name.find(
' '));
293 if (widget.providerList->findItems(QString::fromStdString(shortName), Qt::MatchExactly)
297 QListWidgetItem* item =
298 new QListWidgetItem(QString::fromStdString(shortName), widget.providerList);
299 item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
300 item->setCheckState(Qt::Unchecked);
311 widget.loadingStatusLabel->setText(QString::fromStdString(
312 "Loading complete: " +
std::to_string(counter) +
" provider found"));
321 IceGrid::ObjectInfoSeq objects =
322 admin->getRegisteredObjects<PointCloudProviderInterfacePrx>(
323 widget.lineEditPointCloudFilter->text().toStdString());
324 QMetaObject::invokeMethod(
325 this,
"updateProviderList", Q_ARG(IceGrid::ObjectInfoSeq, objects));
331 const std::string providerName = item->text().toStdString();
334 widget.tableWidget->setRowCount(8);
335 widget.tableWidget->setColumnCount(2);
338 widget.tableWidget->setItem(0, 0,
new QTableWidgetItem(
"Name"));
339 widget.tableWidget->setItem(0, 1,
new QTableWidgetItem(item->text()));
342 widget.tableWidget->setItem(1, 0,
new QTableWidgetItem(
"Type"));
343 widget.tableWidget->setItem(
349 widget.tableWidget->setItem(2, 0,
new QTableWidgetItem(
"Width"));
350 widget.tableWidget->setItem(
351 2, 1,
new QTableWidgetItem(QString::fromStdString(
std::to_string(info->width))));
354 widget.tableWidget->setItem(3, 0,
new QTableWidgetItem(
"Height"));
355 widget.tableWidget->setItem(
356 3, 1,
new QTableWidgetItem(QString::fromStdString(
std::to_string(info->height))));
359 widget.tableWidget->setItem(4, 0,
new QTableWidgetItem(
"Size"));
360 widget.tableWidget->setItem(
361 4, 1,
new QTableWidgetItem(QString::fromStdString(
std::to_string(info->size))));
364 widget.tableWidget->setItem(5, 0,
new QTableWidgetItem(
"Capacity"));
365 widget.tableWidget->setItem(
366 5, 1,
new QTableWidgetItem(QString::fromStdString(
std::to_string(info->capacity))));
369 widget.tableWidget->setItem(6, 0,
new QTableWidgetItem(
"Sequence"));
370 widget.tableWidget->setItem(
371 6, 1,
new QTableWidgetItem(QString::fromStdString(
std::to_string(info->seq))));
374 widget.tableWidget->setItem(7, 0,
new QTableWidgetItem(
"Time Provided"));
376 const bool showRawTimestamp =
false;
377 const std::string timeProvided = showRawTimestamp
379 : IceUtil::Time::microSeconds(info->timeProvided)
381 widget.tableWidget->setItem(
382 7, 1,
new QTableWidgetItem(QString::fromStdString(timeProvided)));
388 std::lock_guard<std::mutex> lock(mutex);
390 const std::string providerName = item->text().toStdString();
392 if (item->checkState())
400 recenterCamera =
true;
406 QColor selectedColor = this->colorDialog.getColor();
408 widget.pointCloudDisplay->getDisplay()->setBackgroundColor(
409 SbColor(selectedColor.red() / 255.0f,
410 selectedColor.green() / 255.0f,
411 selectedColor.blue() / 255.0f));
417 if (widget.providerList->selectedItems().size() == 1)
420 const std::string providerID =
421 widget.providerList->selectedItems()[0]->text().toStdString();
423 if (std::find(clouds.begin(), clouds.end(), providerID) != clouds.end())
426 int result = saveDialog.exec();
428 if (result == QDialog::Accepted)
431 const pcl::PointCloud<PointT>& originalCloud = *coinCloud.
getPCLCloud();
436 case visionx::PointContentType::ePoints:
437 storePointCloudAs(fileName, originalCloud);
439 case visionx::PointContentType::eColoredPoints:
440 storePointCloudAs(fileName, originalCloud);
442 case visionx::PointContentType::eColoredLabeledPoints:
443 storePointCloudAs(fileName, originalCloud);
445 case visionx::PointContentType::eLabeledPoints:
446 storePointCloudAs(fileName, originalCloud);
450 <<
"Unexpected point cloud content type: "
461 template <
class Po
intCloudT>
463 WidgetController::storePointCloudAs(
const std::string&
filename,
const PointCloudT& pointCloud)
467 if (std::is_same<StoredPointT, PointT>())
469 pcl::io::savePCDFile(
filename, pointCloud);
473 pcl::PointCloud<StoredPointT> stored;
474 pcl::copyPointCloud(pointCloud, stored);
475 pcl::io::savePCDFile(
filename, stored);
482 widget.configColumn->setVisible(
false);
488 widget.configColumn->setVisible(
true);
493 visionx::WidgetController::setPointSize(
double value)
496 pointSize =
static_cast<float>(
value);