PlottablesRenderingUtils.cpp
79 lines
| 2.4 KiB
| text/x-c
|
CppLexer
Alexandre Leroux
|
r917 | #include "Visualization/PlottablesRenderingUtils.h" | ||
Alexandre Leroux
|
r918 | #include <Common/ColorUtils.h> | ||
Alexandre Leroux
|
r917 | #include <Data/ScalarSeries.h> | ||
#include <Data/VectorSeries.h> | ||||
#include <Visualization/qcustomplot.h> | ||||
namespace { | ||||
/** | ||||
* Delegate used to set plottables properties | ||||
*/ | ||||
template <typename T, typename Enabled = void> | ||||
struct PlottablesSetter { | ||||
static void setProperties(T &, PlottablesMap &) | ||||
{ | ||||
// Default implementation does nothing | ||||
} | ||||
}; | ||||
/** | ||||
* Specialization of PlottablesSetter for scalars and vectors | ||||
* @sa ScalarSeries | ||||
* @sa VectorSeries | ||||
*/ | ||||
template <typename T> | ||||
struct PlottablesSetter<T, typename std::enable_if_t<std::is_base_of<ScalarSeries, T>::value | ||||
or std::is_base_of<VectorSeries, T>::value> > { | ||||
static void setProperties(T &dataSeries, PlottablesMap &plottables) | ||||
{ | ||||
Alexandre Leroux
|
r918 | // 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)}); | ||||
} | ||||
Alexandre Leroux
|
r917 | } | ||
}; | ||||
/** | ||||
* Default implementation of IPlottablesHelper, which takes data series to set plottables properties | ||||
* @tparam T the data series' type | ||||
*/ | ||||
template <typename T> | ||||
struct PlottablesHelper : public IPlottablesHelper { | ||||
explicit PlottablesHelper(T &dataSeries) : m_DataSeries{dataSeries} {} | ||||
void setProperties(PlottablesMap &plottables) override | ||||
{ | ||||
PlottablesSetter<T>::setProperties(m_DataSeries, plottables); | ||||
} | ||||
T &m_DataSeries; | ||||
}; | ||||
} // namespace | ||||
std::unique_ptr<IPlottablesHelper> | ||||
IPlottablesHelperFactory::create(std::shared_ptr<IDataSeries> dataSeries) noexcept | ||||
{ | ||||
if (auto scalarSeries = std::dynamic_pointer_cast<ScalarSeries>(dataSeries)) { | ||||
return std::make_unique<PlottablesHelper<ScalarSeries> >(*scalarSeries); | ||||
} | ||||
else if (auto vectorSeries = std::dynamic_pointer_cast<VectorSeries>(dataSeries)) { | ||||
return std::make_unique<PlottablesHelper<VectorSeries> >(*vectorSeries); | ||||
} | ||||
else { | ||||
return std::make_unique<PlottablesHelper<IDataSeries> >(*dataSeries); | ||||
} | ||||
} | ||||