|
@@
-25,7
+25,7
public:
|
|
25
|
*/
|
|
25
|
*/
|
|
26
|
template <typename T, typename Enabled = void>
|
|
26
|
template <typename T, typename Enabled = void>
|
|
27
|
struct PlottablesCreator {
|
|
27
|
struct PlottablesCreator {
|
|
28
|
static PlottablesMap createPlottables(T &, QCustomPlot &)
|
|
28
|
static PlottablesMap createPlottables(QCustomPlot &)
|
|
29
|
{
|
|
29
|
{
|
|
30
|
qCCritical(LOG_DataSeries())
|
|
30
|
qCCritical(LOG_DataSeries())
|
|
31
|
<< QObject::tr("Can't create plottables: unmanaged data series type");
|
|
31
|
<< QObject::tr("Can't create plottables: unmanaged data series type");
|
|
@@
-33,34
+33,37
struct PlottablesCreator {
|
|
33
|
}
|
|
33
|
}
|
|
34
|
};
|
|
34
|
};
|
|
35
|
|
|
35
|
|
|
|
|
|
36
|
PlottablesMap createGraphs(QCustomPlot &plot, int nbGraphs)
|
|
|
|
|
37
|
{
|
|
|
|
|
38
|
PlottablesMap result{};
|
|
|
|
|
39
|
|
|
|
|
|
40
|
// Creates {nbGraphs} QCPGraph to add to the plot
|
|
|
|
|
41
|
for (auto i = 0; i < nbGraphs; ++i) {
|
|
|
|
|
42
|
auto graph = plot.addGraph();
|
|
|
|
|
43
|
result.insert({i, graph});
|
|
|
|
|
44
|
}
|
|
|
|
|
45
|
|
|
|
|
|
46
|
plot.replot();
|
|
|
|
|
47
|
|
|
|
|
|
48
|
return result;
|
|
|
|
|
49
|
}
|
|
|
|
|
50
|
|
|
36
|
/**
|
|
51
|
/**
|
|
37
|
* Specialization of PlottablesCreator for scalars and vectors
|
|
52
|
* Specialization of PlottablesCreator for scalars
|
|
38
|
* @sa ScalarSeries
|
|
53
|
* @sa ScalarSeries
|
|
39
|
* @sa VectorSeries
|
|
|
|
|
40
|
*/
|
|
54
|
*/
|
|
41
|
template <typename T>
|
|
55
|
template <typename T>
|
|
42
|
struct PlottablesCreator<T,
|
|
56
|
struct PlottablesCreator<T, typename std::enable_if_t<std::is_base_of<ScalarSeries, T>::value> > {
|
|
43
|
typename std::enable_if_t<std::is_base_of<ScalarSeries, T>::value
|
|
57
|
static PlottablesMap createPlottables(QCustomPlot &plot) { return createGraphs(plot, 1); }
|
|
44
|
or std::is_base_of<VectorSeries, T>::value> > {
|
|
58
|
};
|
|
45
|
static PlottablesMap createPlottables(T &dataSeries, QCustomPlot &plot)
|
|
|
|
|
46
|
{
|
|
|
|
|
47
|
PlottablesMap result{};
|
|
|
|
|
48
|
|
|
|
|
|
49
|
// Gets the number of components of the data series
|
|
|
|
|
50
|
dataSeries.lockRead();
|
|
|
|
|
51
|
auto componentCount = dataSeries.valuesData()->componentCount();
|
|
|
|
|
52
|
dataSeries.unlock();
|
|
|
|
|
53
|
|
|
|
|
|
54
|
// For each component of the data series, creates a QCPGraph to add to the plot
|
|
|
|
|
55
|
for (auto i = 0; i < componentCount; ++i) {
|
|
|
|
|
56
|
auto graph = plot.addGraph();
|
|
|
|
|
57
|
result.insert({i, graph});
|
|
|
|
|
58
|
}
|
|
|
|
|
59
|
|
|
|
|
|
60
|
plot.replot();
|
|
|
|
|
61
|
|
|
59
|
|
|
62
|
return result;
|
|
60
|
/**
|
|
63
|
}
|
|
61
|
* Specialization of PlottablesCreator for vectors
|
|
|
|
|
62
|
* @sa VectorSeries
|
|
|
|
|
63
|
*/
|
|
|
|
|
64
|
template <typename T>
|
|
|
|
|
65
|
struct PlottablesCreator<T, typename std::enable_if_t<std::is_base_of<VectorSeries, T>::value> > {
|
|
|
|
|
66
|
static PlottablesMap createPlottables(QCustomPlot &plot) { return createGraphs(plot, 3); }
|
|
64
|
};
|
|
67
|
};
|
|
65
|
|
|
68
|
|
|
66
|
/**
|
|
69
|
/**
|
|
@@
-70,7
+73,7
struct PlottablesCreator<T,
|
|
70
|
template <typename T>
|
|
73
|
template <typename T>
|
|
71
|
struct PlottablesCreator<T,
|
|
74
|
struct PlottablesCreator<T,
|
|
72
|
typename std::enable_if_t<std::is_base_of<SpectrogramSeries, T>::value> > {
|
|
75
|
typename std::enable_if_t<std::is_base_of<SpectrogramSeries, T>::value> > {
|
|
73
|
static PlottablesMap createPlottables(T &dataSeries, QCustomPlot &plot)
|
|
76
|
static PlottablesMap createPlottables(QCustomPlot &plot)
|
|
74
|
{
|
|
77
|
{
|
|
75
|
PlottablesMap result{};
|
|
78
|
PlottablesMap result{};
|
|
76
|
result.insert({0, new QCPColorMap{plot.xAxis, plot.yAxis}});
|
|
79
|
result.insert({0, new QCPColorMap{plot.xAxis, plot.yAxis}});
|
|
@@
-264,41
+267,59
struct IPlottablesHelper {
|
|
264
|
*/
|
|
267
|
*/
|
|
265
|
template <typename T>
|
|
268
|
template <typename T>
|
|
266
|
struct PlottablesHelper : public IPlottablesHelper {
|
|
269
|
struct PlottablesHelper : public IPlottablesHelper {
|
|
267
|
explicit PlottablesHelper(T &dataSeries) : m_DataSeries{dataSeries} {}
|
|
270
|
explicit PlottablesHelper(std::shared_ptr<T> dataSeries) : m_DataSeries{dataSeries} {}
|
|
268
|
|
|
271
|
|
|
269
|
PlottablesMap create(QCustomPlot &plot) const override
|
|
272
|
PlottablesMap create(QCustomPlot &plot) const override
|
|
270
|
{
|
|
273
|
{
|
|
271
|
return PlottablesCreator<T>::createPlottables(m_DataSeries, plot);
|
|
274
|
return PlottablesCreator<T>::createPlottables(plot);
|
|
272
|
}
|
|
275
|
}
|
|
273
|
|
|
276
|
|
|
274
|
void update(PlottablesMap &plottables, const SqpRange &range, bool rescaleAxes) const override
|
|
277
|
void update(PlottablesMap &plottables, const SqpRange &range, bool rescaleAxes) const override
|
|
275
|
{
|
|
278
|
{
|
|
276
|
PlottablesUpdater<T>::updatePlottables(m_DataSeries, plottables, range, rescaleAxes);
|
|
279
|
if (m_DataSeries) {
|
|
|
|
|
280
|
PlottablesUpdater<T>::updatePlottables(*m_DataSeries, plottables, range, rescaleAxes);
|
|
|
|
|
281
|
}
|
|
|
|
|
282
|
else {
|
|
|
|
|
283
|
qCCritical(LOG_VisualizationGraphHelper()) << "Can't update plottables: inconsistency "
|
|
|
|
|
284
|
"between the type of data series and the "
|
|
|
|
|
285
|
"type supposed";
|
|
|
|
|
286
|
}
|
|
277
|
}
|
|
287
|
}
|
|
278
|
|
|
288
|
|
|
279
|
void setYAxisRange(const SqpRange &xAxisRange, QCustomPlot &plot) const override
|
|
289
|
void setYAxisRange(const SqpRange &xAxisRange, QCustomPlot &plot) const override
|
|
280
|
{
|
|
290
|
{
|
|
281
|
return PlottablesUpdater<T>::setPlotYAxisRange(m_DataSeries, xAxisRange, plot);
|
|
291
|
if (m_DataSeries) {
|
|
|
|
|
292
|
PlottablesUpdater<T>::setPlotYAxisRange(*m_DataSeries, xAxisRange, plot);
|
|
|
|
|
293
|
}
|
|
|
|
|
294
|
else {
|
|
|
|
|
295
|
qCCritical(LOG_VisualizationGraphHelper()) << "Can't update plottables: inconsistency "
|
|
|
|
|
296
|
"between the type of data series and the "
|
|
|
|
|
297
|
"type supposed";
|
|
|
|
|
298
|
}
|
|
282
|
}
|
|
299
|
}
|
|
283
|
|
|
300
|
|
|
284
|
T &m_DataSeries;
|
|
301
|
std::shared_ptr<T> m_DataSeries;
|
|
285
|
};
|
|
302
|
};
|
|
286
|
|
|
303
|
|
|
287
|
/// Creates IPlottablesHelper according to a data series
|
|
304
|
/// Creates IPlottablesHelper according to the type of data series a variable holds
|
|
288
|
std::unique_ptr<IPlottablesHelper> createHelper(std::shared_ptr<IDataSeries> dataSeries) noexcept
|
|
305
|
std::unique_ptr<IPlottablesHelper> createHelper(std::shared_ptr<Variable> variable) noexcept
|
|
289
|
{
|
|
306
|
{
|
|
290
|
if (auto scalarSeries = std::dynamic_pointer_cast<ScalarSeries>(dataSeries)) {
|
|
307
|
switch (variable->type()) {
|
|
291
|
return std::make_unique<PlottablesHelper<ScalarSeries> >(*scalarSeries);
|
|
308
|
case DataSeriesType::SCALAR:
|
|
292
|
}
|
|
309
|
return std::make_unique<PlottablesHelper<ScalarSeries> >(
|
|
293
|
else if (auto spectrogramSeries = std::dynamic_pointer_cast<SpectrogramSeries>(dataSeries)) {
|
|
310
|
std::dynamic_pointer_cast<ScalarSeries>(variable->dataSeries()));
|
|
294
|
return std::make_unique<PlottablesHelper<SpectrogramSeries> >(*spectrogramSeries);
|
|
311
|
case DataSeriesType::SPECTROGRAM:
|
|
295
|
}
|
|
312
|
return std::make_unique<PlottablesHelper<SpectrogramSeries> >(
|
|
296
|
else if (auto vectorSeries = std::dynamic_pointer_cast<VectorSeries>(dataSeries)) {
|
|
313
|
std::dynamic_pointer_cast<SpectrogramSeries>(variable->dataSeries()));
|
|
297
|
return std::make_unique<PlottablesHelper<VectorSeries> >(*vectorSeries);
|
|
314
|
case DataSeriesType::VECTOR:
|
|
298
|
}
|
|
315
|
return std::make_unique<PlottablesHelper<VectorSeries> >(
|
|
299
|
else {
|
|
316
|
std::dynamic_pointer_cast<VectorSeries>(variable->dataSeries()));
|
|
300
|
return std::make_unique<PlottablesHelper<IDataSeries> >(*dataSeries);
|
|
317
|
default:
|
|
|
|
|
318
|
// Creates default helper
|
|
|
|
|
319
|
break;
|
|
301
|
}
|
|
320
|
}
|
|
|
|
|
321
|
|
|
|
|
|
322
|
return std::make_unique<PlottablesHelper<IDataSeries> >(nullptr);
|
|
302
|
}
|
|
323
|
}
|
|
303
|
|
|
324
|
|
|
304
|
} // namespace
|
|
325
|
} // namespace
|
|
@@
-307,7
+328,7
PlottablesMap VisualizationGraphHelper::create(std::shared_ptr<Variable> variabl
|
|
307
|
QCustomPlot &plot) noexcept
|
|
328
|
QCustomPlot &plot) noexcept
|
|
308
|
{
|
|
329
|
{
|
|
309
|
if (variable) {
|
|
330
|
if (variable) {
|
|
310
|
auto helper = createHelper(variable->dataSeries());
|
|
331
|
auto helper = createHelper(variable);
|
|
311
|
auto plottables = helper->create(plot);
|
|
332
|
auto plottables = helper->create(plot);
|
|
312
|
return plottables;
|
|
333
|
return plottables;
|
|
313
|
}
|
|
334
|
}
|
|
@@
-322,7
+343,7
void VisualizationGraphHelper::setYAxisRange(std::shared_ptr<Variable> variable,
|
|
322
|
QCustomPlot &plot) noexcept
|
|
343
|
QCustomPlot &plot) noexcept
|
|
323
|
{
|
|
344
|
{
|
|
324
|
if (variable) {
|
|
345
|
if (variable) {
|
|
325
|
auto helper = createHelper(variable->dataSeries());
|
|
346
|
auto helper = createHelper(variable);
|
|
326
|
helper->setYAxisRange(variable->range(), plot);
|
|
347
|
helper->setYAxisRange(variable->range(), plot);
|
|
327
|
}
|
|
348
|
}
|
|
328
|
else {
|
|
349
|
else {
|
|
@@
-332,9
+353,9
void VisualizationGraphHelper::setYAxisRange(std::shared_ptr<Variable> variable,
|
|
332
|
}
|
|
353
|
}
|
|
333
|
|
|
354
|
|
|
334
|
void VisualizationGraphHelper::updateData(PlottablesMap &plottables,
|
|
355
|
void VisualizationGraphHelper::updateData(PlottablesMap &plottables,
|
|
335
|
std::shared_ptr<IDataSeries> dataSeries,
|
|
356
|
std::shared_ptr<Variable> variable,
|
|
336
|
const SqpRange &dateTime)
|
|
357
|
const SqpRange &dateTime)
|
|
337
|
{
|
|
358
|
{
|
|
338
|
auto helper = createHelper(dataSeries);
|
|
359
|
auto helper = createHelper(variable);
|
|
339
|
helper->update(plottables, dateTime);
|
|
360
|
helper->update(plottables, dateTime);
|
|
340
|
}
|
|
361
|
}
|