From 820327e805c9f12b46ca6ac2c45df761da2d1324 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Tue, 17 Aug 2021 09:19:02 +0200
Subject: [PATCH] Show eigen matrix data in Instance View

---
 .../TypedDataDisplayVisitor.cpp               | 67 ++++++++++++++++---
 .../TypedDataDisplayVisitor.h                 | 17 ++++-
 2 files changed, 73 insertions(+), 11 deletions(-)

diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp
index 827d14a59..8ea426b08 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp
@@ -4,6 +4,8 @@
 
 #include <SimoxUtility/algorithm/string.h>
 
+#include <ArmarXCore/core/logging/Logging.h>
+
 #include <RobotAPI/libraries/aron/core/Exception.h>
 #include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h>
 #include <RobotAPI/libraries/armem/core/Time.h>
@@ -22,6 +24,14 @@ namespace armarx::aron
         return v.value.str();
     }
 
+
+    TypedDataDisplayVisitor::TypedDataDisplayVisitor() :
+        coeffSep("  "),
+        eigenIof(Eigen::StreamPrecision, 0, coeffSep, "\n", "", "", "", "")
+    {
+    }
+
+
     bool TypedDataDisplayVisitor::visitEnter(DictTypeNavigator&, DictDataNavigator& data)
     {
         value << DataDisplayVisitor::getValue(data);
@@ -54,12 +64,14 @@ namespace armarx::aron
 
     bool TypedDataDisplayVisitor::visit(DoubleTypeNavigator&, DoubleDataNavigator& data)
     {
+        setStreamPrecision();
         value << DataDisplayVisitor::getValue(data);
         return false;
     }
 
     bool TypedDataDisplayVisitor::visit(FloatTypeNavigator&, FloatDataNavigator& data)
     {
+        setStreamPrecision();
         value << DataDisplayVisitor::getValue(data);
         return false;
     }
@@ -85,20 +97,45 @@ namespace armarx::aron
     bool TypedDataDisplayVisitor::visit(TimeTypeNavigator&, LongDataNavigator& data)
     {
         armem::Time time = armem::Time::microSeconds(data.getValue());
-        armem::toDateTimeMilliSeconds(time);
         value << armem::toDateTimeMilliSeconds(time);
         return false;
     }
 
-    bool TypedDataDisplayVisitor::visit(EigenMatrixTypeNavigator&, NDArrayDataNavigator& data)
+
+    template <typename ScalarT>
+    void TypedDataDisplayVisitor::processEigenMatrix(EigenMatrixTypeNavigator& type, NDArrayDataNavigator& data)
     {
-        value << DataDisplayVisitor::getValue(data);
+        Eigen::Map<Eigen::Matrix<ScalarT, Eigen::Dynamic, Eigen::Dynamic>> m(reinterpret_cast<ScalarT*>(data.getData()), type.getRows(), type.getCols());
+        value << m.format(eigenIof);
+    }
+
+    bool TypedDataDisplayVisitor::visit(EigenMatrixTypeNavigator& t, NDArrayDataNavigator& data)
+    {
+        if (std::max(t.getRows(), t.getCols()) > 10)
+        {
+            // Just show the shape.
+            value << DataDisplayVisitor::getValue(data);
+        }
+        else if (data.getType() == "float")
+        {
+            setStreamPrecision();
+            processEigenMatrix<float>(t, data);
+        }
+        else if (data.getType() == "double")
+        {
+            setStreamPrecision();
+            processEigenMatrix<double>(t, data);
+        }
+        else
+        {
+            value << DataDisplayVisitor::getValue(data);
+        }
         return false;
     }
 
     bool TypedDataDisplayVisitor::visit(EigenQuaternionTypeNavigator&, NDArrayDataNavigator& data)
     {
-        value << DataDisplayVisitor::getValue(data);
+        processEigenQuaternion(data);
         return false;
     }
 
@@ -123,25 +160,35 @@ namespace armarx::aron
     bool TypedDataDisplayVisitor::visit(PoseTypeNavigator&, NDArrayDataNavigator& data)
     {
         const Eigen::Matrix4f pose = aron::converter::AronEigenConverter::ConvertToMatrix4f(data);
-        value << std::setprecision(2) << std::fixed;
-        value << pose.format(Eigen::IOFormat(Eigen::StreamPrecision, 0, coeffSep, "\n", "", "", "", ""));
+        setStreamPrecision();
+        value << pose.format(eigenIof);
         return false;
     }
 
     bool TypedDataDisplayVisitor::visit(PositionTypeNavigator&, NDArrayDataNavigator& data)
     {
         const Eigen::Vector3f pos = aron::converter::AronEigenConverter::ConvertToVector3f(data);
-        value << std::setprecision(2) << std::fixed;
-        value << pos.format(Eigen::IOFormat(Eigen::StreamPrecision, 0, "", coeffSep, "", "", "", ""));
+        setStreamPrecision();
+        value << pos.format(eigenIof);
         return false;
     }
 
     bool TypedDataDisplayVisitor::visit(OrientationTypeNavigator&, NDArrayDataNavigator& data)
+    {
+        processEigenQuaternion(data);
+        return false;
+    }
+
+    void TypedDataDisplayVisitor::processEigenQuaternion(visitor::TypedDataVisitor::NDArrayDataNavigator& data)
     {
         const Eigen::Quaternionf quat = aron::converter::AronEigenConverter::ConvertToQuaternionf(data);
-        value << std::setprecision(2) << std::fixed;
+        setStreamPrecision();
         value << quat.w() << coeffSep << "|" << coeffSep << quat.x() << coeffSep << quat.y() << coeffSep << quat.z();
-        return false;
+    }
+
+    void TypedDataDisplayVisitor::setStreamPrecision()
+    {
+        value << std::setprecision(2) << std::fixed;
     }
 
 }
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h
index 3923b7d0d..2119e0ac7 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h
@@ -3,6 +3,8 @@
 #include <sstream>
 #include <string>
 
+#include <Eigen/Core>
+
 #include <RobotAPI/libraries/aron/core/navigator/visitors/TypedDataVisitor.h>
 
 
@@ -18,6 +20,9 @@ namespace armarx::aron
 
     public:
 
+        TypedDataDisplayVisitor();
+
+
         std::stringstream value;
 
 
@@ -49,7 +54,17 @@ namespace armarx::aron
 
     protected:
 
-        std::string coeffSep = "  ";
+        std::string coeffSep;
+        Eigen::IOFormat eigenIof;
+
+
+    private:
+
+        template <typename ScalarT>
+        void processEigenMatrix(EigenMatrixTypeNavigator&, NDArrayDataNavigator& data);
+        void processEigenQuaternion(NDArrayDataNavigator& data);
+
+        void setStreamPrecision();
 
     };
 
-- 
GitLab