You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/nmNum/nmSubWxs/nmWxAutomaticFitting.h

114 lines
3.3 KiB
C++

#ifndef NMWXAUTOMATICFITTING_H
#define NMWXAUTOMATICFITTING_H
#include "iDlgBase.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QTreeWidget>
#include <QLineEdit>
#include <QComboBox>
#include <QPushButton>
#include <QCheckBox>
#include <QLabel>
#include <QHeaderView>
#include <QProgressDialog>
#include <QTimer>
#include <QMessageBox>
#include <QApplication>
#include <QStringList>
#include "nmDataAnalyzeManager.h"
#include "nmDataReservoir.h"
#include "nmDataWellBase.h"
#include "nmDataAutomaticFitting.h"
#include "nmCalculationAutoFitPSO.h"
#include "nmCalculationAutoFitLM.h"
#include "nmWxAutomaticfittingStart.h"
#include "nmSubWxs_global.h"
class NM_SUB_WXS_EXPORT nmWxAutomaticFitting : public iDlgBase
{
Q_OBJECT
public:
nmWxAutomaticFitting(QWidget *parent = 0, nmSensitivityFitSettings* settings = nullptr,
const QStringList& sampledParameters = QStringList());
~nmWxAutomaticFitting();
virtual QSize sizeHint() const;
private slots:
void onSelectAll(bool checked);
void onAccept();
void onReject();
void onAlgorithmChanged(int index);
void onParameterTableItemChanged(QTreeWidgetItem* item, int column);
// 自动拟合相关槽函数
void runAutoFitting();
void onFittingProgress(int iteration, double fitness);
void onFittingFinished(bool success, const QString& message);
void onStopFitting();
private:
void setupUI();
void setupParameterTable();
void setupControlPanel();
QHBoxLayout* setupButtons();
void updateSelectAllState();
void setAutomaticFittingValue();
void saveModelParameters();
void initializeModelParameters(bool restoreRanges = true);
void addParameter(QTreeWidgetItem* group, int type, nmDataWellBase* well, double initial);
QVector<double> targetInitialValues() const;
QStringList selectedParameterLabels(bool units) const;
void updateRangeForParameter(int parameterIndex, double centerValue);
void setParameterRange(int parameterIndex, double minValue, double maxValue);
bool getPhysicalParameterRange(int parameterIndex, double& minValue, double& maxValue);
bool validateParameterTable(QString& errorMessage, int parameterIndex = -1);
void startAutoFitting(const QVector<QVector<double>>& targetData, const QStringList& selectedParams, const QString& targetWellName);
void cleanupFitting();
void refreshParametersFromModel();
private:
// UI组件
QVBoxLayout* m_mainLayout;
QGridLayout* m_controlLayout;
QTreeWidget* m_parameterTable;
QVector<QTreeWidgetItem*> m_parameterItems;
// 控制面板组件
QLineEdit* m_iterationEdit;
QLabel* m_iterationLabel;
QLineEdit* m_errorLimitEdit;
QString m_targetWellName;
QString m_targetWellCode;
QComboBox* m_algorithmCombo;
// 按钮
QCheckBox* m_selectAllCheckBox;
QPushButton* m_okBtn;
QPushButton* m_cancelBtn;
// 数据成员
nmDataReservoir reservoirData;
nmDataAutomaticFitting automaticFittingData;
nmSensitivityFitSettings* m_sensitivitySettings;
QStringList m_sampledParameters;
// 自动拟合相关成员
nmCalculationAutoFitPSO* m_autoFitterPSO;
nmCalculationAutoFitLM* m_autoFitterLM;
QProgressDialog* m_progressDialog;
QTimer* m_progressTimer;
bool m_updatingParameterRanges;
// 拟合开始界面
nmWxAutomaticfittingStart* m_progressMonitor;
};
#endif // NMWXAUTOMATICFITTING_H