diff --git a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp index 27a93c10e3ba52fd951bade226208e2c924a8ade..2e0295e0be3415763d10bd8912cac4b1393a258b 100644 --- a/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp +++ b/source/RobotAPI/libraries/armem_gui/MemoryViewer.cpp @@ -311,7 +311,18 @@ namespace armarx::armem::gui void MemoryViewer::resolveMemoryID(const MemoryID& id) { - ARMARX_IMPORTANT << "Resolving memory ID: " << id; + // ARMARX_IMPORTANT << "Resolving memory ID: " << id; + + auto handleError = [this](const std::string & msg) + { + statusLabel->setText(QString::fromStdString(msg)); + ARMARX_WARNING << msg; + }; + + if (id.memoryName.empty()) + { + handleError("Memory name is empty."); + } aron::typenavigator::ObjectNavigatorPtr segmentType; std::optional<wm::EntityInstance> instance; @@ -340,14 +351,20 @@ namespace armarx::armem::gui { // May be handled by remote lookup (void) e; - // ARMARX_WARNING << e.what(); - // statusLabel->setText(e.what()); } if (!instance) { - // Resolve remotely (may still fail, returns an optional). - instance = mns.resolveEntityInstance(id); + try + { + // Resolve remotely (may still fail, returns an optional). + instance = mns.resolveEntityInstance(id); + } + catch (const armem::error::ArMemError& e) + { + ARMARX_WARNING << e.what(); + statusLabel->setText(e.what()); + } } if (instance) diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp index 64b36187577bd0dacf4b500a29cfd530ee27bf6b..31ecadffade21621779eacb6d7af688e3ede02fe 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp @@ -37,6 +37,8 @@ namespace armarx::armem::gui::instance InstanceView::InstanceView() { + Logging::setTag("InstanceView"); + QLayout* layout = new QVBoxLayout(); this->setLayout(layout); int margin = 3; @@ -266,14 +268,13 @@ namespace armarx::armem::gui::instance const std::string typeName = item->text(int(Columns::TYPE)).toStdString(); if (typeName == instance::sanitizedMemoryIDTypeName) { - aron::Path path = getPath(); + const aron::Path path = getPath(); - QAction* viewAction = new QAction("Resolve Memory ID"); - menu.addAction(viewAction); - connect(viewAction, &QAction::triggered, [this, path]() + QAction* action = makeResolveMemoryIdAction(path); + if (action) { - this->requestMemoryIdResolution(path); - }); + menu.addAction(action); + } } @@ -283,62 +284,34 @@ namespace armarx::armem::gui::instance } } - void InstanceView::showImageView(const aron::Path& elementPath) - { - if (!currentInstance) - { - return; - } - if (!imageView) - { - WidgetsWithToolbar* toolbar = new WidgetsWithToolbar(); - - imageView = new ImageView(); - imageView->toolbar = toolbar; - toolbar->addWidget(imageView); - - splitter->addWidget(toolbar); - connect(toolbar, &WidgetsWithToolbar::closing, [this]() - { - imageView = nullptr; - }); - } - imageView->elementPath = elementPath; - updateImageView(currentInstance->data()); - } - - void InstanceView::removeImageView() + QAction* InstanceView::makeResolveMemoryIdAction(const aron::Path& elementPath) { - imageView->toolbar->close(); - imageView = nullptr; - } - - void InstanceView::requestMemoryIdResolution(const aron::Path& elementPath) - { - const aron::datanavigator::DictNavigatorPtr& data = currentInstance->data(); - aron::datanavigator::NavigatorPtr element; try { - element = data->navigateAbsolute(elementPath); + element = currentInstance->data()->navigateAbsolute(elementPath); } // This can happen when the underlying entity structure changes (a new entity has been selected). catch (const aron::error::AronException&) { // showErrorMessage(e.what()); - return; + return nullptr; } - catch (const armarx::LocalException&) + catch (const armarx::LocalException& e) { - // showErrorMessage(e.what()); - return; + showErrorMessage(e.what()); + return nullptr; } + std::stringstream couldNotParseMsg; + couldNotParseMsg << "Element " << elementPath.toString() << " could not be parsed as MemoryID."; + auto dictElement = std::dynamic_pointer_cast<aron::datanavigator::DictNavigator>(element); if (!dictElement) { - return; + showErrorMessage(couldNotParseMsg.str() + " (Failed to cast to DictNavigator.)"); + return nullptr; } MemoryID id; @@ -349,14 +322,60 @@ namespace armarx::armem::gui::instance armem::fromAron(dto, id); } catch (const armarx::aron::error::AronException&) + { + showErrorMessage(couldNotParseMsg.str()); + return nullptr; + } + + QAction* action = new QAction("Resolve Memory ID"); + + if (not(id.hasEntityName() and id.isWellDefined())) + { + action->setDisabled(true); + action->setText(action->text() + " (incomplete Memory ID)"); + } + connect(action, &QAction::triggered, [this, id]() + { + // ARMARX_IMPORTANT << "emit memoryIdResolutionRequested(id = " << id << ")"; + emit memoryIdResolutionRequested(id); + }); + + return action; + } + + + void InstanceView::showImageView(const aron::Path& elementPath) + { + if (!currentInstance) { return; } + if (!imageView) + { + WidgetsWithToolbar* toolbar = new WidgetsWithToolbar(); - ARMARX_IMPORTANT << "emit memoryIdResolutionRequested(id = " << id << ")"; - emit memoryIdResolutionRequested(id); + imageView = new ImageView(); + imageView->toolbar = toolbar; + toolbar->addWidget(imageView); + + splitter->addWidget(toolbar); + + connect(toolbar, &WidgetsWithToolbar::closing, [this]() + { + imageView = nullptr; + }); + } + imageView->elementPath = elementPath; + updateImageView(currentInstance->data()); } + void InstanceView::removeImageView() + { + imageView->toolbar->close(); + imageView = nullptr; + } + + void InstanceView::updateImageView(const aron::datanavigator::DictNavigatorPtr& data) { using aron::datanavigator::NDArrayNavigator; diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h index 504b0e9eaef4d7225a15b90598d0b7e51ad02692..f67e61152e7c8174721c75e99e401d652a5e52c3 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h +++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h @@ -23,7 +23,7 @@ namespace armarx::armem::gui::instance class WidgetsWithToolbar; - class InstanceView : public QWidget + class InstanceView : public QWidget, public Logging { Q_OBJECT using This = InstanceView; @@ -57,8 +57,6 @@ namespace armarx::armem::gui::instance void showImageView(const aron::Path& elementPath); void removeImageView(); - void requestMemoryIdResolution(const aron::Path& elementPath); - private: @@ -69,6 +67,8 @@ namespace armarx::armem::gui::instance void showErrorMessage(const std::string& message); + QAction* makeResolveMemoryIdAction(const aron::Path& elementPath); + private: