diff --git a/Plugins/org.mitk.gui.qt.chartExample/src/internal/ChartExample.cpp b/Plugins/org.mitk.gui.qt.chartExample/src/internal/ChartExample.cpp index 9355b1124e..ebfa48e94b 100644 --- a/Plugins/org.mitk.gui.qt.chartExample/src/internal/ChartExample.cpp +++ b/Plugins/org.mitk.gui.qt.chartExample/src/internal/ChartExample.cpp @@ -1,251 +1,302 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ - // Blueberry -#include -#include -#include #include +#include // Qmitk #include "ChartExample.h" // Qt -#include #include - const std::string ChartExample::VIEW_ID = "org.mitk.views.chartexample"; void ChartExample::SetFocus() { m_Controls.m_buttonCreateChart->setFocus(); } void ChartExample::CreateQtPartControl(QWidget *parent) { // create GUI widgets from the Qt Designer's .ui file m_Controls.setupUi(parent); connect(m_Controls.m_buttonCreateChart, &QPushButton::clicked, this, &ChartExample::CreateChart); connect(m_Controls.m_buttonClearChart, &QPushButton::clicked, this, &ChartExample::ClearChart); connect(m_Controls.m_buttonAddData, &QPushButton::clicked, this, &ChartExample::AddData); + connect(m_Controls.m_checkBoxEnableDataX, &QCheckBox::toggled, this, &ChartExample::ShowXData); connect(m_Controls.m_checkBoxEnableErrors, &QCheckBox::toggled, this, &ChartExample::ShowErrorOptions); connect(m_Controls.m_checkBoxEnableXErrors, &QCheckBox::toggled, this, &ChartExample::ShowXErrorOptions); connect(m_Controls.m_checkBoxEnableYErrors, &QCheckBox::toggled, this, &ChartExample::ShowYErrorOptions); m_Controls.m_groupBoxErrors->setVisible(false); m_Controls.m_groupBoxXErrors->setVisible(false); m_Controls.m_groupBoxYErrors->setVisible(false); + m_Controls.m_lineEditDataXVector->setVisible(false); + m_Controls.m_lineEditDataXVector->setText("0;1;2;3;4;5;6;7;8;9"); FillRandomDataValues(); auto chartStyle = GetColorTheme(); m_Controls.m_Chart->SetTheme(chartStyle); m_Controls.m_lineEditXAxisLabel->setText("xLabel"); m_Controls.m_lineEditYAxisLabel->setText("yLabel"); - m_chartNameToChartType.emplace("bar", QmitkChartWidget::ChartType::bar); - m_chartNameToChartType.emplace("line", QmitkChartWidget::ChartType::line); - m_chartNameToChartType.emplace("spline", QmitkChartWidget::ChartType::spline); - m_chartNameToChartType.emplace("pie", QmitkChartWidget::ChartType::pie); - m_chartNameToChartType.emplace("area", QmitkChartWidget::ChartType::area); - m_chartNameToChartType.emplace("area-spline", QmitkChartWidget::ChartType::area_spline); - m_chartNameToChartType.emplace("scatter", QmitkChartWidget::ChartType::scatter); + m_ChartNameToChartType.emplace("bar", QmitkChartWidget::ChartType::bar); + m_ChartNameToChartType.emplace("line", QmitkChartWidget::ChartType::line); + m_ChartNameToChartType.emplace("spline", QmitkChartWidget::ChartType::spline); + m_ChartNameToChartType.emplace("pie", QmitkChartWidget::ChartType::pie); + m_ChartNameToChartType.emplace("area", QmitkChartWidget::ChartType::area); + m_ChartNameToChartType.emplace("area-spline", QmitkChartWidget::ChartType::area_spline); + m_ChartNameToChartType.emplace("scatter", QmitkChartWidget::ChartType::scatter); m_LineNameToLineType.emplace("solid", QmitkChartWidget::LineStyle::solid); m_LineNameToLineType.emplace("dashed", QmitkChartWidget::LineStyle::dashed); m_AxisScaleNameToAxisScaleType.emplace("linear", QmitkChartWidget::AxisScale::linear); m_AxisScaleNameToAxisScaleType.emplace("logarithmic", QmitkChartWidget::AxisScale::log); } void ChartExample::FillRandomDataValues() { - std::vector numbers = generateRandomNumbers(10, 10.0); - std::string text = convertToText(numbers, ";"); - m_Controls.m_lineEditDataVector->setText(QString::fromStdString(text)); + std::vector numbers = GenerateRandomNumbers(10, 10.0); + std::string text = ConvertToText(numbers); + m_Controls.m_lineEditDataYVector->setText(QString::fromStdString(text)); m_Controls.m_lineEditDataLabel->setText("test" + QString::number(countForUID)); - numbers = generateRandomNumbers(10, 10.0); - text = convertToText(numbers, ";"); + numbers = GenerateRandomNumbers(10, 10.0); + text = ConvertToText(numbers); m_Controls.m_lineEditXErrorPlus->setText(QString::fromStdString(text)); - numbers = generateRandomNumbers(10, 10.0); - text = convertToText(numbers, ";"); + numbers = GenerateRandomNumbers(10, 10.0); + text = ConvertToText(numbers); m_Controls.m_lineEditXErrorMinus->setText(QString::fromStdString(text)); - numbers = generateRandomNumbers(10, 10.0); - text = convertToText(numbers, ";"); + numbers = GenerateRandomNumbers(10, 10.0); + text = ConvertToText(numbers); m_Controls.m_lineEditYErrorPlus->setText(QString::fromStdString(text)); - numbers = generateRandomNumbers(10, 10.0); - text = convertToText(numbers, ";"); + numbers = GenerateRandomNumbers(10, 10.0); + text = ConvertToText(numbers); m_Controls.m_lineEditYErrorMinus->setText(QString::fromStdString(text)); countForUID++; } void ChartExample::CreateChart() { - auto dataYAxisScaleType = m_AxisScaleNameToAxisScaleType.at(m_Controls.m_comboBoxYAxisScale->currentText().toStdString()); + auto dataYAxisScaleType = + m_AxisScaleNameToAxisScaleType.at(m_Controls.m_comboBoxYAxisScale->currentText().toStdString()); auto xAxisLabel = m_Controls.m_lineEditXAxisLabel->text().toStdString(); auto yAxisLabel = m_Controls.m_lineEditYAxisLabel->text().toStdString(); auto showLegend = m_Controls.m_checkBoxShowLegend->isChecked(); auto showDataPoints = m_Controls.m_checkBoxShowDataPoints->isChecked(); auto stackedData = m_Controls.m_checkBoxStackedData->isChecked(); auto showSubchart = m_Controls.m_checkBoxShowSubchart->isChecked(); auto title = m_Controls.title->text().toStdString(); m_Controls.m_Chart->SetTitle(title); m_Controls.m_Chart->SetYAxisScale(dataYAxisScaleType); m_Controls.m_Chart->SetXAxisLabel(xAxisLabel); m_Controls.m_Chart->SetYAxisLabel(yAxisLabel); m_Controls.m_Chart->SetShowLegend(showLegend); m_Controls.m_Chart->SetShowErrorBars(true); m_Controls.m_Chart->SetShowDataPoints(showDataPoints); m_Controls.m_Chart->SetStackedData(stackedData); m_Controls.m_Chart->Show(showSubchart); } - void ChartExample::ClearChart() { m_Controls.m_Chart->Clear(); m_Controls.m_plainTextEditDataView->clear(); } -std::vector ChartExample::ConvertToVector(const QString& lineEditData) +std::vector ChartExample::ConvertToVector(const QString &data, QChar delimiter) const { - std::vector data; - if (lineEditData.isEmpty()) + std::vector output; + if (data.isEmpty()) { - return data; + return output; } - for(const QString entry : lineEditData.split(';')) + for (const QString entry : data.split(delimiter)) { - data.push_back(entry.toDouble()); + output.push_back(entry.toDouble()); } - return data; + return output; } void ChartExample::AddData() { - QString lineEditData = m_Controls.m_lineEditDataVector->text(); - auto data = ConvertToVector(lineEditData); + QString data = m_Controls.m_lineEditDataYVector->text(); + auto dataY = ConvertToVector(data); - auto chartType = m_chartNameToChartType.at(m_Controls.m_comboBoxChartType->currentText().toStdString()); + auto chartType = m_ChartNameToChartType.at(m_Controls.m_comboBoxChartType->currentText().toStdString()); std::string dataLabel = m_Controls.m_lineEditDataLabel->text().toStdString(); std::string dataColor = m_Controls.m_lineEditColor->text().toStdString(); auto dataLineStyleType = m_LineNameToLineType.at(m_Controls.m_comboBoxLineStyle->currentText().toStdString()); - - m_Controls.m_Chart->AddData1D(data, dataLabel, chartType); - if (!dataColor.empty()) { + + if (m_Controls.m_checkBoxEnableDataX->isChecked()) + { + QString lineEditDataX = m_Controls.m_lineEditDataXVector->text(); + auto dataX = ConvertToVector(lineEditDataX); + if (dataX.size() != dataY.size()) + { + mitkThrow() << "data x and y size have to be equal"; + } + auto dataXandY = CreateMap(dataX, dataY); + data = QString::fromStdString(ConvertToText(dataXandY)); + + m_Controls.m_Chart->AddData2D(dataXandY, dataLabel, chartType); + } + else + { + m_Controls.m_Chart->AddData1D(dataY, dataLabel, chartType); + } + if (!dataColor.empty()) + { m_Controls.m_Chart->SetColor(dataLabel, dataColor); } + if (m_Controls.m_checkBoxEnableErrors->isChecked()) { if (m_Controls.m_checkBoxEnableXErrors->isChecked()) { auto errorsPlus = ConvertToVector(m_Controls.m_lineEditXErrorPlus->text()); auto errorsMinus = ConvertToVector(m_Controls.m_lineEditXErrorMinus->text()); m_Controls.m_Chart->SetXErrorBars(m_Controls.m_lineEditDataLabel->text().toStdString(), errorsPlus, errorsMinus); } if (m_Controls.m_checkBoxEnableYErrors->isChecked()) { auto errorsPlus = ConvertToVector(m_Controls.m_lineEditYErrorPlus->text()); auto errorsMinus = ConvertToVector(m_Controls.m_lineEditYErrorMinus->text()); m_Controls.m_Chart->SetYErrorBars(m_Controls.m_lineEditDataLabel->text().toStdString(), errorsPlus, errorsMinus); } } m_Controls.m_Chart->SetLineStyle(dataLabel, dataLineStyleType); QString dataOverview; dataOverview.append(m_Controls.m_lineEditDataLabel->text()); dataOverview.append("(").append(m_Controls.m_comboBoxChartType->currentText()); - if (!dataColor.empty()) { + if (!dataColor.empty()) + { dataOverview.append(", ").append(dataColor.c_str()); } dataOverview.append(", ").append(m_Controls.m_comboBoxLineStyle->currentText()); dataOverview.append(")"); - dataOverview.append(":").append(lineEditData); + dataOverview.append(":").append(data); m_Controls.m_plainTextEditDataView->appendPlainText(dataOverview); FillRandomDataValues(); } +void ChartExample::ShowXData(bool show) +{ + m_Controls.m_lineEditDataXVector->setVisible(show); +} + void ChartExample::ShowErrorOptions(bool show) { m_Controls.m_groupBoxErrors->setVisible(show); } void ChartExample::ShowXErrorOptions(bool show) { m_Controls.m_groupBoxXErrors->setVisible(show); } void ChartExample::ShowYErrorOptions(bool show) { m_Controls.m_groupBoxYErrors->setVisible(show); } -std::vector ChartExample::generateRandomNumbers(unsigned int amount, double max) const +std::vector ChartExample::GenerateRandomNumbers(unsigned int amount, double max) const { QRandomGenerator gen; gen.seed(time(NULL)); std::vector data; - for (unsigned int i = 0; i < amount; i++) { + for (unsigned int i = 0; i < amount; i++) + { data.push_back(gen.bounded(max)); } return data; } -std::string ChartExample::convertToText(std::vector numbers, std::string delimiter) const +std::map ChartExample::CreateMap(std::vector keys, + std::vector values) const { + std::map aMap; + std::transform(keys.begin(), keys.end(), values.begin(), std::inserter(aMap, aMap.end()), [](double a, double b) { + return std::make_pair(a, b); + }); + return aMap; +} + +std::string ChartExample::ConvertToText(std::vector numbers, std::string delimiter) const { std::ostringstream oss; oss.precision(3); if (!numbers.empty()) { - for (auto number : numbers) { + for (auto number : numbers) + { oss << number << delimiter; } } auto aString = oss.str(); aString.pop_back(); return aString; } +std::string ChartExample::ConvertToText(std::map numbers, std::string delimiter) const { + std::ostringstream oss; + oss.precision(3); + + if (!numbers.empty()) + { + for (const auto keyValue : numbers) + { + oss << keyValue.first << ":" << keyValue.second << delimiter; + } + } + auto aString = oss.str(); + aString.pop_back(); + return aString; +} + QmitkChartWidget::ColorTheme ChartExample::GetColorTheme() const { - ctkPluginContext* context = berry::WorkbenchPlugin::GetDefault()->GetPluginContext(); + ctkPluginContext *context = berry::WorkbenchPlugin::GetDefault()->GetPluginContext(); ctkServiceReference styleManagerRef = context->getServiceReference(); if (styleManagerRef) { auto styleManager = context->getService(styleManagerRef); - if (styleManager->GetStyle().name == "Dark") { + if (styleManager->GetStyle().name == "Dark") + { return QmitkChartWidget::ColorTheme::darkstyle; } - else { + else + { return QmitkChartWidget::ColorTheme::lightstyle; } } return QmitkChartWidget::ColorTheme::darkstyle; } diff --git a/Plugins/org.mitk.gui.qt.chartExample/src/internal/ChartExample.h b/Plugins/org.mitk.gui.qt.chartExample/src/internal/ChartExample.h index 15f1522d53..32ae0b67f6 100644 --- a/Plugins/org.mitk.gui.qt.chartExample/src/internal/ChartExample.h +++ b/Plugins/org.mitk.gui.qt.chartExample/src/internal/ChartExample.h @@ -1,72 +1,71 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef ChartExample_h #define ChartExample_h -#include - #include #include "ui_ChartExampleControls.h" /** - \brief ChartExample - - \warning This class is not yet documented. Use "git blame" and ask the author to provide basic documentation. + \brief Basic example for use of module mitkChart \sa QmitkAbstractView \ingroup ${plugin_target}_internal */ class ChartExample : public QmitkAbstractView { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: static const std::string VIEW_ID; protected: virtual void CreateQtPartControl(QWidget *parent) override; virtual void SetFocus() override; void CreateChart(); void ClearChart(); - std::vector ConvertToVector(const QString &lineEditData); + void AddData(); + void ShowXData(bool show); void ShowErrorOptions(bool show); void ShowXErrorOptions(bool show); void ShowYErrorOptions(bool show); - Ui::ChartExampleControls m_Controls; - private: void FillRandomDataValues(); - std::vector generateRandomNumbers(unsigned int amount, double max) const; - std::string convertToText(std::vector numbers, std::string delimiter) const; + std::vector GenerateRandomNumbers(unsigned int amount, double max) const; + std::vector ConvertToVector(const QString& data, QChar delimiter=';') const; + std::map CreateMap(std::vector keys, std::vector values) const; + std::string ConvertToText(std::vector numbers, std::string delimiter = ";") const; + std::string ConvertToText(std::map numbers, std::string delimiter = ";") const; QmitkChartWidget::ColorTheme GetColorTheme() const; - std::map m_chartNameToChartType; + std::map m_ChartNameToChartType; std::map m_LineNameToLineType; std::map m_AxisScaleNameToAxisScaleType; unsigned int countForUID = 0; + Ui::ChartExampleControls m_Controls; }; #endif // ChartExample_h diff --git a/Plugins/org.mitk.gui.qt.chartExample/src/internal/ChartExampleControls.ui b/Plugins/org.mitk.gui.qt.chartExample/src/internal/ChartExampleControls.ui index 00bb610c49..042618e963 100644 --- a/Plugins/org.mitk.gui.qt.chartExample/src/internal/ChartExampleControls.ui +++ b/Plugins/org.mitk.gui.qt.chartExample/src/internal/ChartExampleControls.ui @@ -1,489 +1,566 @@ ChartExampleControls 0 0 455 - 974 + 1135 0 0 QmitkTemplate - - - Data + + + + 0 + 0 + - - - - - - - data entry - - - - - - - - 0 - 0 - - - - - - - - - - - error - - - - - - - - 0 - 0 - - - - Error values - - - - - - - - y error - - - - - - - x error - - - - - - - - 0 - 0 - - - - GroupBox - - - - - - - - plus error - - - - - - - minus error - - - - - - - - - - - - - - - - - - - 0 - 0 - - - - GroupBox - - - - - - - - plus error - - - - - - - - 0 - 0 - - - - - - - - - - - - 0 - 0 - - - - - - - - - - - minus error - - - - - - - - - + + 0 + + + + + 0 + 0 + 420 + 417 + + + + + 0 + 0 + + + + Data + + + + + + + + data entry + + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + x + + + + + + + y: + + - - - - - - data label - - - - - - - - 0 - 0 - - - - - - - - Chart type - - - - - - - - 0 - 0 - - - + + + - bar + error + + + + + + + + 0 + 0 + + + + Error values + + + + + + + + y error + + + + + + + x error + + + + + + + + 0 + 0 + + + + GroupBox + + + + + + + + plus error + + + + + + + minus error + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + GroupBox + + + + + + + + plus error + + + + + + + + 0 + 0 + + + + + + + + + + + + 0 + 0 + + + + + + + + + + + minus error + + + + + + + + + + + + + + + + + data label + + + + + + + + 0 + 0 + - - + + + + - line + Chart type + + + + + + + + 0 + 0 + + + + + bar + + + + + line + + + + + area + + + + + spline + + + + + area-spline + + + + + scatter + + + + + + + + Color + + + + + + + + 0 + 0 + + + + + + + + Line style + + + + + + + + 0 + 0 + - - + + + solid + + + + + dashed + + + + + + + + + + Add data + + + + + + + + + 0 + 0 + 437 + 241 + + + + + 0 + 0 + + + + Global options + + + + + + QLayout::SetDefaultConstraint + + + QFormLayout::AllNonFixedFieldsGrow + + + - area + Title - - + + + + + + + - spline + XAxis label - - + + + + + + + - area-spline + YAxis label - - + + + + + + + - scatter + Y Axis scale - - - - - - - Color - - - - - - - - 0 - 0 - - - - - - - - Line style - - - - - - - - 0 - 0 - - - + + + + + + + linear + + + + + logarithmic + + + + + + - solid + Show legend - - + + true + + + + + - dashed + Stacked data - - - - - - - Title - - - - - - - - - - - - - - - Add data - - - - - - - - 0 - 0 - - - - Global options - - - - - - - - XAxis label - - - - - - - - - - YAxis label - - - - - - - - - - Y Axis scale - - - - - - + + + + - linear + Show data points + + + true - - + + + + - logarithmic + Show Subchart - - - - - - - Show legend - - - true - - - - - - - Stacked data - - - - - - - Show data points - - - true - - - - - - - Show Subchart - - - - - - + + + + + + Do image processing Create chart Clear chart Qt::Vertical + + + 0 + 0 + + 0 - 200 + 250 0 0 0 - + + + + 0 + 0 + + + + + 16777215 + 150 + + + Qt::Vertical QSizePolicy::Expanding 20 0 QmitkChartWidget QWidget
QmitkChartWidget.h