#ifndef ENERGYCOUNTPEAKFITVIEW_H #define ENERGYCOUNTPEAKFITVIEW_H #include #include #include #include #include #include // 新增 #include // 新增 #include #include #include #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); }; class PlotRectItem; // 前向声明 class QMenu; class CustomQwtPlot; class CustomQwtPlotXaxisSelector; 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& 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(); void clearAllSelectionRects(); void clearFitCurves(); // 清除所有拟合曲线 // [NEW] 新增菜单槽函数 void onActionSaveCurrentFit(); void onActionShowFitHistory(); 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(); QList performPeakFitting(const QVector& x, const QVector& 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; // 手动框选状态 bool _isSelecting = false; QPoint _selectionStart; QRubberBand* _rubberBand = nullptr; // 原生橡皮筋 QList _selectionRectItems; QwtPlotCurve* _fittedCurve = nullptr; // 显示拟合结果的曲线 // 存储当前显示的拟合曲线,用于清除 QList _fitCurves; // [NEW] 历史记录相关成员 QList _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