36 #include "../../pappsoexception.h"
50 const QString &x_axis_label,
51 const QString &y_axis_label)
71 const std::vector<double> &keys,
72 const std::vector<double> &values)
74 QCPGraph *graph_p = graph(graph_index);
76 if(graph_p ==
nullptr)
77 qFatal(
"Programming error.");
85 const std::vector<double> &keys,
86 const std::vector<double> &values)
88 if(graph_p ==
nullptr)
89 qFatal(
"Pointer cannot be nullptr.");
91 graph_p->setData(QVector<double>::fromStdVector(keys),
92 QVector<double>::fromStdVector(values));
94 graph_p->setPen(
m_pen);
105 QCPGraph *graph_p = graph(graph_index);
107 if(graph_p ==
nullptr)
108 qFatal(
"Programming error.");
110 graph_p->data().clear();
125 QString(
"The color to be used for the plot graph is invalid."));
130 QCPGraph *graph_p = addGraph();
132 graph_p->setData(QVector<double>::fromStdVector(trace.
xToVector()),
133 QVector<double>::fromStdVector(trace.
yToVector()));
135 QPen pen = graph()->pen();
137 graph()->setPen(pen);
143 static_cast<void (QCPAbstractPlottable::*)(
bool)
>(
144 &QCPAbstractPlottable::selectionChanged),
153 if(graphCount() == 1)
185 QCPGraph *theGraph = graph(index);
187 if(theGraph ==
nullptr)
189 "Fatal error at %s@%d -- %s(). "
201 QSharedPointer<QCPGraphDataContainer> graph_data_container_p =
204 QCPDataRange dataRange = graph_data_container_p->dataRange();
206 if(!dataRange.isValid())
209 if(!dataRange.size())
212 if(dataRange.size() > 1)
214 double firstKey = graph_data_container_p->at(dataRange.begin())->key;
215 double lastKey = graph_data_container_p->at(dataRange.end())->key;
227 range.lower = graph_data_container_p->at(dataRange.end() - 2)->key;
228 range.upper = graph_data_container_p->at(dataRange.end() - 1)->key;
239 range.lower = firstKey;
240 range.upper = graph_data_container_p->at(dataRange.begin() + 1)->key;
249 graph_data_container_p->findBegin(key,
true)->key;
251 std::prev(graph_data_container_p->findEnd(key,
true))
264 std::vector<double> keys;
266 QCPGraph *graph_p = graph(graph_index);
268 if(graph_p ==
nullptr)
269 qFatal(
"Programming error.");
271 QSharedPointer<QCPGraphDataContainer> graph_data_container_p =
275 auto beginIt = graph_data_container_p->begin();
276 auto endIt = graph_data_container_p->end();
278 for(
auto iter = beginIt; iter != endIt; ++iter)
279 keys.push_back(iter->key);
288 std::vector<double> values;
290 QCPGraph *graph_p = graph(graph_index);
292 if(graph_p ==
nullptr)
293 qFatal(
"Programming error.");
295 QSharedPointer<QCPGraphDataContainer> graph_data_container_p =
299 auto beginIt = graph_data_container_p->begin();
300 auto endIt = graph_data_container_p->end();
302 for(
auto iter = beginIt; iter != endIt; ++iter)
303 values.push_back(iter->key);
319 QCPRange key_range(xAxis->range().lower, xAxis->range().upper);
321 if(plottable_p !=
nullptr)
324 return plottable_p->getValueRange(ok, QCP::SignDomain::sdBoth, key_range);
330 int graph_count = graphCount();
337 double temp_min_value = std::numeric_limits<double>::max();
338 double temp_max_value = std::numeric_limits<double>::min();
340 bool found_range =
false;
342 for(
int iter = 0; iter < graph_count; ++iter)
344 QCPGraph *plottable_p = graph(iter);
346 QCPRange value_range =
347 plottable_p->getValueRange(ok, QCP::SignDomain::sdBoth, key_range);
352 if(value_range.lower < temp_min_value)
353 temp_min_value = value_range.lower;
354 if(value_range.upper > temp_max_value)
355 temp_max_value = value_range.upper;
361 return QCPRange(temp_min_value, temp_max_value);
375 QCPAbstractPlottable *plottable_p = plottable(index);
377 if(plottable_p ==
nullptr)
378 qFatal(
"Programming error.");
387 if(graph_p ==
nullptr)
388 qFatal(
"Programming error.");
390 QCPItemTracer tracer(
this);
391 tracer.setGraph(graph_p);
392 tracer.setInterpolating(
true);
393 tracer.setGraphKey(
x);
394 tracer.updatePosition();
396 return tracer.position->value();
403 QCPGraph *graph_p = graph(index);
405 if(graph_p ==
nullptr)
406 qFatal(
"Programming error.");
414 QCPAxis::SelectablePart part,
436 if(axis->orientation() == Qt::Vertical)
449 yAxis->setRange(value_range);
480 double xLower = xAxis->range().lower;
481 double xUpper = xAxis->range().upper;
484 double yLower = yAxis->range().lower;
485 double yUpper = yAxis->range().upper;
512 xAxis->setRange(xLower, xUpper - xDelta);
548 yAxis->setRange(value_range);
564 yAxis->setRange(yLower, yUpper - yDelta);
615 xAxis->range().lower,
631 yAxis->setRange(value_range);
665 yAxis->setRange(value_range);
696 yAxis->setRange(value_range);
727 QCPGraph *graph_p = graph(index);
736 if(graph_p ==
nullptr)
737 qFatal(
"Programming error. Pointer cannot be nullptr.");
741 QSharedPointer<QCPGraphDataContainer> graph_data_container_p =
745 auto beginIt = graph_data_container_p->begin();
746 auto endIt = graph_data_container_p->end();
748 for(
auto iter = beginIt; iter != endIt; ++iter)
758 QCPGraph *graph_p = graph(index);
760 if(graph_p ==
nullptr)
761 qFatal(
"Programming error.");
763 return toTrace(x_axis_range, graph_p);
769 const QCPGraph *graph_p)
const
775 QSharedPointer<QCPGraphDataContainer> graph_data_container_sp;
777 graph_data_container_sp = graph_p->data();
780 auto beginIt = graph_data_container_sp->findBegin(x_axis_range.lower,
783 auto endIt = graph_data_container_sp->findEnd(x_axis_range.upper,
786 for(
auto iter = beginIt; iter != endIt; ++iter)
787 data_trace.push_back(
DataPoint(iter->key, iter->value));