diff --git a/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationControls.ui b/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationControls.ui index ac4a41972c..43aeb08f85 100644 --- a/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationControls.ui +++ b/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationControls.ui @@ -1,405 +1,350 @@ QmitkHistogramVisualizationControls 0 0 540 460 540 460 Form false 0 0 530 450 400 450 false false 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 0 0 120 120 120 120 120 120 120 120 120 false 0 0 0 0 16777215 16777215 Plot - - - - - - - 0 - 0 - - - - - - - Barchart - - - true - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - Linegraph - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - Show Subchart true Use default #bins true QFrame::NoFrame QFrame::Raised 0 0 0 0 0 60 0 100 16777215 # bins: false Press enter to recalculate statistics with new bin size. 1 10000 100 0 0 0 0 0 0 0 0 0 0 0 0 Copy to Clipboard Qt::Horizontal 40 20 QmitkChartWidget QWidget
QmitkChartWidget.h
diff --git a/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.cpp b/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.cpp index 022d5e848c..b744d26976 100644 --- a/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.cpp +++ b/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.cpp @@ -1,69 +1,125 @@ /*=================================================================== 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. ===================================================================*/ #include "QmitkHistogramVisualizationWidget.h" +#include + HistogramVisualizationWidget::HistogramVisualizationWidget(QWidget* parent) : QWidget(parent) { - if (m_Controls == nullptr) - { - m_Controls = new Ui::QmitkHistogramVisualizationControls; - } - setupUi(this); + m_Controls.setupUi(this); CreateConnections(); } -void HistogramVisualizationWidget::CreateConnections() +void HistogramVisualizationWidget::setHistogram(itk::Statistics::Histogram::ConstPointer histogram, std::string dataLabel) { - connect(buttonCopyHistogramToClipboard, &QPushButton::clicked, this, &HistogramVisualizationWidget::OnClipboardButtonClicked); - connect(radioButtonBarchart, &QRadioButton::clicked, this, &HistogramVisualizationWidget::OnBarRadioButtonSelected); - connect(radioButtonLinegraph, &QRadioButton::clicked, this, &HistogramVisualizationWidget::OnLineRadioButtonSelected); - connect(checkBoxUseDefaultNBins, &QCheckBox::clicked, this, &HistogramVisualizationWidget::OnDefaultNBinsCheckBoxChanged); - connect(spinBoxNBins, &QSpinBox::editingFinished, this, &HistogramVisualizationWidget::OnNBinsSpinBoxValueChanged); - connect(checkBoxShowSubchart, &QCheckBox::clicked, this, &HistogramVisualizationWidget::OnShowSubchartCheckBoxChanged); + if (histogram == nullptr) + return; + + m_Histogram = histogram; + m_Controls.chartWidget->AddData2D(ConvertHistogramToMap(m_Histogram), dataLabel); + m_Controls.chartWidget->SetChartType(dataLabel, QmitkChartWidget::ChartType::bar); + m_Controls.chartWidget->SetXAxisLabel("Gray value"); + m_Controls.chartWidget->SetYAxisLabel("Frequency"); + + m_Controls.chartWidget->Show(m_Controls.checkBoxShowSubchart->isChecked()); + SetGUIElementsEnabled(true); } -void HistogramVisualizationWidget::EnableAllComponents() +void HistogramVisualizationWidget::Reset() { - this->setEnabled(true); - groupBoxHistogram->setEnabled(true); - groupBoxPlot->setEnabled(true); - buttonCopyHistogramToClipboard->setEnabled(true); + m_Controls.chartWidget->Clear(); + SetGUIElementsEnabled(false); } -void HistogramVisualizationWidget::OnClipboardButtonClicked() +void HistogramVisualizationWidget::CreateConnections() { + connect(m_Controls.buttonCopyHistogramToClipboard, &QPushButton::clicked, this, &HistogramVisualizationWidget::OnClipboardButtonClicked); + connect(m_Controls.checkBoxUseDefaultNBins, &QCheckBox::clicked, this, &HistogramVisualizationWidget::OnDefaultNBinsCheckBoxChanged); + connect(m_Controls.spinBoxNBins, &QSpinBox::editingFinished, this, &HistogramVisualizationWidget::OnNBinsSpinBoxValueChanged); + connect(m_Controls.checkBoxShowSubchart, &QCheckBox::clicked, this, &HistogramVisualizationWidget::OnShowSubchartCheckBoxChanged); } -void HistogramVisualizationWidget::OnDefaultNBinsCheckBoxChanged() +void HistogramVisualizationWidget::SetGUIElementsEnabled(bool enabled) { + this->setEnabled(enabled); + m_Controls.groupBoxHistogram->setEnabled(enabled); + m_Controls.groupBoxPlot->setEnabled(enabled); + m_Controls.checkBoxShowSubchart->setEnabled(enabled); + m_Controls.checkBoxUseDefaultNBins->setEnabled(enabled); + m_Controls.spinBoxNBins->setEnabled(!m_Controls.checkBoxUseDefaultNBins->isChecked()); + m_Controls.buttonCopyHistogramToClipboard->setEnabled(enabled); } -void HistogramVisualizationWidget::OnNBinsSpinBoxValueChanged() +std::map HistogramVisualizationWidget::ConvertHistogramToMap(itk::Statistics::Histogram::ConstPointer histogram) const { + std::map histogramMap; + if (histogram) + { + auto endIt = histogram->End(); + auto it = histogram->Begin(); + + // generating Lists of measurement and frequencies + for (; it != endIt; ++it) + { + double frequency = it.GetFrequency(); + double measurement = it.GetMeasurementVector()[0]; + histogramMap.emplace(measurement, frequency); + } + + } + return histogramMap; } -void HistogramVisualizationWidget::OnShowSubchartCheckBoxChanged() +void HistogramVisualizationWidget::OnClipboardButtonClicked() { + if (m_Histogram) + { + QApplication::clipboard()->clear(); + QString clipboard("Measurement \t Frequency\n"); + for (auto it = m_Histogram->Begin(); it != m_Histogram->End(); ++it) + { + clipboard = clipboard.append("%L1 \t %L2\n") + .arg(it.GetMeasurementVector()[0], 0, 'f', 2) + .arg(it.GetFrequency()); + } + + QApplication::clipboard()->setText(clipboard, QClipboard::Clipboard); + } } -void HistogramVisualizationWidget::OnBarRadioButtonSelected() +void HistogramVisualizationWidget::OnDefaultNBinsCheckBoxChanged() { + if (m_Controls.checkBoxUseDefaultNBins->isChecked()) + { + m_Controls.spinBoxNBins->setEnabled(false); + m_Controls.spinBoxNBins->setValue(100); + } + else + { + m_Controls.spinBoxNBins->setEnabled(true); + } } -void HistogramVisualizationWidget::OnLineRadioButtonSelected() +void HistogramVisualizationWidget::OnNBinsSpinBoxValueChanged() { + emit RequestHistogramUpdate(m_Controls.spinBoxNBins->value()); } + +void HistogramVisualizationWidget::OnShowSubchartCheckBoxChanged() +{ + m_Controls.chartWidget->Show(m_Controls.checkBoxShowSubchart->isChecked()); +} \ No newline at end of file diff --git a/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.h b/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.h index b92d5e4eab..ada433f974 100644 --- a/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.h +++ b/Modules/ImageStatisticsUI/Qmitk/QmitkHistogramVisualizationWidget.h @@ -1,61 +1,65 @@ /*=================================================================== 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. ===================================================================*/ #pragma once //Qt #include #include #include -class MITKIMAGESTATISTICSUI_EXPORT HistogramVisualizationWidget : public QWidget, private Ui::QmitkHistogramVisualizationControls +#include + +class MITKIMAGESTATISTICSUI_EXPORT HistogramVisualizationWidget : public QWidget { Q_OBJECT public: HistogramVisualizationWidget(QWidget* parent = nullptr); - - //void setHistogram(itk::Histogram::ConstPointer h); + /** \brief Draws the histogram and enables the GUI elements */ + void setHistogram(itk::Statistics::Histogram::ConstPointer histogram, std::string dataLabel); + /** \brief Clears the histogram and disables all GUI elements */ + void Reset(); signals: /** * \brief Signal to be emitted when the number of bins is changed by the user. The HistogramCalculator should connect to this signal and recalculate the data accordingly. */ void RequestHistogramUpdate(unsigned int nBins); private: void CreateConnections(); - void EnableAllComponents(); + void SetGUIElementsEnabled(bool enabled); + + std::map ConvertHistogramToMap(itk::Statistics::Histogram::ConstPointer histogram) const; //slots /** \brief Saves the histogram to the clipboard */ void OnClipboardButtonClicked(); /** \brief Toogle GUI elements if histogram default bin size checkbox value changed. */ void OnDefaultNBinsCheckBoxChanged(); void OnNBinsSpinBoxValueChanged(); void OnShowSubchartCheckBoxChanged(); - void OnBarRadioButtonSelected(); - - void OnLineRadioButtonSelected(); - private: - Ui::QmitkHistogramVisualizationControls* m_Controls; + Ui::QmitkHistogramVisualizationControls m_Controls; + + itk::Statistics::Histogram::ConstPointer m_Histogram; }; \ No newline at end of file