diff --git a/src/kdefrontend/ui/fitoptionswidget.ui b/src/kdefrontend/ui/fitoptionswidget.ui index 242bc1052..0bd8f838e 100644 --- a/src/kdefrontend/ui/fitoptionswidget.ui +++ b/src/kdefrontend/ui/fitoptionswidget.ui @@ -1,210 +1,194 @@ FitOptionsWidget 0 0 344 490 Qt::Horizontal 129 20 Apply Cancel - - - - 6 + + + + Specify maximum number of iterations for the fit algorithm + + + Max. iterations: - - - - - - - 6 + + + + show the fit function with the given start parameters + + + Preview fit function - - + + + + + - Select the range to evaluate the resulting fit function + Number of points to use when evaluating the final fit function - Auto evaluation range - - - true + Evaluated points: - - - - 6 + + + + + + + + + + false + + + Robust fit: - - + + - If selected, the resulting fit parameter are set as new start values. + This option can be used to turn on and off the usage of given data errors when fitting. - Use results as new start values + Use given data errors true Specify the tolerance for the fit algorithm convergence Tolerance: - - - - This option can be used to turn on and off the usage of given data errors when fitting. - + + + + + - Use given data errors - - - true + .. - - - - - - - Specify maximum number of iterations for the fit algorithm - + + - Max. iterations: + .. Select range of data to use for fitting Auto fit range true - - - - - + + - Number of points to use when evaluating the final fit function + If selected, the resulting fit parameter are set as new start values. - Evaluated points: - - - - - - - .. + Use results as new start values - - - - - - 6 + + true - - - - false + + + + Select the range to evaluate the resulting fit function - Robust fit: + Auto evaluation range - - - - - - .. + + true - - + + - - - - show the fit function with the given start parameters - - - Preview fit function - - + + + + + + + + diff --git a/src/kdefrontend/widgets/FitOptionsWidget.cpp b/src/kdefrontend/widgets/FitOptionsWidget.cpp index fa34b1335..b9796dca1 100644 --- a/src/kdefrontend/widgets/FitOptionsWidget.cpp +++ b/src/kdefrontend/widgets/FitOptionsWidget.cpp @@ -1,190 +1,185 @@ /*************************************************************************** File : FitOptionsWidget.cc Project : LabPlot Description : widget for editing advanced fit options -------------------------------------------------------------------- Copyright : (C) 2014 Alexander Semke (alexander.semke@web.de) Copyright : (C) 2017-2018 Stefan Gerlach (stefan.gerlach@uni.kn) ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the Free Software * * Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301 USA * * * ***************************************************************************/ #include "FitOptionsWidget.h" /*! \class FitOptionsWidget \brief Widget for editing advanced fit options. \ingroup kdefrontend */ FitOptionsWidget::FitOptionsWidget(QWidget *parent, XYFitCurve::FitData* fitData, XYFitCurve* fitCurve): QWidget(parent), m_fitData(fitData), m_fitCurve(fitCurve), m_changed(false) { ui.setupUi(this); ui.pbApply->setIcon(QIcon::fromTheme("dialog-ok-apply")); ui.pbCancel->setIcon(QIcon::fromTheme("dialog-cancel")); //TODO: show "robust" option when robust fitting is possible // ui.cbRobust->addItem(i18n("on")); // ui.cbRobust->addItem(i18n("off")); ui.lRobust->setVisible(false); ui.cbRobust->setVisible(false); ui.leEps->setValidator( new QDoubleValidator(ui.leEps) ); ui.leMaxIterations->setValidator( new QIntValidator(ui.leMaxIterations) ); ui.leEvaluatedPoints->setValidator( new QIntValidator(ui.leEvaluatedPoints) ); ui.leEps->setText(QString::number(m_fitData->eps)); ui.leMaxIterations->setText(QString::number(m_fitData->maxIterations)); ui.leEvaluatedPoints->setText(QString::number(m_fitData->evaluatedPoints)); ui.cbAutoRange->setChecked(m_fitData->autoRange); ui.cbAutoEvalRange->setChecked(m_fitData->autoEvalRange); - ui.sbMin->setRange(-std::numeric_limits::max(), std::numeric_limits::max()); - ui.sbMin->setValue(m_fitData->fitRange.first()); - ui.sbMax->setRange(-std::numeric_limits::max(), std::numeric_limits::max()); - ui.sbMax->setValue(m_fitData->fitRange.last()); - ui.sbEvalMin->setRange(-std::numeric_limits::max(), std::numeric_limits::max()); - ui.sbEvalMin->setValue(m_fitData->evalRange.first()); - ui.sbEvalMax->setRange(-std::numeric_limits::max(), std::numeric_limits::max()); - ui.sbEvalMax->setValue(m_fitData->evalRange.last()); + ui.leMin->setText(QString::number(m_fitData->fitRange.first())); + ui.leMax->setText(QString::number(m_fitData->fitRange.last())); + ui.leEvalMin->setText(QString::number(m_fitData->evalRange.first())); + ui.leEvalMax->setText(QString::number(m_fitData->evalRange.last())); this->autoRangeChanged(); this->autoEvalRangeChanged(); ui.cbUseDataErrors->setChecked(m_fitData->useDataErrors); ui.cbUseResults->setChecked(m_fitData->useResults); ui.cbPreview->setChecked(m_fitData->previewEnabled); //SLOTS connect(ui.leEps, &QLineEdit::textChanged, this, &FitOptionsWidget::changed); connect(ui.leMaxIterations, &QLineEdit::textChanged, this, &FitOptionsWidget::changed); connect(ui.leEvaluatedPoints, &QLineEdit::textChanged, this, &FitOptionsWidget::changed); connect(ui.cbUseDataErrors, &QCheckBox::clicked, this, &FitOptionsWidget::changed); connect(ui.cbUseResults, &QCheckBox::clicked, this, &FitOptionsWidget::changed); connect(ui.cbPreview, &QCheckBox::clicked, this, &FitOptionsWidget::changed); connect(ui.pbApply, &QPushButton::clicked, this, &FitOptionsWidget::applyClicked); connect(ui.pbCancel, &QPushButton::clicked, this, &FitOptionsWidget::finished); connect(ui.cbAutoRange, &QCheckBox::clicked, this, &FitOptionsWidget::autoRangeChanged); connect(ui.cbAutoEvalRange, &QCheckBox::clicked, this, &FitOptionsWidget::autoEvalRangeChanged); - connect(ui.sbMin, static_cast(&QDoubleSpinBox::valueChanged), this, &FitOptionsWidget::fitRangeMinChanged); - connect(ui.sbMax, static_cast(&QDoubleSpinBox::valueChanged), this, &FitOptionsWidget::fitRangeMaxChanged); - connect(ui.sbEvalMin, static_cast(&QDoubleSpinBox::valueChanged), this, &FitOptionsWidget::evalRangeMinChanged); - connect(ui.sbEvalMax, static_cast(&QDoubleSpinBox::valueChanged), this, &FitOptionsWidget::evalRangeMaxChanged); + connect(ui.leMin, &QLineEdit::textChanged, this, &FitOptionsWidget::fitRangeMinChanged); + connect(ui.leMax, &QLineEdit::textChanged, this, &FitOptionsWidget::fitRangeMaxChanged); + connect(ui.leEvalMin, &QLineEdit::textChanged, this, &FitOptionsWidget::evalRangeMinChanged); + connect(ui.leEvalMax, &QLineEdit::textChanged, this, &FitOptionsWidget::evalRangeMaxChanged); } void FitOptionsWidget::autoRangeChanged() { const bool autoRange = ui.cbAutoRange->isChecked(); m_fitData->autoRange = autoRange; if (autoRange) { - ui.sbMin->setEnabled(false); + ui.leMin->setEnabled(false); ui.lXRange->setEnabled(false); - ui.sbMax->setEnabled(false); + ui.leMax->setEnabled(false); const AbstractColumn* xDataColumn = nullptr; if (m_fitCurve->dataSourceType() == XYAnalysisCurve::DataSourceSpreadsheet) xDataColumn = m_fitCurve->xDataColumn(); else { if (m_fitCurve->dataSourceCurve()) xDataColumn = m_fitCurve->dataSourceCurve()->xColumn(); } if (xDataColumn) { - ui.sbMin->setValue(xDataColumn->minimum()); - ui.sbMax->setValue(xDataColumn->maximum()); + ui.leMin->setText(QString::number(xDataColumn->minimum())); + ui.leMax->setText(QString::number(xDataColumn->maximum())); } } else { - ui.sbMin->setEnabled(true); + ui.leMin->setEnabled(true); ui.lXRange->setEnabled(true); - ui.sbMax->setEnabled(true); + ui.leMax->setEnabled(true); } - } void FitOptionsWidget::autoEvalRangeChanged() { const bool autoRange = ui.cbAutoEvalRange->isChecked(); m_fitData->autoEvalRange = autoRange; if (autoRange) { - ui.sbEvalMin->setEnabled(false); + ui.leEvalMin->setEnabled(false); ui.lEvalRange->setEnabled(false); - ui.sbEvalMax->setEnabled(false); + ui.leEvalMax->setEnabled(false); const AbstractColumn* xDataColumn = nullptr; if (m_fitCurve->dataSourceType() == XYAnalysisCurve::DataSourceSpreadsheet) xDataColumn = m_fitCurve->xDataColumn(); else { if (m_fitCurve->dataSourceCurve()) xDataColumn = m_fitCurve->dataSourceCurve()->xColumn(); } if (xDataColumn) { - ui.sbEvalMin->setValue(xDataColumn->minimum()); - ui.sbEvalMax->setValue(xDataColumn->maximum()); + ui.leEvalMin->setText(QString::number(xDataColumn->minimum())); + ui.leEvalMax->setText(QString::number(xDataColumn->maximum())); } } else { - ui.sbEvalMin->setEnabled(true); + ui.leEvalMin->setEnabled(true); ui.lEvalRange->setEnabled(true); - ui.sbEvalMax->setEnabled(true); + ui.leEvalMax->setEnabled(true); } } void FitOptionsWidget::fitRangeMinChanged() { - const double xMin = ui.sbMin->value(); + const double xMin = ui.leMin->text().toDouble(); m_fitData->fitRange.first() = xMin; changed(); } void FitOptionsWidget::fitRangeMaxChanged() { - const double xMax = ui.sbMax->value(); + const double xMax = ui.leMax->text().toDouble(); m_fitData->fitRange.last() = xMax; changed(); } void FitOptionsWidget::evalRangeMinChanged() { - const double xMin = ui.sbEvalMin->value(); + const double xMin = ui.leEvalMin->text().toDouble(); m_fitData->evalRange.first() = xMin; changed(); } void FitOptionsWidget::evalRangeMaxChanged() { - const double xMax = ui.sbEvalMax->value(); + const double xMax = ui.leEvalMax->text().toDouble(); m_fitData->evalRange.last() = xMax; changed(); } void FitOptionsWidget::applyClicked() { m_fitData->maxIterations = ui.leMaxIterations->text().toFloat(); m_fitData->eps = ui.leEps->text().toFloat(); m_fitData->evaluatedPoints = ui.leEvaluatedPoints->text().toInt(); m_fitData->useDataErrors = ui.cbUseDataErrors->isChecked(); m_fitData->useResults = ui.cbUseResults->isChecked(); m_fitData->previewEnabled = ui.cbPreview->isChecked(); if (m_changed) emit optionsChanged(); emit finished(); } void FitOptionsWidget::changed() { m_changed = true; }