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/nmData/nmDataSensitive.h

175 lines
5.1 KiB
C

#ifndef NMDATASENSITIVE_H
#define NMDATASENSITIVE_H
#include <QObject>
#include <QList>
#include <QVector>
#include <QString>
#include <QSharedPointer>
#include <vector>
#include "nmData_global.h"
#include "nmDataBase.h"
#include "nmDataAttribute.h"
#include <rapidjson/document.h>
class NM_DATA_EXPORT nmDataSensitive : public nmDataBase
{
Q_OBJECT
public:
// 顶部 Calculation type
enum CalculationType
{
CALC_DETERMINISTIC = 0,
CALC_DETERMINISTIC_MULTIVARIATE = 1
};
struct NM_DATA_EXPORT VariableSampling
{
// 变量所属分组
QString m_varGroup;
// 变量名称
QString m_varName;
// 是否勾选
bool m_enabled;
// Mode 枚举
enum Mode
{
MODE_AUTOMATIC = 0,
MODE_MANUAL = 1
};
// Mode 存储字段
Mode m_mode;
// Log? 勾选
bool m_log;
// Number
int m_number;
// 数据参数
nmDataAttribute m_modelValue; // Model value
nmDataAttribute m_minValue; // Minimum
nmDataAttribute m_maxValue; // Maximum
// 表格中的数值列表
QVector<double> m_values;
VariableSampling();
// JSON 序列化 / 反序列化
rapidjson::Value ToJsonValue(rapidjson::Document::AllocatorType& allocator) const;
void FromJsonValue(const rapidjson::Value& jsonValue);
// varGroup
QString getVarGroup() const;
void setVarGroup(const QString& group);
// varName
QString getVarName() const;
void setVarName(const QString& name);
// enabled
bool getEnabled() const;
void setEnabled(bool e);
// mode
Mode getMode() const;
void setMode(Mode m);
// log
bool getLog() const;
void setLog(bool l);
// number
int getNumber() const;
void setNumber(int n);
// modelValue
nmDataAttribute& getModelValue();
void setModelValue(const nmDataAttribute& attr);
// minValue
nmDataAttribute& getMinValue();
void setMinValue(const nmDataAttribute& attr);
// maxValue
nmDataAttribute& getMaxValue();
void setMaxValue(const nmDataAttribute& attr);
// values
QVector<double>& getValues();
void setValues(const QVector<double>& vals);
// 自动采样始终保留原始精度;手动模式直接返回用户指定值。
QVector<double> samplingValues() const;
};
// 运行结果属于分析数据,求解器与界面共用同一结构,避免重复复制整批曲线。
struct RunResult
{
RunResult() : m_nRunIndex(0), m_bSucceeded(false), m_bCancelled(false), m_bVisible(true) {}
quint64 m_nRunIndex;
QVector<double> m_vecParameters;
QVector<QVector<double> > m_vecPressure;
QVector<QVector<double> > m_vecLogLog;
QVector<QVector<double> > m_vecSemiLog;
bool m_bSucceeded;
bool m_bCancelled;
bool m_bVisible;
QString m_sFailureReason;
};
struct NM_DATA_EXPORT BatchResult
{
BatchResult() : m_calcType(CALC_DETERMINISTIC), m_bCompleted(false), m_bStopped(false) {}
CalculationType m_calcType;
QList<VariableSampling> m_variables; // 求解时冻结的配置,独立于之后的参数编辑。
QString m_sWellCode;
QString m_sWellName;
QString m_sAxisXName;
QString m_sAxisXUnit;
QString m_sAxisYName;
QString m_sAxisYUnit;
QVector<QVector<double> > m_vecHistoryLogLog;
QVector<QVector<double> > m_vecBaseLogLog; // 批次启动时原模型已有的数值解。
std::vector<RunResult> m_runs;
bool m_bCompleted;
bool m_bStopped;
QString m_sFailureReason;
rapidjson::Value ToJsonValue(rapidjson::Document::AllocatorType& allocator) const;
void FromJsonValue(const rapidjson::Value& value);
};
public:
nmDataSensitive();
~nmDataSensitive();
nmDataSensitive(const nmDataSensitive& other);
nmDataSensitive& operator=(const nmDataSensitive& other);
// === 实现 nmDataBase 的抽象方法 ===
virtual rapidjson::Value ToJsonValue(rapidjson::Document::AllocatorType& allocator) const override;
virtual void FromJsonValue(const rapidjson::Value& jsonValue) override;
// === Calculation type ===
CalculationType getCalculationType() const;
void setCalculationType(CalculationType type);
// === 总模型数 ===
quint64 getTotalModelCount() const;
void setTotalModelCount(quint64 count);
quint64 calculateModelCount(bool* overflow = nullptr) const;
// 返回与变量列表对应的基准单位值,未改变的参数保持模型值。
bool getRunValues(quint64 runIndex, QVector<double>& values) const;
bool usesBaseUnits() const;
void setUsesBaseUnits(bool enabled);
// 后台运行时由任务独占,线程结束后交给分析数据管理并由界面修改可见性。
QSharedPointer<BatchResult> getResults() const;
void setResults(const QSharedPointer<BatchResult>& results);
// === 变量列表 ===
QList<VariableSampling>& getVariables();
const QList<VariableSampling>& getVariables() const;
void setVariables(const QList<VariableSampling>& vars);
int getVariableCount() const;
VariableSampling& getVariable(int index);
private:
CalculationType m_calcType;
quint64 m_totalModelCount;
bool m_usesBaseUnits;
QList<VariableSampling> m_variables;
QSharedPointer<BatchResult> m_results;
};
#endif // NMDATASENSITIVE_H