#include "Visualization/PlottablesRenderingUtils.h" #include #include #include #include namespace { /** * Delegate used to set plottables properties */ template struct PlottablesSetter { static void setProperties(T &, PlottablesMap &) { // Default implementation does nothing } }; /** * Specialization of PlottablesSetter for scalars and vectors * @sa ScalarSeries * @sa VectorSeries */ template struct PlottablesSetter::value or std::is_base_of::value> > { static void setProperties(T &dataSeries, PlottablesMap &plottables) { // Gets the number of components of the data series dataSeries.lockRead(); auto componentCount = dataSeries.valuesData()->componentCount(); dataSeries.unlock(); // Generates colors for each component auto colors = ColorUtils::colors(Qt::blue, Qt::red, componentCount); // For each component of the data series, creates a QCPGraph to add to the plot for (auto i = 0; i < componentCount; ++i) { auto graph = plottables.at(i); graph->setPen(QPen{colors.at(i)}); } } }; /** * Default implementation of IPlottablesHelper, which takes data series to set plottables properties * @tparam T the data series' type */ template struct PlottablesHelper : public IPlottablesHelper { explicit PlottablesHelper(T &dataSeries) : m_DataSeries{dataSeries} {} void setProperties(PlottablesMap &plottables) override { PlottablesSetter::setProperties(m_DataSeries, plottables); } T &m_DataSeries; }; } // namespace std::unique_ptr IPlottablesHelperFactory::create(std::shared_ptr dataSeries) noexcept { if (auto scalarSeries = std::dynamic_pointer_cast(dataSeries)) { return std::make_unique >(*scalarSeries); } else if (auto vectorSeries = std::dynamic_pointer_cast(dataSeries)) { return std::make_unique >(*vectorSeries); } else { return std::make_unique >(*dataSeries); } }