#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 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 getPressurePoints() const; // 设置压力曲线点数据 void setPressurePoints(const QVector& points); // 获取流量曲线点数据 QVector getFlowPoints() const; // 设置流量曲线点数据 void setFlowPoints(const QVector& points); int getIndexF() const; void setIndexF(const int newIndex); bool getPlotVisible() const; void setPlotVisible(const bool newState); // 历史数据相关方法 QVector> getHistoryPressure(); void setHistoryPressure(QVector> pressureData); QVector> getHistoryLogLog(); void setHistoryLogLog(QVector> loglogData); QVector> getHistorySemiLog(); void setHistorySemiLog(QVector> semiLogData); void setWellType(NM_WELL_MODEL newWellType); NM_WELL_MODEL getWellType() const; // 计算结果相关方法 QVector> getResultPressure(); void setResultPressure(QVector> pressureData); QVector> getResultLogLog(); void setResultLogLog(QVector> loglogData); QVector> getResultSemiLog(); void setResultSemiLog(QVector> 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& getPerforations(); // 获取所有射孔段(返回指针的引用) void clearPerforations(); // 清空所有射孔段数据 // 井级别的流量和时间查询方法 double getTotalTimeRange() const; double getFlowRateAtTime(double time) const; QVector getAllFlowStepBoundaries() const; QVector 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 getFlowStepBoundariesInSegment(int segmentIndex, int perforationIndex) const; QVector 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; // 井名 // 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 m_vecPtsP; // 压力曲线点数据 QVector m_vecPtsF; // 流量曲线点数据 int m_nIndexF; // 当前流量段的索引 bool m_bPlotVisible; // 图元是否可见 // 添加时间变表皮状态字段 bool m_bTimeDependentSkin; // 井类型 NM_WELL_MODEL m_eWellType; // 历史数据 QVector> m_vvecHsyPressure; // 历史压力数据 QVector> m_vvecHsyLogLog; // 历史双对数数据 QVector> m_vvecHsySemiLog; // 历史半对数数据 // 计算结果数据 QVector> m_vvecRstPressure; // 计算结果压力数据 QVector> m_vvecRstLogLog; // 计算结果双对数数据 QVector> m_vvecRstSemiLog; // 计算结果半对数数据 // 射孔段集合 QVector m_vecPerforations; // 记录原始井身长度,用于计算更新井身长度之后射孔段的位置 double m_dLastWellLength; nmDataReservoir* m_pReservoir; };