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