36 #include "../../exception/exceptionnotpossible.h"
37 #include "../../pappsoexception.h"
51 const QString &x_axis_label,
52 const QString &y_axis_label)
72 const std::vector<double> &keys,
73 const std::vector<double> &values)
75 QCPGraph *graph_p = graph(graph_index);
77 if(graph_p ==
nullptr)
78 qFatal(
"Programming error.");
86 const std::vector<double> &keys,
87 const std::vector<double> &values)
89 if(graph_p ==
nullptr)
90 qFatal(
"Pointer cannot be nullptr.");
96 QVector<double> key_qvector;
97 QVector<double> value_qvector;
99 #pragma GCC warning "Filippo Rusconi: Please check if the bug was fixed in Qt"
109 QVector(keys.begin(),
112 QVector(values.begin(),
116 for(
auto &value : keys)
117 key_qvector.push_back(value);
119 for(
auto &value : values)
120 value_qvector.push_back(value);
122 graph_p->setData(key_qvector, value_qvector,
true);
124 graph_p->setPen(
m_pen);
135 QCPGraph *graph_p = graph(graph_index);
137 if(graph_p ==
nullptr)
138 qFatal(
"Programming error.");
140 graph_p->data().clear();
155 QString(
"The color to be used for the plot graph is invalid."));
160 QCPGraph *graph_p = addGraph();
166 QVector<double> key_qvector;
167 QVector<double> value_qvector;
169 #pragma GCC warning "Filippo Rusconi: Please check if the bug was fixed in Qt"
179 QVector(trace.
xValues().begin(),
180 .trace.xValues()end());
182 QVector(trace.
yValues().begin(),
186 for(
auto &value : trace.
xValues())
187 key_qvector.push_back(value);
189 for(
auto &value : trace.
yValues())
190 value_qvector.push_back(value);
192 graph_p->setData(key_qvector, value_qvector,
true);
194 QPen pen = graph()->pen();
196 graph()->setPen(pen);
202 static_cast<void (QCPAbstractPlottable::*)(
bool)
>(
203 &QCPAbstractPlottable::selectionChanged),
212 if(graphCount() == 1)
244 QCPGraph *theGraph = graph(index);
246 if(theGraph ==
nullptr)
248 "basetraceplotwidget.cpp @ indIntegrationLowerRangeForKey() -- ERROR "
249 "theGraph cannot be nullptr.");
255 QSharedPointer<QCPGraphDataContainer> graph_data_container_p =
258 QCPDataRange dataRange = graph_data_container_p->dataRange();
260 if(!dataRange.isValid())
263 if(!dataRange.size())
266 if(dataRange.size() > 1)
268 double firstKey = graph_data_container_p->at(dataRange.begin())->key;
269 double lastKey = graph_data_container_p->at(dataRange.end())->key;
281 range.lower = graph_data_container_p->at(dataRange.end() - 2)->key;
282 range.upper = graph_data_container_p->at(dataRange.end() - 1)->key;
293 range.lower = firstKey;
294 range.upper = graph_data_container_p->at(dataRange.begin() + 1)->key;
303 graph_data_container_p->findBegin(key,
true)->key;
305 std::prev(graph_data_container_p->findEnd(key,
true))
318 std::vector<double> keys;
320 QCPGraph *graph_p = graph(graph_index);
322 if(graph_p ==
nullptr)
323 qFatal(
"Programming error.");
325 QSharedPointer<QCPGraphDataContainer> graph_data_container_p =
329 auto beginIt = graph_data_container_p->begin();
330 auto endIt = graph_data_container_p->end();
332 for(
auto iter = beginIt; iter != endIt; ++iter)
333 keys.push_back(iter->key);
342 std::vector<double> values;
344 QCPGraph *graph_p = graph(graph_index);
346 if(graph_p ==
nullptr)
347 qFatal(
"Programming error.");
349 QSharedPointer<QCPGraphDataContainer> graph_data_container_p =
353 auto beginIt = graph_data_container_p->begin();
354 auto endIt = graph_data_container_p->end();
356 for(
auto iter = beginIt; iter != endIt; ++iter)
357 values.push_back(iter->key);
373 QCPRange key_range(xAxis->range().lower, xAxis->range().upper);
375 if(plottable_p !=
nullptr)
378 return plottable_p->getValueRange(ok, QCP::SignDomain::sdBoth, key_range);
384 int graph_count = graphCount();
391 double temp_min_value = std::numeric_limits<double>::max();
392 double temp_max_value = std::numeric_limits<double>::min();
394 bool found_range =
false;
396 for(
int iter = 0; iter < graph_count; ++iter)
398 QCPGraph *plottable_p = graph(iter);
400 QCPRange value_range =
401 plottable_p->getValueRange(ok, QCP::SignDomain::sdBoth, key_range);
406 if(value_range.lower < temp_min_value)
407 temp_min_value = value_range.lower;
408 if(value_range.upper > temp_max_value)
409 temp_max_value = value_range.upper;
415 return QCPRange(temp_min_value, temp_max_value);
429 QCPAbstractPlottable *plottable_p = plottable(index);
431 if(plottable_p ==
nullptr)
432 qFatal(
"Programming error.");
441 if(graph_p ==
nullptr)
442 qFatal(
"Programming error.");
444 QCPItemTracer tracer(
this);
445 tracer.setGraph(graph_p);
446 tracer.setInterpolating(
true);
447 tracer.setGraphKey(
x);
448 tracer.updatePosition();
450 return tracer.position->value();
457 QCPGraph *graph_p = graph(index);
459 if(graph_p ==
nullptr)
460 qFatal(
"Programming error.");
469 [[maybe_unused]] QCPAxis::SelectablePart part,
491 if(axis->orientation() == Qt::Vertical)
504 yAxis->setRange(value_range);
535 double xLower = xAxis->range().lower;
536 double xUpper = xAxis->range().upper;
539 double yLower = yAxis->range().lower;
540 double yUpper = yAxis->range().upper;
567 xAxis->setRange(xLower, xUpper - xDelta);
603 yAxis->setRange(value_range);
619 yAxis->setRange(yLower, yUpper - yDelta);
670 xAxis->range().lower,
686 yAxis->setRange(value_range);
720 yAxis->setRange(value_range);
751 yAxis->setRange(value_range);
782 QCPGraph *graph_p = graph(index);
791 if(graph_p ==
nullptr)
792 qFatal(
"Programming error. Pointer cannot be nullptr.");
796 QSharedPointer<QCPGraphDataContainer> graph_data_container_p =
800 auto beginIt = graph_data_container_p->begin();
801 auto endIt = graph_data_container_p->end();
803 for(
auto iter = beginIt; iter != endIt; ++iter)
813 QCPGraph *graph_p = graph(index);
815 if(graph_p ==
nullptr)
816 qFatal(
"Programming error.");
818 return toTrace(x_axis_range, graph_p);
824 const QCPGraph *graph_p)
const
830 QSharedPointer<QCPGraphDataContainer> graph_data_container_sp;
832 graph_data_container_sp = graph_p->data();
835 auto beginIt = graph_data_container_sp->findBegin(x_axis_range.lower,
838 auto endIt = graph_data_container_sp->findEnd(x_axis_range.upper,
841 for(
auto iter = beginIt; iter != endIt; ++iter)
842 data_trace.push_back(
DataPoint(iter->key, iter->value));