EnergySpectrumAnalyer/src/EnergyCountPeakFitView/EnergyCountPeakFitView.h

129 lines
4.3 KiB
C
Raw Normal View History

#ifndef ENERGYCOUNTPEAKFITVIEW_H
#define ENERGYCOUNTPEAKFITVIEW_H
#include <QObject>
#include <QWidget>
#include <MeasureAnalysisView.h>
2026-04-15 18:17:16 +08:00
#include <QwtPlotPicker>
#include <QwtPickerDragRectMachine>
#include <QRubberBand> // 新增
#include <qwt_plot_shapeitem.h> // 新增
#include <QDateTime>
#include <QJsonArray>
#include <QJsonObject>
#include "PeakFitParamsDialog.h"
#include "DataCalcProcess/FindPeaksBySvd.h"
#include "DataCalcProcess/NolinearLeastSquaresCurveFit.h"
#include "DataCalcProcess/AdaptiveSimpsonIntegrate.h"
#include "DataCalcProcess/MathModelDefine.h"
struct PeakFitResult
{
double center; // 峰中心能量 (keV)
double amplitude; // 高斯振幅
double sigma; // 高斯宽度
double fwhm; // 半高宽 = sigma * 2.355
double area; // 峰面积(积分)
double baseline; // 常数项 C
double sigmoidH; // Sigmoid 项高度 H
double sigmoidW; // Sigmoid 项宽度 W
};
struct PeakFitHistoryItem {
QDateTime timestamp; // 时间戳
double center; // 峰中心能量 (keV)
double fwhm; // 半高宽
double area; // 峰面积
double amplitude; // 幅度 A
double sigma; // 标准差 delt
double sigmoidH; // H
double sigmoidW; // W
double baseline; // C
double xMin; // 拟合曲线显示范围左边界
double xMax; // 拟合曲线显示范围右边界
QJsonObject toJson() const;
static PeakFitHistoryItem fromJson(const QJsonObject& obj);
};
2026-04-15 18:17:16 +08:00
class PlotRectItem; // 前向声明
class QMenu;
class CustomQwtPlot;
class CustomQwtPlotXaxisSelector;
2026-04-15 18:17:16 +08:00
class QwtPlotPicker;
class QwtPlotCurve;
class EnergyCountPeakFitView : public MeasureAnalysisView
{
Q_OBJECT
public:
EnergyCountPeakFitView(QWidget *parent = nullptr);
virtual ~EnergyCountPeakFitView();
virtual void InitViewWorkspace(const QString& project_name) override final;
virtual void SetAnalyzeDataFilename(const QMap<QString, QVariant>& data_files_set);
private:
void setupPlot();
void setupMenu();
void loadDataFromFile(const QString &data_name, const QString& filename);
void loadHistoryFromFile();
void saveHistoryToFile();
void saveCurrentFitToHistory(); // 保存当前拟合结果
void displayFitFromHistory(const PeakFitHistoryItem& item); // 显示历史拟合曲线
private slots:
void onActionCurveShowSetting();
void onActionPlotConfigure();
2026-04-15 18:17:16 +08:00
void clearAllSelectionRects();
void clearFitCurves(); // 清除所有拟合曲线
// [NEW] 新增菜单槽函数
void onActionSaveCurrentFit();
void onActionShowFitHistory();
2026-04-15 18:17:16 +08:00
protected:
bool eventFilter(QObject* watched, QEvent* event) override; // 事件过滤器
private:
void startSelection(const QPoint& pos);
void updateSelection(const QPoint& pos);
void finishSelection();
void addSelectionRect(const QRectF& plotRect);
void fadeSelectionRectBorders();
2026-04-15 18:17:16 +08:00
QList<PeakFitResult> performPeakFitting(const QVector<double>& x, const QVector<double>& y, const arma::vec* userP0 = nullptr);
// 根据拟合参数生成曲线
QwtPlotCurve* createFitCurve(const PeakFitResult& result, double xMin, double xMax, const QString& name);
private:
CustomQwtPlot* _plot = nullptr;
QMenu* _menu = nullptr;
QDialog* _curve_show_setting_dlg = nullptr;
CustomQwtPlotXaxisSelector* _data_selector = nullptr;
2026-04-15 18:17:16 +08:00
// 手动框选状态
bool _isSelecting = false;
QPoint _selectionStart;
QRubberBand* _rubberBand = nullptr; // 原生橡皮筋
QList<PlotRectItem*> _selectionRectItems;
QwtPlotCurve* _fittedCurve = nullptr; // 显示拟合结果的曲线
// 存储当前显示的拟合曲线,用于清除
QList<QwtPlotCurve*> _fitCurves;
2026-04-15 18:17:16 +08:00
// [NEW] 历史记录相关成员
QList<PeakFitHistoryItem> _fitHistoryList;
QString _historyFilePath;
// [NEW] 最近一次拟合结果(用于手动保存)
PeakFitResult _lastFitResult;
arma::vec _lastFitParams; // 6个拟合参数 (A, delt, H, W, C, P)
double _lastXMin = 0.0, _lastXMax = 0.0;
bool _hasLastFit = false;
QString _workspace;
};
#endif // ENERGYCOUNTPEAKFITVIEW_H