add statistics to GraphicAnalysis

This commit is contained in:
2023-08-02 12:32:09 +03:00
parent d98e8c1f30
commit 1b06de0dc4
9 changed files with 558 additions and 26 deletions

View File

@@ -1,5 +1,6 @@
#include "graphic_analysis.h"
#include "graphic_analysis_stat.h"
#include "qad_types.h"
#include "ui_graphic_analysis.h"
@@ -56,9 +57,11 @@ GraphicAnalysis::GraphicAnalysis(QWidget * parent): GraphicRanges(parent) {
ui = new Ui::GraphicAnalysis();
ui->setupUi(widget_toolbox);
ui->widgetSpectrum->hide();
window_stat = new GraphicAnalysisStatistics();
connect(ui->checkSpectrum, SIGNAL(toggled(bool)), this, SLOT(checkSpectrum_toggled(bool)));
connect(ui->buttonSpectrumRange, SIGNAL(toggled(bool)), this, SLOT(buttonSpectrumRange_toggled(bool)));
connect(ui->checkSpectrumFixDuration, SIGNAL(toggled(bool)), this, SLOT(checkSpectrumFixDuration_toggled(bool)));
connect(ui->buttonStatistics, SIGNAL(toggled(bool)), this, SLOT(buttonStatistics_toggled(bool)));
auto * lay = qobject_cast<QBoxLayout *>(layout());
lay->insertWidget(0, widget_toolbox);
connect(ui->spinSpectrumDuration, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
@@ -70,8 +73,8 @@ GraphicAnalysis::GraphicAnalysis(QWidget * parent): GraphicRanges(parent) {
GraphicAnalysis::~GraphicAnalysis() {
delete window_stat;
delete ui;
delete widget_toolbox;
}
@@ -119,13 +122,13 @@ void GraphicAnalysis::setLabelX(const QString & str) {
}
QBoxLayout * GraphicAnalysis::toolboxLayout() {
return reinterpret_cast<QBoxLayout *>(widget_toolbox->layout());
QWidget * GraphicAnalysis::toolboxWidget() {
return widget_toolbox;
}
QWidget * GraphicAnalysis::toolboxWidget() {
return widget_toolbox;
void GraphicAnalysis::setShowSpectrum(bool on) {
ui->checkSpectrum->setChecked(on);
}
@@ -293,10 +296,15 @@ void GraphicAnalysis::gaMouseReleaseEvent(QPointF point, int buttons) {
void GraphicAnalysis::gaRangeSelected(double start, double end) {
if (!ui->buttonSpectrumRange->isChecked()) return;
ui->buttonSpectrumRange->setChecked(false);
range_fft = GraphicRanges::Range(start, end);
updateAllGraphic();
if (ui->buttonSpectrumRange->isChecked()) {
ui->buttonSpectrumRange->setChecked(false);
range_fft = GraphicRanges::Range(start, end);
updateAllGraphic();
}
if (ui->buttonStatistics->isChecked()) {
ui->buttonStatistics->setChecked(false);
window_stat->show(this, GraphicRanges::Range(start, end));
}
}
@@ -308,9 +316,10 @@ void GraphicAnalysis::checkSpectrum_toggled(bool on) {
void GraphicAnalysis::buttonSpectrumRange_toggled(bool on) {
setFFT(!on);
if (on)
if (on) {
ui->buttonStatistics->setChecked(false);
checkRangeRequest();
else
} else
viewport()->unsetCursor();
}
@@ -319,3 +328,12 @@ void GraphicAnalysis::checkSpectrumFixDuration_toggled(bool on) {
checkRangeRequest();
emit configChanged();
}
void GraphicAnalysis::buttonStatistics_toggled(bool on) {
if (on) {
ui->buttonSpectrumRange->setChecked(false);
rangeRequest();
} else
viewport()->unsetCursor();
}

View File

@@ -29,11 +29,13 @@ namespace Ui {
class GraphicAnalysis;
}
class GraphicAnalysisPlugin;
class GraphicAnalysisStatistics;
class QAD_GRAPHIC_ANALYSIS_EXPORT GraphicAnalysis: public GraphicRanges {
Q_OBJECT
friend class GraphicAnalysisPlugin;
Q_PROPERTY(bool toolboxVisible READ isToolboxVisible WRITE setToolboxVisible)
Q_PROPERTY(bool showSpectrum READ isShowSpectrum WRITE setShowSpectrum)
public:
GraphicAnalysis(QWidget * parent = 0);
@@ -49,8 +51,8 @@ public:
bool isToolboxVisible() const;
void setToolboxVisible(bool yes);
void setLabelX(const QString & str);
QBoxLayout * toolboxLayout();
QWidget * toolboxWidget();
void setShowSpectrum(bool on);
bool isShowSpectrum() const;
void setGraphicsCount(int cnt, bool update = true);
@@ -70,6 +72,7 @@ protected:
void checkRangeRequest();
Ui::GraphicAnalysis * ui = nullptr;
GraphicAnalysisStatistics * window_stat;
QWidget * widget_toolbox = nullptr;
QMap<int, QPolygonF> src_data;
GraphicRanges::Range range_fft;
@@ -91,6 +94,7 @@ private slots:
void checkSpectrum_toggled(bool on);
void buttonSpectrumRange_toggled(bool on);
void checkSpectrumFixDuration_toggled(bool on);
void buttonStatistics_toggled(bool on);
signals:
void showSpectrumChanged(bool);

View File

@@ -20,6 +20,36 @@
<property name="rightMargin">
<number>0</number>
</property>
<item>
<widget class="QToolButton" name="buttonStatistics">
<property name="toolTip">
<string>Select statistics input data</string>
</property>
<property name="icon">
<iconset resource="../../../cd/utils/pult/cdpult.qrc">
<normaloff>:/icons/dialog-information.png</normaloff>:/icons/dialog-information.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>10</width>
<height>5</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QCheckBox" name="checkSpectrum">
<property name="text">
@@ -133,17 +163,12 @@
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>104</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources>
<include location="../../../cd/utils/pult/cdpult.qrc"/>
<include location="qad_graphic_analysis.qrc"/>
</resources>
<connections>

View File

@@ -0,0 +1,66 @@
#include "graphic_analysis_stat.h"
#include "graphic_analysis.h"
#include "ui_graphic_analysis_stat.h"
#include <pistatistic.h>
GraphicAnalysisStatistics::GraphicAnalysisStatistics(QWidget * parent): QDialog(parent) {
ui = new Ui::GraphicAnalysisStatistics();
ui->setupUi(this);
}
GraphicAnalysisStatistics::~GraphicAnalysisStatistics() {
delete ui;
}
void GraphicAnalysisStatistics::show(GraphicAnalysis * g, GraphicRanges::Range r) {
source = g;
range = r;
if (range.isEmpty()) range = source->rangeAll();
ui->comboGraphic->clear();
for (int i = 0; i < source->graphicsCount(); ++i) {
auto g = source->graphic(i);
ui->comboGraphic->addItem(g.icon, g.name);
}
QDialog::exec();
}
void GraphicAnalysisStatistics::changeEvent(QEvent * e) {
QDialog::changeEvent(e);
if (e->type() == QEvent::LanguageChange) {
ui->retranslateUi(this);
return;
}
}
void GraphicAnalysisStatistics::on_comboGraphic_currentIndexChanged(int index) {
if (index < 0 || !source) return;
auto setNum = [](double v, QLineEdit * le) { le->setText(QString::number(v)); };
const auto data = source->graphicData(index);
QPolygonF in;
for (const auto & i: data) {
if ((i.x() >= range.start) && (i.x() <= range.end)) in << i;
}
auto br = in.boundingRect();
setNum(br.left(), ui->lineXMin);
setNum(br.right(), ui->lineXMax);
setNum(br.bottom(), ui->lineYMin);
setNum(br.top(), ui->lineYMax);
setNum(in.size(), ui->linePoints);
PIVector<double> stat_in;
in.reserve(256);
for (const auto & i: in)
stat_in << i.y();
PIStatisticd stat;
stat.calculate(stat_in);
setNum(stat.mean, ui->lineMean);
setNum(stat.variance, ui->lineVariance);
setNum(stat.skewness, ui->lineSkewness);
setNum(stat.kurtosis, ui->lineKurtosis);
}

View File

@@ -0,0 +1,54 @@
/*
QAD - Qt ADvanced
Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef graphic_analysis_stat_h
#define graphic_analysis_stat_h
#include "graphic_ranges.h"
#include "qad_graphic_analysis_export.h"
#include <QDialog>
namespace Ui {
class GraphicAnalysisStatistics;
}
class GraphicAnalysis;
class QAD_GRAPHIC_ANALYSIS_EXPORT GraphicAnalysisStatistics: public QDialog {
Q_OBJECT
public:
GraphicAnalysisStatistics(QWidget * parent = 0);
virtual ~GraphicAnalysisStatistics();
void show(GraphicAnalysis * g, GraphicRanges::Range r);
protected:
void changeEvent(QEvent * e);
Ui::GraphicAnalysisStatistics * ui = nullptr;
GraphicAnalysis * source = nullptr;
GraphicRanges::Range range;
private slots:
void on_comboGraphic_currentIndexChanged(int index);
};
#endif

View File

@@ -0,0 +1,238 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>GraphicAnalysisStatistics</class>
<widget class="QDialog" name="GraphicAnalysisStatistics">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>417</width>
<height>488</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QFormLayout" name="formLayout_3">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Graphic:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboGraphic"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Points:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="linePoints">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Statistics</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<property name="labelAlignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>X min:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="lineXMin">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>X max:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="lineXMax">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>Mean:</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="lineMean">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
<string>Skewness:</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLineEdit" name="lineSkewness">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Variance:</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLineEdit" name="lineVariance">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Kurtosis:</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QLineEdit" name="lineKurtosis">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Y min:</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Y max:</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="lineYMin">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="lineYMax">
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="standardButtons">
<set>QDialogButtonBox::Close</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources>
<include location="qad_graphic_analysis.qrc"/>
</resources>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>GraphicAnalysisStatistics</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>281</x>
<y>459</y>
</hint>
<hint type="destinationlabel">
<x>415</x>
<y>462</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>GraphicAnalysisStatistics</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>395</x>
<y>447</y>
</hint>
<hint type="destinationlabel">
<x>413</x>
<y>447</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -5,28 +5,91 @@
<name>GraphicAnalysis</name>
<message>
<location filename="../graphic_analysis.ui" line="26"/>
<source>Select statistics input data</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis.ui" line="56"/>
<source>Spectrum</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis.ui" line="48"/>
<location filename="../graphic_analysis.ui" line="78"/>
<source>Select spectrum input data</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis.ui" line="96"/>
<location filename="../graphic_analysis.ui" line="126"/>
<source>Fix dur.:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis.ui" line="106"/>
<location filename="../graphic_analysis.ui" line="136"/>
<source> s</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis.cpp" line="178"/>
<location filename="../graphic_analysis.cpp" line="211"/>
<source>Hz</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>GraphicAnalysisStatistics</name>
<message>
<location filename="../graphic_analysis_stat.ui" line="25"/>
<source>Graphic:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="35"/>
<source>Points:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="51"/>
<source>Statistics</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="65"/>
<source>X min:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="79"/>
<source>X max:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="93"/>
<source>Mean:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="107"/>
<source>Skewness:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="121"/>
<source>Variance:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="135"/>
<source>Kurtosis:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="149"/>
<source>Y min:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="156"/>
<source>Y max:</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>

View File

@@ -5,28 +5,91 @@
<name>GraphicAnalysis</name>
<message>
<location filename="../graphic_analysis.ui" line="26"/>
<source>Select statistics input data</source>
<translation>Выбрать данные для построения статистики</translation>
</message>
<message>
<location filename="../graphic_analysis.ui" line="56"/>
<source>Spectrum</source>
<translation>Спектр</translation>
</message>
<message>
<location filename="../graphic_analysis.ui" line="48"/>
<location filename="../graphic_analysis.ui" line="78"/>
<source>Select spectrum input data</source>
<translation>Выбрать данные для построения спектра</translation>
</message>
<message>
<location filename="../graphic_analysis.ui" line="96"/>
<location filename="../graphic_analysis.ui" line="126"/>
<source>Fix dur.:</source>
<translation>Фикс. длит.:</translation>
</message>
<message>
<location filename="../graphic_analysis.ui" line="106"/>
<location filename="../graphic_analysis.ui" line="136"/>
<source> s</source>
<translation> с</translation>
</message>
<message>
<location filename="../graphic_analysis.cpp" line="178"/>
<location filename="../graphic_analysis.cpp" line="211"/>
<source>Hz</source>
<translation>Гц</translation>
</message>
</context>
<context>
<name>GraphicAnalysisStatistics</name>
<message>
<location filename="../graphic_analysis_stat.ui" line="25"/>
<source>Graphic:</source>
<translation>График:</translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="35"/>
<source>Points:</source>
<translation>Точек:</translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="51"/>
<source>Statistics</source>
<translation>Статистика</translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="65"/>
<source>X min:</source>
<translation>X мин:</translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="79"/>
<source>X max:</source>
<translation>X макс:</translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="93"/>
<source>Mean:</source>
<translation>Среднее:</translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="107"/>
<source>Skewness:</source>
<translation>Асимметрия:</translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="121"/>
<source>Variance:</source>
<translation>Дисперсия:</translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="135"/>
<source>Kurtosis:</source>
<translation>Эксцесс:</translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="149"/>
<source>Y min:</source>
<translation>Y мин:</translation>
</message>
<message>
<location filename="../graphic_analysis_stat.ui" line="156"/>
<source>Y max:</source>
<translation>Y макс:</translation>
</message>
</context>
</TS>

View File

@@ -2,5 +2,6 @@
<qresource prefix="/">
<file>../../icons/axis_x.png</file>
<file>../../icons/graphic.png</file>
<file>../../icons/dialog-information.png</file>
</qresource>
</RCC>