Exemplo n.º 1
0
Arquivo: ctunit.cpp Projeto: KDE/kcron
void CTUnit::parse(const QString& tokenString) {

	QString tokStr = tokenString;

	// subelement is that which is between commas
	QString subelement;
	int commapos, slashpos, dashpos;
	int beginat, endat, step;

	// loop through each subelement
	tokStr += QLatin1Char( ',' );
	while ((commapos = tokStr.indexOf(QLatin1String( "," ))) > 0) {
		subelement = tokStr.mid(0, commapos);

		// find "/" to determine step
		slashpos = subelement.indexOf(QLatin1String( "/" ));
		if (slashpos == -1) {
			step = 1;
			slashpos = subelement.length();
		} else {
			step = fieldToValue(subelement.mid(slashpos+1, subelement.length()-slashpos-1));
			if (step < 1)
				step = 1;
		}

		// find "=" to determine range
		dashpos = subelement.indexOf(QLatin1String( "-" ));
		if (dashpos == -1) {
			// deal with "*"
			if (subelement.mid(0, slashpos) == QLatin1String( "*" )) {
				beginat = min;
				endat = max;
			} else {
				beginat = fieldToValue(subelement.mid(0, slashpos));
				endat = beginat;
			}
		} else {
			beginat = fieldToValue(subelement.mid(0, dashpos));
			endat = fieldToValue(subelement.mid(dashpos+1, slashpos-dashpos-1));
		}

		// ignore out of range
		if (beginat < 0)
			beginat = 0;
		if (endat > max)
			endat = max;

		// setup enabled
		for (int i = beginat; i <= endat; i+=step) {
			initialEnabled[i] = enabled[i] = true;
		}

		tokStr = tokStr.mid(commapos+1, tokStr.length()-commapos-1);
	}

	return;
}
Exemplo 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);
        }
      }
    }
  }
}
Exemplo n.º 3
0
void
CQGnuPlotDataDialog::
filterSlot()
{
  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;

  //---

  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();

  //const CGnuPlotFile &file = model->file();

  CGnuPlotFile newFile;

  CGnuPlotFile::Set newSet;

  // single set, single subset
  if      (! model->isHierarchical1() && ! model->isHierarchical2()) {
    int setNum    = 0;
    int subSetNum = 0;

    CGnuPlotFile::SubSet newSubSet;

    for (int lineNum = 0; lineNum < model->rowCount(); ++lineNum) {
      bool lineActive = (everyStr != "" ? everyData.validPointIndex(lineNum) : true);
      if (! lineActive) continue;

      CGnuPlotPlot::Values values;

      for (int c = 0; c < model->columnCount(); ++c) {
        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 (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;

      //---

      CGnuPlotFile::SubSetLine newSubSetLine;

      newSubSetLine.num = lineNum;

      CGnuPlotFile::Fields fields;

      for (const auto &v : newValues) {
        std::string str;

        v->getStringValue(str);

        newSubSetLine.fields.push_back(str);
      }

      newSubSet.lines.push_back(newSubSetLine);
    }

    if (smooth != Smooth::None)
      newSubSet.lines = smoothLines(newSubSet.lines, smooth);

    newSubSet.num = subSetNum;

    newSet.subSets.push_back(newSubSet);

    newSet.num = setNum;

    newFile.addSet(newSet);
  }
  // single set, multiple subsets
  else if (model->isHierarchical1()) {
    int setNum = 0;

    for (int subSetNum = 0; subSetNum < model->rowCount(); ++subSetNum) {
      bool subSetActive = (everyStr != "" ? everyData.validBlockIndex(subSetNum) : true);
      if (! subSetActive) continue;

      CGnuPlotFile::SubSet newSubSet;

      QModelIndex ind = model->index(subSetNum, 0);

      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) {
          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;

        //---

        CGnuPlotFile::SubSetLine newSubSetLine;

        newSubSetLine.num = lineNum;

        CGnuPlotFile::Fields fields;

        for (const auto &v : newValues) {
          std::string str;

          v->getStringValue(str);

          newSubSetLine.fields.push_back(str);
        }

        newSubSet.lines.push_back(newSubSetLine);
      }

      if (smooth != Smooth::None)
        newSubSet.lines = smoothLines(newSubSet.lines, smooth);

      newSubSet.num = subSetNum;

      newSet.subSets.push_back(newSubSet);
    }

    newSet.num = setNum;

    newFile.addSet(newSet);
  }
  // multiple sets, multiple subsets
  else {
    for (int setNum = 0; setNum < model->rowCount(); ++setNum) {
      bool setActive = (indexStr != "" ? indexData.validIndex(setNum) : true);
      if (! setActive) continue;

      CGnuPlotFile::SubSet newSubSet;

      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);

        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) {
            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;

          //---

          CGnuPlotFile::SubSetLine newSubSetLine;

          newSubSetLine.num = lineNum;

          CGnuPlotFile::Fields fields;

          for (const auto &v : newValues) {
            std::string str;

            v->getStringValue(str);

            newSubSetLine.fields.push_back(str);
          }

          newSubSet.lines.push_back(newSubSetLine);
        }

        if (smooth != Smooth::None)
          newSubSet.lines = smoothLines(newSubSet.lines, smooth);

        newSubSet.num = subSetNum;

        newSet.subSets.push_back(newSubSet);
      }

      newSet.num = setNum;

      newFile.addSet(newSet);
    }
  }

  //---

  CQGnuPlotDataDialog *dialog = new CQGnuPlotDataDialog(window_, newFile);

  dialog->show();
}