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/nmWxAutomaticFittingStart.h

183 lines
4.8 KiB
C++

#ifndef NMWXAUTOMATICFITTINGSTART_H
#define NMWXAUTOMATICFITTINGSTART_H
#include "iDlgBase.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QGridLayout>
#include <QGroupBox>
#include <QLabel>
#include <QTextEdit>
#include <QProgressBar>
#include <QPushButton>
#include <QMessageBox>
#include <QCloseEvent>
#include <QFont>
#include <QTextCursor>
#include <QDateTime>
#include <QWidget>
#include <QPointF>
#include <QRectF>
#include <QSplitter>
#include "nmCalculationAutoFitPSO.h"
#include "nmCalculationAutoFitLM.h"
// 前向声明
class nmCalculationAutoFitPSO;
class nmCalculationAutoFitLM;
class QPainter;
class QColor;
class QPaintEvent;
class QScrollArea;
class nmAutomaticFittingCurveChart : public QWidget
{
Q_OBJECT
public:
explicit nmAutomaticFittingCurveChart(QWidget* parent = 0);
void setTargetLogLogData(const QVector<QVector<double> >& data);
void setBestLogLogData(const QVector<QVector<double> >& data, int iteration, double fitness);
void setPseudoPressureMode(bool enabled);
protected:
virtual void paintEvent(QPaintEvent* event);
private:
void rebuildRange();
void drawGrid(QPainter& painter);
void drawAxes(QPainter& painter);
void drawCurveLine(QPainter& painter, const QVector<QPointF>& points, const QColor& color);
void drawCrossMarkers(QPainter& painter, const QVector<QPointF>& points, const QColor& color);
void drawCircleMarkers(QPainter& painter, const QVector<QPointF>& points, const QColor& color);
QVector<QPointF> extractCurve(const QVector<QVector<double> >& data, int yIndex) const;
QPointF dataToScreen(const QPointF& point) const;
QString formatPowerTickLabel(int exponent) const;
QVector<QPointF> m_targetPressure;
QVector<QPointF> m_targetDerivative;
QVector<QPointF> m_bestPressure;
QVector<QPointF> m_bestDerivative;
QRectF m_chartRect;
QRectF m_logRange;
int m_bestIteration;
double m_bestFitness;
bool m_pseudoPressureMode;
};
class nmWxAutomaticfittingStart : public iDlgBase
{
Q_OBJECT
public:
explicit nmWxAutomaticfittingStart(QWidget *parent = 0);
~nmWxAutomaticfittingStart();
virtual QSize sizeHint() const;
// 算法接口
void setAutoFitter(nmCalculationAutoFitPSO* autoFitter);
void setAutoFitter(nmCalculationAutoFitLM* autoFitter);
// 通用设置接口
void setFittingParameters(int maxIterations, double targetError, const QString& wellName);
void setSelectedParameters(const QStringList& parameterNames, const QStringList& parameterUnits);
void setTargetLogLogData(const QVector<QVector<double> >& targetData);
void setPseudoPressureMode(bool enabled);
// 拟合
void markFittingStarted();
public slots:
void onFittingProgress(int iteration, double fitness);
void onLMStageChanged(int stage);
void onToggleLog();
void onFittingFinished(bool success, const QString& message);
void onFinalizingStarted();
void onStopButtonClicked();
void onLogMessageReceived(const QString& message);
void onBestCurveUpdated(QVector<QVector<double> > targetData,
QVector<QVector<double> > bestData,
int iteration,
double fitness);
protected:
void closeEvent(QCloseEvent *event);
bool eventFilter(QObject* watched, QEvent* event);
private:
void setupUI();
void setupParameterArea();
void setupParameterStrip();
void updateParameterAreaHeight();
void setupChartArea();
void setupLogArea();
void setupControlArea();
void updateAlgorithmDisplay();
void updateParameterValues();
void updateCurrentError(double fitness);
void addLogMessage(const QString& message);
QString formatScientific(double value);
// UI组件
QSplitter* rightSplitter;
// 参数显示区域
QGroupBox* parameterGroup;
QLabel* currentIterationLabel;
QLabel* currentComfortLabel;
QLabel* bestComfortLabel;
QLabel* targetPrecisionLabel;
QLabel* targetWellLabel;
QLabel* algorithmTypeLabel;
QLabel* currentIterationValue;
QLabel* currentComfortValue;
QLabel* bestComfortValue;
QLabel* targetPrecisionValue;
QLabel* targetWellValue;
QLabel* algorithmTypeValue;
// 参数每行最多六个,可见两行,其余通过垂直滚动查看。
QWidget* parameterStrip;
QScrollArea* parameterScrollArea;
QWidget* parameterContent;
QGridLayout* parameterLayout;
QVector<QLabel*> parameterValues;
// 日志区域
QGroupBox* chartGroup;
nmAutomaticFittingCurveChart* curveChart;
QGroupBox* logGroup;
QTextEdit* logTextEdit;
QPushButton* logToggle;
QList<int> expandedLogSizes;
// 控制区域
QProgressBar* progressBar;
QLabel* stageStatus;
QLabel* stateBadge;
QLabel* resultSummary;
QLabel* runSummary;
QPushButton* stopButton;
// 算法实例
nmCalculationAutoFitPSO* m_autoFitterPSO;
nmCalculationAutoFitLM* m_autoFitterLM;
QString m_algorithmName;
// 拟合参数
int m_maxIterations;
double m_targetError;
QString m_wellName;
bool m_isFinished;
bool m_isFinalizing;
double m_bestFitnessEver;
QDateTime m_startTime;
};
#endif // NMWXAUTOMATICFITTINGSTART_H