Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); timer=new QTimer(this); timeout=new QTimer(this); connect(timer,&QTimer::timeout,this,&Dialog::getVoltage); connect(timeout,&QTimer::timeout,this,&Dialog::handleTimeout); count=0; initPort(); initData(); initConnections(); initPlotStyle(); timer->start(1000); }
void CQGnuPlotDataDialog:: doPlot(bool add) { CExpr *expr = window_->app()->expr(); missingStr_ = missingEdit_->text().toStdString(); //--- Smooth smooth = Smooth::None; if (averageCheck_->isChecked()) smooth = Smooth::Average; else if (summedCheck_->isChecked()) smooth = Smooth::Summed; //--- // TODO: filter on plot CGnuPlotGroup *group; if (add) { group = window_->createTiledGroup(); if (! group) return; } else { window_->initCurrentGroup(); group = window_->currentGroup(); if (! group) return; } QString usingStr = usingEdit_->text(); QString indexStr = indexEdit_->text(); QString everyStr = everyEdit_->text(); QString whereStr = whereEdit_->text(); CGnuPlotUsingCols usingCols(window_->app()); CGnuPlotIndexData indexData; CGnuPlotEveryData everyData; CGnuPlotWhereData whereData; usingCols.parse(usingStr.toStdString()); indexData.parse(expr, indexStr.toStdString()); everyData.parse(expr, everyStr.toStdString()); whereData.parse(whereStr.toStdString()); CQGnuPlotDataModel *model = tree_->model(); //--- CQHeaderView *header = tree_->header(); typedef std::set<int> Active; Active active; for (int c = 0; c < model->columnCount(); ++c) { QCheckBox *cb = qobject_cast<QCheckBox *>(header->widget(c)); if (cb && cb->isChecked()) active.insert(c); } //--- bool is2D = dimension2DRadio_->isChecked(); const CGnuPlotFile &file = model->file(); CGnuPlotTypes::PlotStyle style = CQGnuPlotEnum::plotStyleConv(enum_->plotStyle()); // single set, single subset if (! model->isHierarchical1() && ! model->isHierarchical2()) { int setNum = 0; CGnuPlotPlotP plot = group->createNewPlot(style); initPlotStyle(plot); plot->setSetNum (setNum); plot->setDataFile(file); plot->set2D( is2D); plot->set3D(! is2D); plot->init(); //--- ValuesDataList valuesDataList; for (int lineNum = 0; lineNum < model->rowCount(); ++lineNum) { bool lineActive = (everyStr != "" ? everyData.validPointIndex(lineNum) : true); if (! lineActive) continue; CGnuPlotPlot::Values values; bool missing = false; for (int c = 0; c < model->columnCount(); ++c) { if (active.find(c) == active.end()) continue; QModelIndex ind = model->index(lineNum, c); QVariant var = model->data(ind); std::string field = var.toString().toStdString(); bool missing; CExprValuePtr value = fieldToValue(field, missing); if (missing) value->setMissing(true); values.push_back(value); } if (missing) continue; //--- if (whereStr != "") { if (! whereData.isValid(expr, setNum, lineNum, values)) continue; } //--- CGnuPlot::Values newValues; bool bad = false; CGnuPlot::Params params; if (usingStr != "") usingCols.decodeValues(0, setNum, lineNum, values, bad, newValues, params); else newValues = values; if (bad) continue; //--- bool discontinuity = false; valuesDataList.push_back(ValuesData(newValues, discontinuity, bad, params)); } if (smooth != Smooth::None) valuesDataList = smoothValuesList(valuesDataList, smooth); for (const auto &vd : valuesDataList) { if (is2D) plot->addPoint2D(vd.values, vd.discontinuity, vd.bad, vd.params); else plot->addPoint3D(0, vd.values, vd.discontinuity, vd.bad, vd.params); } } // single set, multiple subsets else if (model->isHierarchical1()) { int setNum = 0; CGnuPlotPlotP plot = group->createNewPlot(style); initPlotStyle(plot); plot->setSetNum (setNum); plot->setDataFile(file); plot->set2D( is2D); plot->set3D(! is2D); plot->init(); //--- for (int subSetNum = 0; subSetNum < model->rowCount(); ++subSetNum) { bool subSetActive = (everyStr != "" ? everyData.validBlockIndex(subSetNum) : true); if (! subSetActive) continue; QModelIndex ind = model->index(subSetNum, 0); //--- ValuesDataList valuesDataList; for (int lineNum = 0; lineNum < model->rowCount(ind); ++lineNum) { bool lineActive = (everyStr != "" ? everyData.validPointIndex(lineNum) : true); if (! lineActive) continue; CGnuPlotPlot::Values values; for (int c = 0; c < model->columnCount(); ++c) { if (active.find(c) == active.end()) continue; QModelIndex ind1 = model->index(lineNum, c, ind); QVariant var = model->data(ind1); std::string field = var.toString().toStdString(); bool missing; CExprValuePtr value = fieldToValue(field, missing); if (missing) value->setMissing(true); values.push_back(value); } //--- if (whereStr != "") { if (! whereData.isValid(expr, setNum, lineNum, values)) continue; } //--- CGnuPlot::Values newValues; bool bad = false; CGnuPlot::Params params; if (usingStr != "") usingCols.decodeValues(0, setNum, lineNum, values, bad, newValues, params); else newValues = values; if (bad) continue; //--- bool discontinuity = (subSetNum > 0 && lineNum == 0); valuesDataList.push_back(ValuesData(newValues, discontinuity, bad, params)); } if (smooth != Smooth::None) valuesDataList = smoothValuesList(valuesDataList, smooth); for (const auto &vd : valuesDataList) { if (is2D) plot->addPoint2D(vd.values, vd.discontinuity, vd.bad, vd.params); else plot->addPoint3D(subSetNum, vd.values, vd.discontinuity, vd.bad, vd.params); } } } // multiple sets, multiple subsets else { CGnuPlotPlotP plot; // for 3D we want stack of plots (single set) if (! is2D) { int setNum = 0; plot = group->createNewPlot(style); initPlotStyle(plot); plot->setSetNum (setNum); plot->setDataFile(file); plot->set2D(false); plot->set3D(true); plot->init(); } //--- for (int setNum = 0; setNum < model->rowCount(); ++setNum) { bool setActive = (indexStr != "" ? indexData.validIndex(setNum) : true); if (! setActive) continue; //--- if (is2D) { plot = group->createNewPlot(style); initPlotStyle(plot); plot->setSetNum (setNum); plot->setDataFile(file); plot->set2D(true); plot->set3D(false); plot->init(); } //--- QModelIndex ind = model->index(setNum, 0); for (int subSetNum = 0; subSetNum < model->rowCount(ind); ++subSetNum) { bool subSetActive = (everyStr != "" ? everyData.validBlockIndex(subSetNum) : true); if (! subSetActive) continue; QModelIndex ind1 = model->index(subSetNum, 0, ind); //--- ValuesDataList valuesDataList; for (int lineNum = 0; lineNum < model->rowCount(ind1); ++lineNum) { bool lineActive = (everyStr != "" ? everyData.validPointIndex(lineNum) : true); if (! lineActive) continue; CGnuPlotPlot::Values values; for (int c = 0; c < model->columnCount(); ++c) { if (active.find(c) == active.end()) continue; QModelIndex ind2 = model->index(lineNum, c, ind1); QVariant var = model->data(ind2); std::string field = var.toString().toStdString(); bool missing; CExprValuePtr value = fieldToValue(field, missing); if (missing) value->setMissing(true); values.push_back(value); } //--- if (whereStr != "") { if (! whereData.isValid(expr, setNum, lineNum, values)) continue; } //--- CGnuPlot::Values newValues; bool bad = false; CGnuPlot::Params params; if (usingStr != "") usingCols.decodeValues(0, setNum, lineNum, values, bad, newValues, params); else newValues = values; if (bad) continue; //--- bool discontinuity = (subSetNum > 0 && lineNum == 0); valuesDataList.push_back(ValuesData(newValues, discontinuity, bad, params)); } if (smooth != Smooth::None) valuesDataList = smoothValuesList(valuesDataList, smooth); for (const auto &vd : valuesDataList) { if (is2D) plot->addPoint2D(vd.values, vd.discontinuity, vd.bad, vd.params); else plot->addPoint3D(subSetNum, vd.values, vd.discontinuity, vd.bad, vd.params); } } } } }