dataservice/multichartview.cpp

149 lines
4.8 KiB
C++

#include "multichartview.h"
#include "ui_multichartview.h"
#include "converttoseries.h"
using namespace QtCharts;
MultiChartView::MultiChartView(DataQueue *queue, QWidget *parent) :
QWidget(parent), dataQueue(queue),
ui(new Ui::MultiChartView)
{
ui->setupUi(this);
xRangeMax = 0.0;
xRangeMin = 0.0;
connect(dataQueue, SIGNAL(resultReady(QString)), this, SLOT(dataReady(QString)));
//connect(&dataQueue, SIGNAL(finished()), &dataQueue, SLOT(deleteLater()));
labelFont = QFont("Sans", 10);
tickLabelFont = QFont("Sans", 7);
setContentsMargins(QMargins(0,0,0,0));
}
MultiChartView::~MultiChartView()
{
std::map<std::string, Chart*>::iterator cit;
for (cit = chartMap.begin(); cit != chartMap.end(); cit++) {
delete cit->second;
}
std::map<std::string, ChartView*>::iterator vit;
for (vit = viewMap.begin(); vit != viewMap.end(); vit++) {
delete vit->second;
}
delete ui;
}
void MultiChartView::addArray(const nix::DataArray &array) {
while (dataQueue->isRunning()){
// uncool!!!
}
this->arrayMap.insert(std::pair<std::string, nix::DataArray>(array.id(), array));
ArrayInfo ai(array);
this->infoMap.insert(std::pair<std::string, ArrayInfo*>(ai.arrayid, &ai));
Chart* chart = createChart(ai);
ChartView *view = createChartView(chart, ai);
double absMin = 0.0, absMax = 0.0;
std::map<std::string, ArrayInfo*>::iterator it;
for (it = infoMap.begin(); it != infoMap.end(); it++) {
if (it->second->xoffset < absMin)
absMin = it->second->xoffset;
if (it->second->xmax > absMax)
absMax = it->second->xmax;
}
ui->scrollBar->setMinimum(0);
ui->scrollBar->setMaximum(100000);
ui->scrollBar->setPageStep(100);
ui->vBox->addWidget(view);
loadData(ai);
}
Chart* MultiChartView::createChart(const ArrayInfo &info) {
Chart *chart = new Chart();
chart->setToolTip(QString::fromStdString(info.name));
chart->legend()->hide();
chart->createDefaultAxes();
QValueAxis *axisY = new QValueAxis;
axisY->setTickCount(10);
axisY->applyNiceNumbers();
axisY->setTitleText(QString::fromStdString(info.ylabel));
axisY->setTitleFont(labelFont);
axisY->setLabelsFont(tickLabelFont);
chart->setAxisY(axisY);
QValueAxis *axisX = new QValueAxis;
axisX->setRange(info.xoffset, info.xmax);
axisX->setTickCount(10);
axisX->setLabelFormat("%.4f");
axisX->setTitleFont(labelFont);
axisX->setTitleText(QString::fromStdString(info.xlabel));
axisX->setLabelsFont(tickLabelFont);
axisX->applyNiceNumbers();
chart->setAxisX(axisX);
connect(axisX, SIGNAL(rangeChanged(qreal,qreal)), chart, SLOT(XRangeChanged(qreal,qreal)));
this->chartMap.insert(std::pair<std::string, Chart*>(info.arrayid, chart));
return chart;
}
ChartView* MultiChartView::createChartView(Chart *chart, const ArrayInfo &info) {
ChartView *view = new ChartView(chart);
view->setLineWidth(1);
view->setRenderHint(QPainter::Antialiasing);
/*
QMargins margins = voltageChart->margins();
int marg1 = margins.left();
margins.setLeft(marg1 * 4);
eodChart->setMargins(margins);
*/
this->viewMap.insert(std::pair<std::string, ChartView*>(info.arrayid, view));
return view;
}
void MultiChartView::loadData(const ArrayInfo &info) {
if (arrayMap.at(info.arrayid)) {
nix::NDSize count(1, 100000);
nix::NDSize start(1, 0);
std::string vId, eodId;
dataQueue->requestData(arrayMap.at(info.arrayid), count, start, vId);
}
}
void MultiChartView::dataReady(QString requestId){
DataResult1D data = dataQueue->getData(requestId);
if (data.id.empty()) {
return;
}
ConvertToSeries *task = new ConvertToSeries();
QLineSeries *series = new QLineSeries();
task->setData(series, data);
connect(task, SIGNAL(dataConverted(QLineSeries*,QString, double, double)), this, SLOT(dataConverted(QLineSeries*,QString, double, double)));
QThreadPool::globalInstance()->start(task);
}
void MultiChartView::dataConverted(QLineSeries *series, QString entityId, double ymin, double ymax) {
Chart *chart = chartMap[entityId.toStdString()];
series->setUseOpenGL(true);
chart->addSeries(series);
if (chart->axisX()->type() == QAbstractAxis::AxisTypeValue) {
QValueAxis *axisX = static_cast<QValueAxis*>(chart->axisX());
axisX->setRange(series->at(0).x(), series->at(series->count()-1).x());
series->attachAxis(axisX);
}
if (chart->axisY()->type() == QAbstractAxis::AxisTypeValue) {
QValueAxis *axisY = static_cast<QValueAxis*>(chart->axisY());
double range = ymax - ymin;
axisY->setRange(ymin - 0.2 * range, ymax + 0.2 * range);
series->attachAxis(axisY);
}
QPen pen = series->pen();
pen.setWidth(1);
series->setPen(pen);
}