##// END OF EJS Templates
Creates constructor for ScalarSeries that directly takes vectors...
Creates constructor for ScalarSeries that directly takes vectors It is used in Amda result parser to avoid an extra loop

File last commit:

r367:df969ff9808a
r392:cae900f78dff
Show More
VisualizationGraphHelper.cpp
160 lines | 5.5 KiB | text/x-c | CppLexer
/ gui / src / Visualization / VisualizationGraphHelper.cpp
Correction for pull request
r243 #include "Visualization/VisualizationGraphHelper.h"
Alexandre Leroux
Creates factory that is responsible of creation of QCustomPlot components relative to a variable
r181 #include "Visualization/qcustomplot.h"
Alexandre Leroux
Handles creations for scalar series
r182 #include <Data/ScalarSeries.h>
Alexandre Leroux
Creates factory that is responsible of creation of QCustomPlot components relative to a variable
r181 #include <Variable/Variable.h>
Correction for pull request
r243 Q_LOGGING_CATEGORY(LOG_VisualizationGraphHelper, "VisualizationGraphHelper")
Alexandre Leroux
Creates factory that is responsible of creation of QCustomPlot components relative to a variable
r181
Alexandre Leroux
Handles creations for scalar series
r182 namespace {
Add current progression for thread fix
r364 class SqpDataContainer : public QCPGraphDataContainer {
public:
Change info to debug on thread display log
r367 void appendGraphDataUnsorted(const QCPGraphData &data) { mData.append(data); }
Add current progression for thread fix
r364 };
Alexandre Leroux
Handles axes properties
r183 /// Format for datetimes on a axis
const auto DATETIME_TICKER_FORMAT = QStringLiteral("yyyy/MM/dd \nhh:mm:ss");
/// Generates the appropriate ticker for an axis, depending on whether the axis displays time or
/// non-time data
QSharedPointer<QCPAxisTicker> axisTicker(bool isTimeAxis)
{
if (isTimeAxis) {
auto dateTicker = QSharedPointer<QCPAxisTickerDateTime>::create();
dateTicker->setDateTimeFormat(DATETIME_TICKER_FORMAT);
return dateTicker;
}
else {
// default ticker
return QSharedPointer<QCPAxisTicker>::create();
}
}
Alexandre Leroux
Handles creations for scalar series
r182
The mock plugin can now create data with view operation
r235 void updateScalarData(QCPAbstractPlottable *component, ScalarSeries &scalarSeries,
const SqpDateTime &dateTime)
{
Change info to debug on thread display log
r367 qCDebug(LOG_VisualizationGraphHelper()) << "TORM: updateScalarData"
<< QThread::currentThread()->objectName();
The mock plugin can now create data with view operation
r235 if (auto qcpGraph = dynamic_cast<QCPGraph *>(component)) {
// Clean the graph
// NAIVE approch
Add current progression for thread fix
r364 scalarSeries.lockRead();
{
const auto xData = scalarSeries.xAxisData()->data();
const auto valuesData = scalarSeries.valuesData()->data();
const auto count = xData.count();
Correction clang format
r365 qCInfo(LOG_VisualizationGraphHelper()) << "TORM: Current points in cache"
<< xData.count();
The mock plugin can now create data with view operation
r235
Add current progression for thread fix
r364 auto dataContainer = qcpGraph->data();
dataContainer->clear();
auto sqpDataContainer = QSharedPointer<SqpDataContainer>::create();
qcpGraph->setData(sqpDataContainer);
for (auto i = 0; i < count; ++i) {
const auto x = xData[i];
if (x >= dateTime.m_TStart && x <= dateTime.m_TEnd) {
Change info to debug on thread display log
r367 sqpDataContainer->appendGraphDataUnsorted(QCPGraphData(x, valuesData[i]));
Add current progression for thread fix
r364 }
The mock plugin can now create data with view operation
r235 }
Add current progression for thread fix
r364 sqpDataContainer->sort();
Correction clang format
r365 qCInfo(LOG_VisualizationGraphHelper()) << "TORM: Current points displayed"
<< sqpDataContainer->size();
The mock plugin can now create data with view operation
r235 }
Add current progression for thread fix
r364 scalarSeries.unlock();
The mock plugin can now create data with view operation
r235
onRangeChanged is now based on the good range (the new one)...
r315
// Display all data
component->rescaleAxes();
component->parentPlot()->replot();
The mock plugin can now create data with view operation
r235 }
else {
/// @todo DEBUG
}
}
QCPAbstractPlottable *createScalarSeriesComponent(ScalarSeries &scalarSeries, QCustomPlot &plot,
const SqpDateTime &dateTime)
Alexandre Leroux
Handles creations for scalar series
r182 {
auto component = plot.addGraph();
if (component) {
The mock plugin can now create data with view operation
r235 // // Graph data
Alexandre Leroux
Handles creations for scalar series
r182 component->setData(scalarSeries.xAxisData()->data(), scalarSeries.valuesData()->data(),
true);
The mock plugin can now create data with view operation
r235 updateScalarData(component, scalarSeries, dateTime);
Alexandre Leroux
Handles axes properties
r183 // Axes properties
/// @todo : for the moment, no control is performed on the axes: the units and the tickers
/// are fixed for the default x-axis and y-axis of the plot, and according to the new graph
auto setAxisProperties = [](auto axis, const auto &unit) {
// label (unit name)
axis->setLabel(unit.m_Name);
// ticker (depending on the type of unit)
axis->setTicker(axisTicker(unit.m_TimeUnit));
};
setAxisProperties(plot.xAxis, scalarSeries.xAxisUnit());
setAxisProperties(plot.yAxis, scalarSeries.valuesUnit());
Alexandre Leroux
Handles creations for scalar series
r182 // Display all data
component->rescaleAxes();
plot.replot();
}
else {
Correction for pull request
r243 qCDebug(LOG_VisualizationGraphHelper())
Alexandre Leroux
Handles creations for scalar series
r182 << QObject::tr("Can't create graph for the scalar series");
}
return component;
}
} // namespace
Correction for pull request
r243 QVector<QCPAbstractPlottable *> VisualizationGraphHelper::create(std::shared_ptr<Variable> variable,
QCustomPlot &plot) noexcept
Alexandre Leroux
Creates factory that is responsible of creation of QCustomPlot components relative to a variable
r181 {
auto result = QVector<QCPAbstractPlottable *>{};
if (variable) {
Alexandre Leroux
Handles creations for scalar series
r182 // Gets the data series of the variable to call the creation of the right components
// according to its type
if (auto scalarSeries = dynamic_cast<ScalarSeries *>(variable->dataSeries())) {
The mock plugin can now create data with view operation
r235 result.append(createScalarSeriesComponent(*scalarSeries, plot, variable->dateTime()));
Alexandre Leroux
Handles creations for scalar series
r182 }
else {
Correction for pull request
r243 qCDebug(LOG_VisualizationGraphHelper())
Alexandre Leroux
Handles creations for scalar series
r182 << QObject::tr("Can't create graph plottables : unmanaged data series type");
}
Alexandre Leroux
Creates factory that is responsible of creation of QCustomPlot components relative to a variable
r181 }
else {
Correction for pull request
r243 qCDebug(LOG_VisualizationGraphHelper())
Alexandre Leroux
Creates factory that is responsible of creation of QCustomPlot components relative to a variable
r181 << QObject::tr("Can't create graph plottables : the variable is null");
}
return result;
}
The mock plugin can now create data with view operation
r235
Correction for pull request
r243 void VisualizationGraphHelper::updateData(QVector<QCPAbstractPlottable *> plotableVect,
IDataSeries *dataSeries, const SqpDateTime &dateTime)
The mock plugin can now create data with view operation
r235 {
if (auto scalarSeries = dynamic_cast<ScalarSeries *>(dataSeries)) {
if (plotableVect.size() == 1) {
updateScalarData(plotableVect.at(0), *scalarSeries, dateTime);
}
else {
Correction for pull request
r243 qCCritical(LOG_VisualizationGraphHelper()) << QObject::tr(
The mock plugin can now create data with view operation
r235 "Can't update Data of a scalarSeries because there is not only one component "
"associated");
}
}
else {
/// @todo DEBUG
}
}