void ErrDialog::add() { ApplicationWindow *app = qobject_cast<ApplicationWindow *>(parent()); if (!app) return; MultiLayer *plot = (MultiLayer *)app->activeWindow(ApplicationWindow::MultiLayerWindow); if (!plot) return; Graph* g = plot->activeLayer(); if (!g) return; QString name = nameLabel->currentText(); DataCurve *curve = g->dataCurve(name); if (!curve){ QMessageBox::critical(app, tr("QtiPlot - Error"), tr("This feature is not available for user defined function curves!")); return; } int direction = xErrBox->isChecked() ? 0 : 1; ErrorBarsCurve *er = NULL; if (columnBox->isChecked()){ QString errColumnName = tableNamesBox->currentText() + "_" + colNamesBox->currentText(); Table *errTable = app->table(errColumnName); if (!errTable) return; /*if (w->numRows() != errTable->numRows()){ QMessageBox::critical(app, tr("QtiPlot - Error"), tr("The selected columns have different numbers of rows!")); return; }*/ if (errTable->isEmptyColumn(errTable->colIndex(errColumnName))){ QMessageBox::critical(app, tr("QtiPlot - Error"), tr("The selected error column is empty!")); return; } er = g->addErrorBars(curve, errTable, errColumnName, direction); } else { Table *t = curve->table(); if (!t) return; if (direction == ErrorBarsCurve::Horizontal) t->addCol(Table::xErr); else t->addCol(Table::yErr); int r = curve->dataSize(); int rows = t->numRows(); int col = t->numCols() - 1; int ycol = t->colIndex(curve->title().text()); if (!direction) ycol = t->colIndex(curve->xColumnName()); QVarLengthArray<double> Y(r); if (direction == ErrorBarsCurve::Horizontal){ for (int i = 0; i < r; i++) Y[i] = curve->x(i); } else { for (int i = 0; i < r; i++) Y[i] = curve->y(i); } if (percentBox->isChecked()){ double prc = 0.01*valueBox->value(); int aux = 0; for (int i = curve->startRow(); i <= curve->endRow(); i++){ if (!t->text(i, ycol).isEmpty() && aux < r){ t->setCell(i, col, Y[aux]*prc); aux++; } } } else if (standardBox->isChecked() || standardErrorBox->isChecked()){ double sd = gsl_stats_sd(Y.data(), 1, r); if (standardErrorBox->isChecked()) sd /= sqrt(r); for (int i = 0; i < rows; i++){ if (!t->text(i, ycol).isEmpty()) t->setCell(i, col, sd); } } er = g->addErrorBars(curve, t, t->colName(col), direction); } if (er){ er->setColor(curve->pen().color()); g->replot(); plot->notifyChanges(); } }