From 549cc1941da8f03670b476e445d1b37e2c3bdcbf Mon Sep 17 00:00:00 2001 From: Rainer Kartmann <rainer.kartmann@kit.edu> Date: Mon, 4 Dec 2023 14:30:14 +0100 Subject: [PATCH] Add getObjectClasses() --- .../client/class/ClassReader.cpp | 40 +++++++++++++++++++ .../armem_objects/client/class/ClassReader.h | 14 +++++-- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp index bceba7d96..aa16a8441 100644 --- a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp +++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp @@ -1,5 +1,9 @@ #include "ClassReader.h" +#include <RobotAPI/libraries/armem/client/query.h> +#include <RobotAPI/libraries/armem_objects/aron_conversions.h> +#include <RobotAPI/libraries/armem_objects/types.h> + namespace armarx::armem::obj::clazz { std::optional<armem::clazz::ObjectClass> @@ -27,6 +31,42 @@ namespace armarx::armem::obj::clazz return std::nullopt; } + std::map<ObjectID, armem::clazz::ObjectClass> + ClassReader::getObjectClasses(const std::vector<ObjectID>& objectIDs) + { + armem::client::query::Builder builder; + auto entities = builder.coreSegments() + .withName(properties().coreSegmentName) + .providerSegments() + .all() + .entities(); + + for (const ObjectID& objectID : objectIDs) + { + entities.withName(objectID.getClassID().str()).snapshots().latest(); + } + + const armem::client::QueryResult result = memoryReader().query(builder); + if (not result.success) + { + throw armem::error::QueryFailed(result.errorMessage); + } + + std::map<ObjectID, armem::clazz::ObjectClass> objectClasses; + + result.memory.forEachInstance( + [&objectClasses](const armem::wm::EntityInstance& instance) -> bool + { + const ObjectID classID = ObjectID::FromString(instance.id().entityName); + auto aron = instance.dataAs<armarx::armem::arondto::ObjectClass>(); + armarx::armem::clazz::fromAron(aron, objectClasses[classID]); + + return true; + }); + + return objectClasses; + } + std::string ClassReader::propertyPrefix() const { diff --git a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h index 4d2805b4f..8dd50018a 100644 --- a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h +++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h @@ -21,11 +21,10 @@ #pragma once -#include <mutex> +#include <map> #include <optional> #include <RobotAPI/libraries/armem/client/util/SimpleReaderBase.h> -#include <RobotAPI/libraries/armem_objects/aron_conversions.h> #include <RobotAPI/libraries/armem_objects/types.h> namespace armarx::armem::obj::clazz @@ -38,11 +37,18 @@ namespace armarx::armem::obj::clazz std::optional<armem::clazz::ObjectClass> getObjectClass(const std::string& providerName, const armarx::ObjectID& id); + /** + * @brief Get object class information for object class IDs. + * @param objectIDs The object class IDs. + * @return The corresponding object classes. + * @throw armarx::armem::error::QueryFailed If the memory query failed. + */ + std::map<armarx::ObjectID, armem::clazz::ObjectClass> + getObjectClasses(const std::vector<armarx::ObjectID>& objectIDs); + protected: std::string propertyPrefix() const final; Properties defaultProperties() const final; - - private: }; -- GitLab