diff --git a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt index c03f50a293b26523cf500c9ccedf75360ced2111..65af5d76ee017656ea700023be2b34b6e51feb83 100644 --- a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt @@ -38,6 +38,7 @@ set(SOURCES instance/serialize_path.cpp instance/display_visitors/DataDisplayVisitor.cpp + instance/display_visitors/StringStreamMixin.cpp instance/display_visitors/TypedDataDisplayVisitor.cpp instance/tree_builders/DataTreeBuilder.cpp @@ -87,6 +88,7 @@ set(HEADERS instance/serialize_path.h instance/display_visitors/DataDisplayVisitor.h + instance/display_visitors/StringStreamMixin.h instance/display_visitors/TypedDataDisplayVisitor.h instance/tree_builders/DataTreeBuilder.h 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 99f95201e220830607148af08c1a9cce6ded71d2..a814c111cf8d24b728e0406ff89d9f428ab6ed99 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.cpp @@ -5,26 +5,30 @@ namespace armarx::aron { - std::string DataDisplayVisitor::getValue(const data::VariantPtr& n) + std::string + DataDisplayVisitor::getValue(const data::VariantPtr& n) { DataDisplayVisitor v; data::visit(v, n); return v.value.str(); } - void DataDisplayVisitor::visitDict(const data::VariantPtr& n) + void + DataDisplayVisitor::visitDict(const data::VariantPtr& n) { auto x = data::Dict::DynamicCastAndCheck(n); value << x->childrenSize() << " items"; } - void DataDisplayVisitor::visitList(const data::VariantPtr& n) + void + DataDisplayVisitor::visitList(const data::VariantPtr& n) { auto x = data::List::DynamicCastAndCheck(n); value << x->childrenSize() << " items"; } - void DataDisplayVisitor::visitBool(const data::VariantPtr& b) + void + DataDisplayVisitor::visitBool(const data::VariantPtr& b) { auto x = data::Bool::DynamicCastAndCheck(b); if (x->getValue()) @@ -37,41 +41,101 @@ namespace armarx::aron } } - void DataDisplayVisitor::visitDouble(const data::VariantPtr& n) + void + DataDisplayVisitor::visitDouble(const data::VariantPtr& n) { auto x = data::Double::DynamicCastAndCheck(n); value << x->getValue(); } - void DataDisplayVisitor::visitFloat(const data::VariantPtr& n) + void + DataDisplayVisitor::visitFloat(const data::VariantPtr& n) { auto x = data::Float::DynamicCastAndCheck(n); value << x->getValue(); } - void DataDisplayVisitor::visitInt(const data::VariantPtr& n) + void + DataDisplayVisitor::visitInt(const data::VariantPtr& n) { auto x = data::Int::DynamicCastAndCheck(n); value << x->getValue(); } - void DataDisplayVisitor::visitLong(const data::VariantPtr& n) + void + DataDisplayVisitor::visitLong(const data::VariantPtr& n) { auto x = data::Long::DynamicCastAndCheck(n); value << x->getValue(); } - void DataDisplayVisitor::visitString(const data::VariantPtr& n) + void + DataDisplayVisitor::visitString(const data::VariantPtr& n) { auto x = data::String::DynamicCastAndCheck(n); value << "'" << x->getValue() << "'"; } - void DataDisplayVisitor::visitNDArray(const data::VariantPtr& n) + void + DataDisplayVisitor::visitNDArray(const data::VariantPtr& data) { - auto x = data::NDArray::DynamicCastAndCheck(n); - value << "shape " << aron::data::NDArray::DimensionsToString(x->getShape()) << ", type '" << x->getType() << "'"; + auto d = data::NDArray::DynamicCastAndCheck(data); + + if (d->getType() == "float") + { + setStreamPrecision(); + processMatrix<float>(*d); + } + else if (d->getType() == "double") + { + setStreamPrecision(); + processMatrix<double>(*d); + } + else + { + 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) + { + 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); + } } -} +} // namespace armarx::aron 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 1595e6ffb601278cb186d61f3a5f2535ff8bbcfb..26d8aae07a87dbc82bb3b44e9e8154f3cfc8315f 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h +++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/DataDisplayVisitor.h @@ -4,20 +4,18 @@ #include <RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h> +#include "StringStreamMixin.h" namespace armarx::aron { - class DataDisplayVisitor : public aron::data::ConstVariantVisitor + class DataDisplayVisitor : public aron::data::ConstVariantVisitor, public StringStreamMixin { public: static std::string getValue(const data::VariantPtr& n); public: - - std::stringstream value; - void visitDict(const data::VariantPtr& n) override; void visitList(const data::VariantPtr& n) override; @@ -30,6 +28,11 @@ namespace armarx::aron void visitNDArray(const data::VariantPtr& n) override; + private: + template <typename ScalarT> + void processMatrix(const data::NDArray& data); + + void printShape(const data::NDArray& data); }; -} +} // namespace armarx::aron diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/StringStreamMixin.cpp b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/StringStreamMixin.cpp new file mode 100644 index 0000000000000000000000000000000000000000..768a69b885efa7ae7aa36d8534cb52ece737dd00 --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/StringStreamMixin.cpp @@ -0,0 +1,24 @@ +#include "StringStreamMixin.h" + +#include <iomanip> // std::setprecision + +namespace armarx::aron +{ + StringStreamMixin::StringStreamMixin() : + coeffSep(" "), eigenIof(Eigen::StreamPrecision, 0, coeffSep, "\n", "", "", "", "") + { + } + + void + StringStreamMixin::setStreamPrecision() + { + setStreamPrecision(value); + } + + void + StringStreamMixin::setStreamPrecision(std::ostream& os) + { + os << std::setprecision(2) << std::fixed; + } + +} // namespace armarx::aron diff --git a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/StringStreamMixin.h b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/StringStreamMixin.h new file mode 100644 index 0000000000000000000000000000000000000000..01dfb9d91bef2208400c7a25cad3c5cfa29b8df5 --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/StringStreamMixin.h @@ -0,0 +1,27 @@ +#pragma once + +#include <sstream> + +#include <Eigen/Core> + +namespace armarx::aron +{ + + class StringStreamMixin + { + public: + StringStreamMixin(); + + protected: + void setStreamPrecision(); + void setStreamPrecision(std::ostream& os); + + public: + std::stringstream value; + + protected: + const std::string coeffSep; + const Eigen::IOFormat eigenIof; + }; + +} // namespace armarx::aron 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 6e2e92a7cea71f53f2eb16f4ea369f53176f7079..e9bb7bc4441bb2246ca2d360dc747a3398b4fdfd 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.cpp @@ -24,8 +24,7 @@ namespace armarx::aron return v.value.str(); } - TypedDataDisplayVisitor::TypedDataDisplayVisitor() : - coeffSep(" "), eigenIof(Eigen::StreamPrecision, 0, coeffSep, "\n", "", "", "", "") + TypedDataDisplayVisitor::TypedDataDisplayVisitor() { } @@ -104,7 +103,9 @@ namespace armarx::aron TypedDataDisplayVisitor::processMatrix(const type::Matrix& type, const data::NDArray& data) { Eigen::Map<Eigen::Matrix<ScalarT, Eigen::Dynamic, Eigen::Dynamic>> m( - reinterpret_cast<ScalarT*>(data.getData()), type.getRows(), type.getCols()); + reinterpret_cast<ScalarT*>(data.getData()), + data.getShape().at(0), + data.getShape().at(1)); value << m.format(eigenIof); } @@ -158,28 +159,7 @@ namespace armarx::aron void TypedDataDisplayVisitor::visitMatrix(const data::VariantPtr& data, const type::VariantPtr& type) { - auto t = *type::Matrix::DynamicCastAndCheck(type); - auto d = *data::NDArray::DynamicCastAndCheck(data); - - if (std::max(t.getRows(), t.getCols()) > 10) - { - // Just show the shape. - value << DataDisplayVisitor::getValue(data); - } - else if (d.getType() == "float") - { - setStreamPrecision(); - processMatrix<float>(t, d); - } - else if (d.getType() == "double") - { - setStreamPrecision(); - processMatrix<double>(t, d); - } - else - { - value << DataDisplayVisitor::getValue(data); - } + value << DataDisplayVisitor::getValue(data); } void @@ -204,16 +184,4 @@ namespace armarx::aron value << DataDisplayVisitor::getValue(data); } - void - TypedDataDisplayVisitor::setStreamPrecision() - { - setStreamPrecision(value); - } - - void - TypedDataDisplayVisitor::setStreamPrecision(std::ostream& os) - { - os << std::setprecision(2) << std::fixed; - } - } // namespace armarx::aron 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 9d0193e376c3ddf9d346d9f3d2114be547138fcb..cdbcf69129ff9a3224c3f14d8f87a168d54238c4 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h +++ b/source/RobotAPI/libraries/armem_gui/instance/display_visitors/TypedDataDisplayVisitor.h @@ -7,25 +7,22 @@ #include <RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h> +#include "StringStreamMixin.h" namespace armarx::aron { - class TypedDataDisplayVisitor : public aron::data::ConstTypedVariantVisitor + class TypedDataDisplayVisitor : + public aron::data::ConstTypedVariantVisitor, + public StringStreamMixin { public: - static std::string getValue(const type::VariantPtr& type, const data::VariantPtr& data); public: - TypedDataDisplayVisitor(); - - std::stringstream value; - - void visitDict(const data::VariantPtr& data, const type::VariantPtr& type) override; void visitObject(const data::VariantPtr& data, const type::VariantPtr& type) override; @@ -48,14 +45,7 @@ namespace armarx::aron // What about NDArray? currently defaulted - protected: - - std::string coeffSep; - Eigen::IOFormat eigenIof; - - private: - template <typename ScalarT> void processMatrix(const type::Matrix&, const data::NDArray& data); void processQuaternion(const data::NDArray& data); @@ -63,10 +53,6 @@ namespace armarx::aron void processPose(const type::Matrix&, const data::NDArray& data); void processPosition(const type::Matrix&, const data::NDArray& data); void processOrientation(const type::Quaternion&, const data::NDArray& data); - - void setStreamPrecision(); - void setStreamPrecision(std::ostream& os); - }; -} +} // namespace armarx::aron