From 90f62b13d6e96dc54f33c9f9d6602b0dbcc1357b Mon Sep 17 00:00:00 2001 From: phesch <ulila@student.kit.edu> Date: Tue, 22 Feb 2022 18:02:24 +0100 Subject: [PATCH] Fix easy JSON exporter for untyped data exports --- .../tree_visitors/TreeTypedJSONConverter.cpp | 32 +++++++++++++++++-- .../tree_visitors/TreeTypedJSONConverter.h | 2 ++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp index d0f2f4c77..f80717342 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp @@ -4,10 +4,10 @@ #include <ArmarXCore/core/logging/Logging.h> -#include <RobotAPI/libraries/aron/core/data/variant/All.h> -#include <RobotAPI/libraries/aron/core/Exception.h> #include <RobotAPI/libraries/armem/core/Time.h> #include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h> +#include <RobotAPI/libraries/aron/core/Exception.h> +#include <RobotAPI/libraries/aron/core/data/variant/All.h> namespace armarx::armem::gui::instance { @@ -27,6 +27,34 @@ namespace armarx::armem::gui::instance return obj; } + /* We override this method because we need to handle untyped members in the hierarchy. + * The other get*Elements() methods will either not be called with a null type or can handle it. + */ + TreeTypedJSONConverter::MapElements + TreeTypedJSONConverter::getObjectElements(DataInput& elementData, TypeInput& elementType) + { + std::map<std::string, std::pair<aron::data::VariantPtr, aron::type::VariantPtr>> ret; + auto data = aron::data::Dict::DynamicCastAndCheck(elementData); + auto type = aron::type::Object::DynamicCastAndCheck(elementType); + + if (data) + { + for (const auto& [key, e] : data->getElements()) + { + if (type && type->hasMemberType(key)) + { + auto memberType = type->getMemberType(key); + ret.insert({key, {e, memberType}}); + } + else + { + ret.insert({key, {e, nullptr}}); + } + } + } + return ret; + } + void TreeTypedJSONConverter::visitObjectOnEnter(DataInput& elementData, TypeInput& /*elementType*/) { diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h index 7a112979e..901021de0 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h @@ -17,6 +17,8 @@ namespace armarx::armem::gui::instance const nlohmann::json& getJSON(); + MapElements getObjectElements(DataInput& elementData, TypeInput& elementType) override; + void visitObjectOnEnter(DataInput& elementData, TypeInput& elementType) override; void visitObjectOnExit(DataInput& elementData, TypeInput& elementType) override; void visitDictOnEnter(DataInput& elementData, TypeInput& elementType) override; -- GitLab