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

265 lines
9.2 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#pragma once
#include "nmData_global.h"
#include "nmDefines.h"
#include "nmDataAttribute.h"
#include "ZxDataObjectDbl.h"
#include "nmDataPerforation.h"
//#include "nmDataReservoir.h"
//#include "nmDataAnalyzeManager.h"
class nmDataReservoir;
class nmDataAnalyzeManager;
class NM_DATA_EXPORT nmDataWellBase : public nmDataBase
{
Q_OBJECT
public:
nmDataWellBase();
nmDataWellBase(const nmDataWellBase& other);
~nmDataWellBase();
nmDataWellBase& operator=(const nmDataWellBase& other);
// 创建当前对象的深拷贝
virtual nmDataWellBase* clone() const = 0;
// 实现 nmDataBase 的抽象方法:将当前 C++ 对象序列化为 RapidJSON Value
virtual rapidjson::Value ToJsonValue(rapidjson::Document::AllocatorType& allocator) const override;
// 实现 nmDataBase 的抽象方法:从 RapidJSON Value 反序列化数据到当前 C++ 对象
virtual void FromJsonValue(const rapidjson::Value& jsonValue) override;
// 统一连接 nmDataAttribute 的信号
virtual void connectAttributeSignals();
// 用于获取某个射孔的允许MD范围
virtual void getPerforationAllowedMdRange(nmDataPerforation* pPerfToValidate,
double& dUpperAllowedMd,
double& dLowerAllowedMd) = 0;
public:
// 手动发送信号,通知参数视图进行更新
void notifyParameterChanged();
signals:
// 数据模型发生改变时发出的信号,通知所有监听者刷新视图
void sigWellDataChanged();
// 专门用于通知参数视图更新,通常在模型视图完成交互后发出。
void sigParameterChanged();
public slots:
// 井身长度变化,更新射孔位置
void slotWellLengthChanged();
public:
// 属性的 set 和 get 方法
void setWellName(const QString& name);
QString getWellName() const;
void setWellCode(const QString& code);
QString getWellCode() const;
void setX(const nmDataAttribute& attr);
nmDataAttribute& getX(); // 修改为返回引用
void setY(const nmDataAttribute& attr);
nmDataAttribute& getY(); // 修改为返回引用
void setRadius(const nmDataAttribute& attr);
nmDataAttribute& getRadius(); // 修改为返回引用
void setDrillFloorElevation(const nmDataAttribute& attr);
nmDataAttribute& getDrillFloorElevation(); // 修改为返回引用
void setZw(const nmDataAttribute& attr);
nmDataAttribute& getZw(); // 修改为返回引用
void setWellLength(const nmDataAttribute& attr);
nmDataAttribute& getWellLength(); // 修改为返回引用
void setRateDependentSkin(const nmDataAttribute& attr);
nmDataAttribute& getRateDependentSkin(); // 修改为返回引用
void setdSdQ(const nmDataAttribute& attr);
nmDataAttribute& getdSdQ(); // 修改为返回引用
void setWellboreModel(const nmDataAttribute& attr);
nmDataAttribute& getWellboreModel(); // 修改为返回引用
void setWellboreStorage(const nmDataAttribute& attr);
nmDataAttribute& getWellboreStorage(); // 修改为返回引用
void setBottomholeMD(const nmDataAttribute& attr);
nmDataAttribute& getBottomholeMD(); // 修改为返回引用
// Location---位置
void setInputWellHead(const nmDataAttribute& attr);
nmDataAttribute& getInputWellHead();
void setWellHeadX(const nmDataAttribute& attr);
nmDataAttribute& getWellHeadX();
void setWellHeadY(const nmDataAttribute& attr);
nmDataAttribute& getWellHeadY();
// Wellbore---井储
void setCInitialCFinal(const nmDataAttribute& attr);
nmDataAttribute& getCInitialCFinal();
void setDtChangingStorage(const nmDataAttribute& attr);
nmDataAttribute& getDtChangingStorage();
void setLeakSkin(const nmDataAttribute& attr);
nmDataAttribute& getLeakSkin();
// Wellbore---井储
void setFinalWellboreStorage(const nmDataAttribute& attr);
nmDataAttribute& getFinalWellboreStorage();
// 获取压力曲线点数据
QVector<QPointF> getPressurePoints() const;
// 设置压力曲线点数据
void setPressurePoints(const QVector<QPointF>& points);
// 获取流量曲线点数据
QVector<QPointF> getFlowPoints() const;
// 设置流量曲线点数据
void setFlowPoints(const QVector<QPointF>& points);
int getIndexF() const;
void setIndexF(const int newIndex);
bool getPlotVisible() const;
void setPlotVisible(const bool newState);
// 历史数据相关方法
QVector<QVector<double>> getHistoryPressure();
void setHistoryPressure(QVector<QVector<double>> pressureData);
QVector<QVector<double>> getHistoryLogLog();
void setHistoryLogLog(QVector<QVector<double>> loglogData);
QVector<QVector<double>> getHistorySemiLog();
void setHistorySemiLog(QVector<QVector<double>> semiLogData);
void setWellType(NM_WELL_MODEL newWellType);
NM_WELL_MODEL getWellType() const;
// 计算结果相关方法
QVector<QVector<double>> getResultPressure();
void setResultPressure(QVector<QVector<double>> pressureData);
QVector<QVector<double>> getResultLogLog();
void setResultLogLog(QVector<QVector<double>> loglogData);
QVector<QVector<double>> getResultSemiLog();
void setResultSemiLog(QVector<QVector<double>> semiLogData);
// 时间变表皮状态的getter和setter
bool isTimeDependentSkin() const;
void setTimeDependentSkin(bool enabled);
// 管理射孔段的方法
void addPerforation(nmDataPerforation* perforation); // 接受指针
void removePerforation(int index); // 根据索引移除
nmDataPerforation* getPerforation(int index); // 获取单个射孔段
nmDataPerforation getPerforationCopy(int index); // 获取单个射孔段副本
void updatePerforation(int index, const nmDataPerforation& newData); // 更新单个射孔段数据
int getPerforationCount(); // 获取射孔段数量
QVector<nmDataPerforation*>& getPerforations(); // 获取所有射孔段(返回指针的引用)
void clearPerforations(); // 清空所有射孔段数据
// 井级别的流量和时间查询方法
double getTotalTimeRange() const;
double getFlowRateAtTime(double time) const;
QVector<double> getAllFlowStepBoundaries() const;
QVector<QPointF> getFlowStepsInTimeRange(double startTime, double endTime) const;
double findFlowStepBoundaryAtTime(double timePoint) const;
double findSmartFlowStepBoundary(double targetTime) const;
double findNearestFlowStepBoundary(double targetTime) const;
bool isTimeInFlowStepFirstHalf(double time) const;
// 射孔段相关的查询方法
QVector<double> getFlowStepBoundariesInSegment(int segmentIndex, int perforationIndex) const;
QVector<double> getAllBoundariesInSegment(int segmentIndex, int perforationIndex) const;
int countFlowStepsInSegment(int segmentIndex, int perforationIndex) const;
bool canFlowSegmentBeSplit(int segmentIndex, int perforationIndex) const;
double findNearestFlowStepBoundaryBeforeSegment(int segmentIndex, int perforationIndex) const;
// 判断是否基础射孔段
bool isBasePerforation();
void resetToDefaults(); // 重置所有参数为构造函数默认值
// 导出双对数历史曲线到 CSV
bool exportHistoryLogLogToCsv(const QString& outDir);
// 导出流量数据到 CSV
bool exportHistoryRateToCsv(const QString& outDir);
// 导出历史压力数据到 CSV
bool exportHistoryPressureToCsv(const QString& outDir);
// 导出求解结果双对数曲线到 CSV
bool exportResultLogLogToCsv(const QString& outDir);
// 导出求解结果压力数据到 CSV
bool exportResultPressureToCsv(const QString& outDir);
protected:
QString m_wellName; // 井名
QString m_wellCode; // 井编码项目级唯一标识来自ZxDataWell::getCode()
// Location---位置
nmDataAttribute m_inputWellHead; //井口坐标输入
nmDataAttribute m_wellHeadX; //井口坐标X
nmDataAttribute m_wellHeadY; //井口坐标Y
nmDataAttribute m_x; // X
nmDataAttribute m_y; // Y
// Geometry and properties---几何与属性
nmDataAttribute m_drillFloorElevation; // 钻台标高
nmDataAttribute m_radius; // 井径
nmDataAttribute m_zw; // Zw
nmDataAttribute m_wellLength; // 井身长度
nmDataAttribute m_rateDependentSkin; // 速度表皮
nmDataAttribute m_dSdQ; // dS/dQ 表皮关于产量的变化率
// Wellbore---井储
nmDataAttribute m_wellboreModel; // 井储模型
nmDataAttribute m_wellboreStorage; // 井筒储集系数
nmDataAttribute m_finalWellboreStorage; // 最终井储
nmDataAttribute m_cInitialCFinal; // 初始井储/最终井储
nmDataAttribute m_dtChangingStorage; //井储变化时间
nmDataAttribute m_leakSkin; // 漏失表皮
// Bottomhole conditions---井底条件
nmDataAttribute m_bottomholeMD; // 井底测量深度
QVector<QPointF> m_vecPtsP; // 压力曲线点数据
QVector<QPointF> m_vecPtsF; // 流量曲线点数据
int m_nIndexF; // 当前流量段的索引
bool m_bPlotVisible; // 图元是否可见
// 添加时间变表皮状态字段
bool m_bTimeDependentSkin;
// 井类型
NM_WELL_MODEL m_eWellType;
// 历史数据
QVector<QVector<double>> m_vvecHsyPressure; // 历史压力数据
QVector<QVector<double>> m_vvecHsyLogLog; // 历史双对数数据
QVector<QVector<double>> m_vvecHsySemiLog; // 历史半对数数据
// 计算结果数据
QVector<QVector<double>> m_vvecRstPressure; // 计算结果压力数据
QVector<QVector<double>> m_vvecRstLogLog; // 计算结果双对数数据
QVector<QVector<double>> m_vvecRstSemiLog; // 计算结果半对数数据
// 射孔段集合
QVector<nmDataPerforation*> m_vecPerforations;
// 记录原始井身长度,用于计算更新井身长度之后射孔段的位置
double m_dLastWellLength;
nmDataReservoir* m_pReservoir;
};