diff --git a/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidget.ui b/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidget.ui index 83f77d3ae4886eaced3509fa4c1af1c62a21d80f..de8496435fea6ea6fb7dca4bce1833fffa0ee632 100644 --- a/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidget.ui +++ b/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidget.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>400</width> - <height>300</height> + <width>522</width> + <height>378</height> </rect> </property> <property name="windowTitle"> @@ -15,46 +15,120 @@ </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> - <widget class="QGroupBox" name="objectsGroupBox"> - <property name="title"> - <string>Objects</string> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QPushButton" name="updateButton"> + <property name="text"> + <string>Update</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="autoUpdateCheckBox"> + <property name="text"> + <string>Auto Update</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> + </item> + <item> + <widget class="QTabWidget" name="tabWidget"> + <property name="currentIndex"> + <number>1</number> </property> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QPushButton" name="updateObjectsButton"> - <property name="text"> - <string>Update</string> - </property> - </widget> - </item> - <item> - <widget class="QCheckBox" name="autoUpdateCheckBox"> - <property name="text"> - <string>Auto Update</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - </layout> - </item> - <item> - <widget class="QTableWidget" name="objectsTable"/> - </item> - </layout> + <widget class="QWidget" name="tabObjects"> + <attribute name="title"> + <string>Objects</string> + </attribute> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QTableWidget" name="objectsTable"/> + </item> + </layout> + </widget> + <widget class="QWidget" name="tabRequest"> + <attribute name="title"> + <string>Request</string> + </attribute> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QTableWidget" name="requestTable"/> + </item> + </layout> + </item> + <item> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <widget class="QLabel" name="label_2"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Preferred" vsizetype="Maximum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Timeout:</string> + </property> + </widget> + </item> + <item> + <widget class="QDoubleSpinBox" name="requestTimeoutSpinBox"> + <property name="suffix"> + <string> s</string> + </property> + <property name="maximum"> + <double>999.000000000000000</double> + </property> + <property name="singleStep"> + <double>0.250000000000000</double> + </property> + <property name="value"> + <double>5.000000000000000</double> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="requestInfiniteCheckBox"> + <property name="text"> + <string>Infinite</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="requestButton"> + <property name="sizePolicy"> + <sizepolicy hsizetype="Minimum" vsizetype="Minimum"> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Request +Selected +Objects</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> </widget> </item> </layout> diff --git a/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidgetController.cpp b/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidgetController.cpp index 9c97a261eec0c4aadb303ac8e2f61607202bbf75..e4373f379e851fbf053fa798be629db19510ec9a 100644 --- a/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidgetController.cpp +++ b/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidgetController.cpp @@ -41,9 +41,19 @@ namespace armarx widget.objectsTable->setColumnCount(header.size()); widget.objectsTable->setHorizontalHeaderLabels(header); + + header = QStringList{"Dataset", "ClassName", "Type", "Provider", "Request"}; + widget.requestTable->setColumnCount(header.size()); + widget.requestTable->setHorizontalHeaderLabels(header); + + using This = ObjectPoseGuiWidgetController; - connect(widget.updateObjectsButton, &QPushButton::clicked, this, &This::updateObjects); + connect(widget.updateButton, &QPushButton::pressed, this, &This::updateTab); + connect(widget.tabWidget, &QTabWidget::currentChanged, this, &This::updateTab); + + connect(widget.requestButton, &QPushButton::pressed, this, &This::requestSelectedObjects); + // QTimer* timer = new QTimer(this,); } @@ -66,7 +76,7 @@ namespace armarx QString ObjectPoseGuiWidgetController::GetWidgetName() { - return "ObjectPoseGui"; + return "VisionX.ObjectPoseGui"; } static const std::string CONFIG_KEY_OBJECT_POSE_OBSERVER = "ObjectPoseObserver"; @@ -105,19 +115,40 @@ namespace armarx } } - void ObjectPoseGuiWidgetController::updateObjects() + void ObjectPoseGuiWidgetController::onDisconnectComponent() + { + objectPoseObserver = nullptr; + } + + void ObjectPoseGuiWidgetController::updateTab() + { + if (widget.tabWidget->currentWidget() == widget.tabObjects) + { + updateObjectsTab(); + } + else if (widget.tabWidget->currentWidget() == widget.tabRequest) + { + updateRequestTab(); + } + } + + void ObjectPoseGuiWidgetController::updateObjectsTab() { if (!objectPoseObserver) { + ARMARX_WARNING << "No object pose observer."; return; } - ARMARX_INFO << "Get object poses..."; + IceUtil::Time start = IceUtil::Time::now(); + ARMARX_INFO << "Getting object poses..."; // const objpose::ObjectPoseSeq objectPoses = objpose::fromIce(objectPoseObserver->getObjectPoses()); const objpose::data::ObjectPoseSeq objectPoses = objectPoseObserver->getObjectPoses(); - ARMARX_INFO << "Got " << objectPoses.size() << " object poses."; + ARMARX_INFO << "Got " << objectPoses.size() << " object poses. " + << "(Took " << (IceUtil::Time::now() - start).toMilliSeconds() << " ms.)"; + start = IceUtil::Time::now(); widget.objectsTable->setRowCount(int(objectPoses.size())); for (int i = 0; i < int(objectPoses.size()); ++i) @@ -135,7 +166,80 @@ namespace armarx i, col++, new QTableWidgetItem(pose.providerName.c_str())); widget.objectsTable->setItem( i, col++, new QTableWidgetItem(objpose::ObjectTypeEnumNames.to_name(pose.objectType).c_str())); + } + ARMARX_INFO << "Gui update took " << (IceUtil::Time::now() - start).toMilliSeconds() << " ms."; + } + + void ObjectPoseGuiWidgetController::updateRequestTab() + { + if (!objectPoseObserver) + { + ARMARX_WARNING << "No object pose observer."; + return; + } + + IceUtil::Time start = IceUtil::Time::now(); + objpose::ProviderInfoMap availableProvidersInfo = objectPoseObserver->getAvailableProvidersInfo(); + ARMARX_INFO << "Got infos of " << availableProvidersInfo.size() << " object poses. " + << "(Took " << (IceUtil::Time::now() - start).toMilliSeconds() << " ms.)"; + + start = IceUtil::Time::now(); + int row = 0; + for (const auto& [providerName, info] : availableProvidersInfo) + { + for (const auto& id : info.supportedObjects) + { + int col = 0; + + // header = QStringList{"Dataset", "ClassName", "Type", "Provider", "Request"}; + /* + if (row < widget.requestTable->rowCount()) + { + widget.requestTable->item(row, col++)->setText(id.dataset.c_str()); + widget.requestTable->item(row, col++)->setText(id.className.c_str()); + widget.requestTable->item(row, col++)->setText(objpose::ObjectTypeEnumNames.to_name(info.objectType).c_str()); + widget.requestTable->item(row, col++)->setText(providerName.c_str()); + widget.requestTable->item(row, col++)->setText(id.dataset.c_str()); + QCheckBox* requestCheckBox = new QCheckBox(); + widget.requestTable->setCellWidget(row, col++, requestCheckBox); + } + else + */ + widget.requestTable->setItem( + row, col++, new QTableWidgetItem(id.dataset.c_str())); + widget.requestTable->setItem( + row, col++, new QTableWidgetItem(id.className.c_str())); + widget.requestTable->setItem( + row, col++, new QTableWidgetItem(objpose::ObjectTypeEnumNames.to_name(info.objectType).c_str())); + widget.requestTable->setItem( + row, col++, new QTableWidgetItem(providerName.c_str())); + QCheckBox* requestCheckBox = new QCheckBox(); + widget.requestTable->setCellWidget(row, col++, requestCheckBox); + + ++row; + } + } + + ARMARX_INFO << "Gui update took " << (IceUtil::Time::now() - start).toMilliSeconds() << " ms."; + } + + void ObjectPoseGuiWidgetController::requestSelectedObjects() + { + objpose::RequestObjectsInput requests; + + QTableWidget* table = widget.requestTable; + for (int row = 0; row < table->rowCount(); ++row) + { + QCheckBox* selected = dynamic_cast<QCheckBox*>(table->cellWidget(row, table->columnCount() - 1)); + ARMARX_CHECK_NOT_NULL(selected); + if (selected->isChecked()) + { + objpose::ObjectID id; + id.dataset = table->item(row, 0)->text().toStdString(); + id.className = table->item(row, 1)->text().toStdString(); + requests.objectIDs.emplace_back(id); + } } } diff --git a/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidgetController.h b/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidgetController.h index d9b716d7cc4186cbbff58858aaf25088726fa283..26767131953cdd7f756951fdf011597d7716426b 100644 --- a/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidgetController.h +++ b/source/RobotAPI/gui-plugins/ObjectPoseGui/ObjectPoseGuiWidgetController.h @@ -53,7 +53,7 @@ namespace armarx * Detailed description */ class ARMARXCOMPONENT_IMPORT_EXPORT - ObjectPoseGuiWidgetController: + ObjectPoseGuiWidgetController : public armarx::ArmarXComponentWidgetControllerTemplate < ObjectPoseGuiWidgetController > { Q_OBJECT @@ -85,11 +85,19 @@ namespace armarx /// @see armarx::Component::onConnectComponent() void onConnectComponent() override; + /// @see armarx::Component::onConnectComponent() + void onDisconnectComponent() override; + public slots: /* QT slot declarations */ - void updateObjects(); + /// Update the currently opened tab. + void updateTab(); + void updateObjectsTab(); + void updateRequestTab(); + + void requestSelectedObjects(); signals: @@ -102,7 +110,6 @@ namespace armarx QPointer<SimpleConfigDialog> configDialog; - std::string objectPoseObserverName; armarx::objpose::ObjectPoseObserverInterfacePrx objectPoseObserver;