From b40fbe3f3140f05f842d11095b729291738c7169 Mon Sep 17 00:00:00 2001
From: Rainer Kartmann <rainer.kartmann@kit.edu>
Date: Mon, 26 Jun 2023 15:51:18 +0200
Subject: [PATCH] Show some values if few cols but too many rows

---
 .../display_visitors/DataDisplayVisitor.cpp   | 54 ++++++++++++-------
 .../display_visitors/DataDisplayVisitor.h     |  2 +
 2 files changed, 38 insertions(+), 18 deletions(-)

diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp
index ff3c4df2e..a814c111c 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp
@@ -81,18 +81,7 @@ namespace armarx::aron
     {
         auto d = data::NDArray::DynamicCastAndCheck(data);
 
-        auto base = [this, &d]()
-        {
-            value << "shape " << aron::data::NDArray::DimensionsToString(d->getShape())
-                  << ", type '" << d->getType() << "'";
-        };
-
-        if (std::max(d->getShape().at(0), d->getShape().at(1)) > 10)
-        {
-            // Just show the shape.
-            base();
-        }
-        else if (d->getType() == "float")
+        if (d->getType() == "float")
         {
             setStreamPrecision();
             processMatrix<float>(*d);
@@ -104,19 +93,48 @@ namespace armarx::aron
         }
         else
         {
-            base();
+            printShape(*d);
         }
     }
 
+    void
+    DataDisplayVisitor::printShape(const data::NDArray& d)
+    {
+        value << "shape " << aron::data::NDArray::DimensionsToString(d.getShape()) << ", type '"
+              << d.getType() << "'";
+    }
+
     template <typename ScalarT>
     void
     DataDisplayVisitor::processMatrix(const data::NDArray& data)
     {
-        Eigen::Map<Eigen::Matrix<ScalarT, Eigen::Dynamic, Eigen::Dynamic>> m(
-            reinterpret_cast<ScalarT*>(data.getData()),
-            data.getShape().at(0),
-            data.getShape().at(1));
-        value << m.format(eigenIof);
+        const int rows = data.getShape().at(0);
+        const int cols = data.getShape().at(1);
+
+        const Eigen::Map<Eigen::Matrix<ScalarT, Eigen::Dynamic, Eigen::Dynamic>> m(
+            reinterpret_cast<ScalarT*>(data.getData()), rows, cols);
+
+        const int maxRows = 10;
+        const int maxCols = 10;
+
+        if (cols > maxCols)
+        {
+            printShape(data);
+        }
+        else if (rows > maxRows)
+        {
+            int shownRows = 2;
+
+            value << "(";
+            printShape(data);
+            value << ")\n"
+                  << m.block(0, 0, shownRows, cols) << "\n...\n"
+                  << m.block(rows - shownRows, 0, shownRows, cols);
+        }
+        else
+        {
+            value << m.format(eigenIof);
+        }
     }
 
 
diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h
index 8f15373c0..26d8aae07 100644
--- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h
+++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h
@@ -31,6 +31,8 @@ namespace armarx::aron
     private:
         template <typename ScalarT>
         void processMatrix(const data::NDArray& data);
+
+        void printShape(const data::NDArray& data);
     };
 
 } // namespace armarx::aron
-- 
GitLab