Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
        }
      }
    }
  }
}