##// END OF EJS Templates
Changes the name of the mokc plugin nodes to facilitate their access in the merged tree
Changes the name of the mokc plugin nodes to facilitate their access in the merged tree

File last commit:

r1068:e3aea966fca1
r1083:a94048bf05e3
Show More
AxisRenderingUtils.cpp
176 lines | 5.7 KiB | text/x-c | CppLexer
/ gui / src / Visualization / AxisRenderingUtils.cpp
Alexandre Leroux
Refactoring handling of axes properties (1)...
r916 #include "Visualization/AxisRenderingUtils.h"
#include <Data/ScalarSeries.h>
Alexandre Leroux
Handles axes properties for spectrograms...
r921 #include <Data/SpectrogramSeries.h>
Alexandre Leroux
Refactoring handling of axes properties (1)...
r916 #include <Data/VectorSeries.h>
Alexandre Leroux
Uses SciQlop color scale in graphs
r1050 #include <Visualization/SqpColorScale.h>
Alexandre Leroux
Refactoring handling of axes properties (1)...
r916 #include <Visualization/qcustomplot.h>
Alexandre Leroux
Adds logs to axe and plottable rendering utils
r927 Q_LOGGING_CATEGORY(LOG_AxisRenderingUtils, "AxisRenderingUtils")
Alexandre Leroux
Refactoring handling of axes properties (1)...
r916 namespace {
Alexandre Leroux
Refactoring handling of axes properties (2)...
r917 const auto DATETIME_FORMAT = QStringLiteral("yyyy/MM/dd hh:mm:ss:zzz");
/// Format for datetimes on a axis
const auto DATETIME_TICKER_FORMAT = QStringLiteral("yyyy/MM/dd \nhh:mm:ss");
Alexandre Leroux
Tooltip for spectrograms (4)...
r1068 const auto NUMBER_FORMAT = 'g';
const auto NUMBER_PRECISION = 9;
Alexandre Leroux
Refactoring handling of axes properties (2)...
r917 /// Generates the appropriate ticker for an axis, depending on whether the axis displays time or
/// non-time data
Alexandre Leroux
Handles log scales for y-axis and color scale
r928 QSharedPointer<QCPAxisTicker> axisTicker(bool isTimeAxis, QCPAxis::ScaleType scaleType)
Alexandre Leroux
Refactoring handling of axes properties (2)...
r917 {
if (isTimeAxis) {
auto dateTicker = QSharedPointer<QCPAxisTickerDateTime>::create();
dateTicker->setDateTimeFormat(DATETIME_TICKER_FORMAT);
dateTicker->setDateTimeSpec(Qt::UTC);
return dateTicker;
}
Alexandre Leroux
Handles log scales for y-axis and color scale
r928 else if (scaleType == QCPAxis::stLogarithmic) {
return QSharedPointer<QCPAxisTickerLog>::create();
}
Alexandre Leroux
Refactoring handling of axes properties (2)...
r917 else {
// default ticker
return QSharedPointer<QCPAxisTicker>::create();
}
}
/**
* Sets properties of the axis passed as parameter
* @param axis the axis to set
* @param unit the unit to set for the axis
* @param scaleType the scale type to set for the axis
*/
void setAxisProperties(QCPAxis &axis, const Unit &unit,
QCPAxis::ScaleType scaleType = QCPAxis::stLinear)
{
// label (unit name)
axis.setLabel(unit.m_Name);
// scale type
axis.setScaleType(scaleType);
Alexandre Leroux
Handles log scales for y-axis and color scale
r928 if (scaleType == QCPAxis::stLogarithmic) {
// Scientific notation
axis.setNumberPrecision(0);
axis.setNumberFormat("eb");
}
Alexandre Leroux
Refactoring handling of axes properties (2)...
r917
// ticker (depending on the type of unit)
Alexandre Leroux
Handles log scales for y-axis and color scale
r928 axis.setTicker(axisTicker(unit.m_TimeUnit, scaleType));
Alexandre Leroux
Refactoring handling of axes properties (2)...
r917 }
Alexandre Leroux
Refactoring handling of axes properties (1)...
r916 /**
* Delegate used to set axes properties
*/
template <typename T, typename Enabled = void>
struct AxisSetter {
Alexandre Leroux
Uses SciQlop color scale in graphs
r1050 static void setProperties(T &, QCustomPlot &, SqpColorScale &)
Alexandre Leroux
Refactoring handling of axes properties (1)...
r916 {
// Default implementation does nothing
Alexandre Leroux
Adds logs to axe and plottable rendering utils
r927 qCCritical(LOG_AxisRenderingUtils()) << "Can't set axis properties: unmanaged type of data";
Alexandre Leroux
Refactoring handling of axes properties (1)...
r916 }
};
/**
* Specialization of AxisSetter for scalars and vectors
* @sa ScalarSeries
* @sa VectorSeries
*/
template <typename T>
struct AxisSetter<T, typename std::enable_if_t<std::is_base_of<ScalarSeries, T>::value
or std::is_base_of<VectorSeries, T>::value> > {
Alexandre Leroux
Uses SciQlop color scale in graphs
r1050 static void setProperties(T &dataSeries, QCustomPlot &plot, SqpColorScale &)
Alexandre Leroux
Refactoring handling of axes properties (1)...
r916 {
Alexandre Leroux
Refactoring handling of axes properties (2)...
r917 dataSeries.lockRead();
auto xAxisUnit = dataSeries.xAxisUnit();
auto valuesUnit = dataSeries.valuesUnit();
dataSeries.unlock();
setAxisProperties(*plot.xAxis, xAxisUnit);
setAxisProperties(*plot.yAxis, valuesUnit);
Alexandre Leroux
Refactoring handling of axes properties (1)...
r916 }
};
Alexandre Leroux
Handles axes properties for spectrograms...
r921 /**
* Specialization of AxisSetter for spectrograms
* @sa SpectrogramSeries
*/
template <typename T>
struct AxisSetter<T, typename std::enable_if_t<std::is_base_of<SpectrogramSeries, T>::value> > {
Alexandre Leroux
Uses SciQlop color scale in graphs
r1050 static void setProperties(T &dataSeries, QCustomPlot &plot, SqpColorScale &colorScale)
Alexandre Leroux
Handles axes properties for spectrograms...
r921 {
dataSeries.lockRead();
auto xAxisUnit = dataSeries.xAxisUnit();
Alexandre Leroux
Updates access to y-axis properties of the data series (1)...
r1030 auto yAxisUnit = dataSeries.yAxisUnit();
Alexandre Leroux
Handles axes properties for spectrograms...
r921 auto valuesUnit = dataSeries.valuesUnit();
dataSeries.unlock();
setAxisProperties(*plot.xAxis, xAxisUnit);
Alexandre Leroux
Handles log scales for y-axis and color scale
r928 setAxisProperties(*plot.yAxis, yAxisUnit, QCPAxis::stLogarithmic);
Alexandre Leroux
Handles axes properties for spectrograms...
r921
// Displays color scale in plot
plot.plotLayout()->insertRow(0);
Alexandre Leroux
Uses SciQlop color scale in graphs
r1050 plot.plotLayout()->addElement(0, 0, colorScale.m_Scale);
colorScale.m_Scale->setType(QCPAxis::atTop);
colorScale.m_Scale->setMinimumMargins(QMargins{0, 0, 0, 0});
Alexandre Leroux
Handles axes properties for spectrograms...
r921
// Aligns color scale with axes
auto marginGroups = plot.axisRect()->marginGroups();
for (auto it = marginGroups.begin(), end = marginGroups.end(); it != end; ++it) {
Alexandre Leroux
Uses SciQlop color scale in graphs
r1050 colorScale.m_Scale->setMarginGroup(it.key(), it.value());
Alexandre Leroux
Handles axes properties for spectrograms...
r921 }
// Set color scale properties
Alexandre Leroux
Uses SciQlop color scale in graphs
r1050 setAxisProperties(*colorScale.m_Scale->axis(), valuesUnit, QCPAxis::stLogarithmic);
Alexandre Leroux
Handles axes properties for spectrograms...
r921 }
};
Alexandre Leroux
Refactoring handling of axes properties (1)...
r916 /**
* Default implementation of IAxisHelper, which takes data series to set axes properties
* @tparam T the data series' type
*/
template <typename T>
struct AxisHelper : public IAxisHelper {
explicit AxisHelper(T &dataSeries) : m_DataSeries{dataSeries} {}
Alexandre Leroux
Uses SciQlop color scale in graphs
r1050 void setProperties(QCustomPlot &plot, SqpColorScale &colorScale) override
Alexandre Leroux
Refactoring handling of axes properties (1)...
r916 {
AxisSetter<T>::setProperties(m_DataSeries, plot, colorScale);
}
T &m_DataSeries;
};
} // namespace
Alexandre Leroux
Refactoring handling of axes properties (2)...
r917 QString formatValue(double value, const QCPAxis &axis)
{
// If the axis is a time axis, formats the value as a date
if (auto axisTicker = qSharedPointerDynamicCast<QCPAxisTickerDateTime>(axis.ticker())) {
return DateUtils::dateTime(value, axisTicker->dateTimeSpec()).toString(DATETIME_FORMAT);
}
else {
Alexandre Leroux
Tooltip for spectrograms (4)...
r1068 return QString::number(value, NUMBER_FORMAT, NUMBER_PRECISION);
Alexandre Leroux
Refactoring handling of axes properties (2)...
r917 }
}
Alexandre Leroux
Refactoring handling of axes properties (1)...
r916 std::unique_ptr<IAxisHelper>
IAxisHelperFactory::create(std::shared_ptr<IDataSeries> dataSeries) noexcept
{
if (auto scalarSeries = std::dynamic_pointer_cast<ScalarSeries>(dataSeries)) {
return std::make_unique<AxisHelper<ScalarSeries> >(*scalarSeries);
}
Alexandre Leroux
Handles axes properties for spectrograms...
r921 else if (auto spectrogramSeries = std::dynamic_pointer_cast<SpectrogramSeries>(dataSeries)) {
return std::make_unique<AxisHelper<SpectrogramSeries> >(*spectrogramSeries);
}
Alexandre Leroux
Refactoring handling of axes properties (1)...
r916 else if (auto vectorSeries = std::dynamic_pointer_cast<VectorSeries>(dataSeries)) {
return std::make_unique<AxisHelper<VectorSeries> >(*vectorSeries);
}
else {
return std::make_unique<AxisHelper<IDataSeries> >(*dataSeries);
}
}