#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())); } MultiChartView::~MultiChartView() { std::map::iterator cit; for (cit = chartMap.begin(); cit != chartMap.end(); cit++) { delete cit->second; } std::map::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(array.id(), array)); ArrayInfo ai(array); this->infoMap.insert(std::pair(ai.arrayid, &ai)); Chart* chart = createChart(ai); ChartView *view = createChartView(chart, ai); double absMin = 0.0, absMax = 0.0; std::map::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->setTitle(QString::fromStdString(arrayMap.at(info.arrayid).name())); chart->legend()->hide(); chart->createDefaultAxes(); this->chartMap.insert(std::pair(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(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); QValueAxis *axisY = new QValueAxis; double range = ymax - ymin; axisY->setRange(ymin - 0.2 * range, ymax + 0.2 * range); axisY->setTickCount(10); axisY->applyNiceNumbers(); axisY->setTitleText("Test"); chart->setAxisY(axisY, series); QValueAxis *axisX = new QValueAxis; axisX->setRange(series->at(0).x(), series->at(series->count()-1).x()); axisX->setTickCount(10); axisX->setLabelFormat("%.4f"); axisX->applyNiceNumbers(); chart->setAxisX(axisX, series); connect(axisX, SIGNAL(rangeChanged(qreal,qreal)), chart, SLOT(XRangeChanged(qreal,qreal))); QPen pen = series->pen(); pen.setWidth(1); series->setPen(pen); }