|
|
#pragma once
|
|
|
|
|
|
#include "mAlgDefines.h"
|
|
|
#include "mModuleDefines.h"
|
|
|
#include "iCurveDesc.h"
|
|
|
#include "iResultInfo.h"
|
|
|
#include "iSubWndBaseAF.h"
|
|
|
|
|
|
class iParaManager;
|
|
|
class iWxAnalWizard;
|
|
|
class iAlgModelBase;
|
|
|
class cmAlgModelBase;
|
|
|
class iWxRunOption;
|
|
|
class iWxRunOptionStd;
|
|
|
class zxAlgThread;
|
|
|
class ZxObjWmPoint;
|
|
|
class ZxObjInfPoint;
|
|
|
|
|
|
// 父类:拟合相关,有子窗体
|
|
|
class M_SUB_WND_EXPORT iSubWndBaseFit : public iSubWndBaseAF
|
|
|
{
|
|
|
Q_OBJECT
|
|
|
|
|
|
public:
|
|
|
|
|
|
explicit iSubWndBaseFit(QWidget *parent = 0, QString sExt = "");
|
|
|
~iSubWndBaseFit();
|
|
|
|
|
|
// 配置窗体
|
|
|
virtual void configWnd(QString sPrevInfo);
|
|
|
|
|
|
// 初始化Anals
|
|
|
virtual bool createRunWizardWxs();
|
|
|
virtual bool initRunWizardWxUIs();
|
|
|
virtual void setDataWell(ZxDataWell* p);
|
|
|
|
|
|
// 序列化
|
|
|
virtual void onSerialize(ZxSerializer* ser);
|
|
|
virtual void onDeserialize(ZxSerializer* ser);
|
|
|
|
|
|
|
|
|
// 执行命令:通常来自Ribbon
|
|
|
virtual bool runCmdBy(QString sName, QString sID);
|
|
|
|
|
|
/// @brief 命令是否Enabled的状态判断,通常来自Ribbon
|
|
|
/// @param b (out),true:Enabled false:disabled
|
|
|
/// @param sName (in),Cmd Name
|
|
|
/// @param nID (in),Cmd ID
|
|
|
/// @param bLicensed (in),当前是否有授权
|
|
|
/// @return 本窗体是否已经进行状态判断(即属于本窗体可执行的命令)
|
|
|
virtual bool checkCmdEnable(bool &b, \
|
|
|
QString sName, int nID, \
|
|
|
bool bLicensed);
|
|
|
|
|
|
// 右键弹窗,然后激活Fitting窗口
|
|
|
virtual bool firstRunByDataPF(iWxRunOption *pWxRunOption, \
|
|
|
ZxSegmentInfo* pSegInfo);
|
|
|
// 试井设计模式
|
|
|
virtual void copyModelOptionDn(iModelOption* p);
|
|
|
virtual void setDnMode(bool b);
|
|
|
|
|
|
public:
|
|
|
|
|
|
//virtual void setAnalRun(iAnalRun* p, bool bFuzzyPit = false);
|
|
|
virtual void setAnalRun(iAnalRun* pAnalRun, bool bFuzzyPit = false);
|
|
|
|
|
|
// 从各个Wx(m_vecWxDatas)中遍历查找
|
|
|
bool setParaValue(QString sPara, double d);
|
|
|
bool getParaValue(QString sPara, double& d);
|
|
|
// 返回所有参数,Key为英文ID
|
|
|
virtual bool getAllParaValues(QMap<QString, double>& map,
|
|
|
bool bOnlyFitted);
|
|
|
//返回所有的模型参数
|
|
|
virtual bool getAllParaValuesUnit(QMap<QString, QString>& map,
|
|
|
bool bOnlyFitted);
|
|
|
|
|
|
//返回所有的跟模型相关的参数(参与拟合的参数)
|
|
|
virtual bool getFitParaAbouts(QMap<QString, double>& mapValues, \
|
|
|
QMap<QString, QString>& mapUnits);
|
|
|
bool getFitParaValues(QMap<QString, double>& map);
|
|
|
bool getFitParaUnits(QMap<QString, QString>& map);
|
|
|
|
|
|
// 返回所有的跟模型相关的边界参数的类型,不渗透或定压
|
|
|
// 不渗透:0
|
|
|
// 定压:1
|
|
|
bool getBdyInfos(QMap<QString, int>& map);
|
|
|
|
|
|
// 返回当前模型相关的参数,包括ModelOption、以及井型等信息
|
|
|
iModelOption* getModelOption();
|
|
|
// 构建算法载体
|
|
|
virtual bool buildAlgModel(iModelOption* pModelOption, \
|
|
|
bool bReset = true, \
|
|
|
bool bSetParas = true);
|
|
|
// 具体的创建算法载体
|
|
|
virtual void createAlgModel(ModelSeriesType o, AlgModelSrc ams, \
|
|
|
iModelOption* pModelOption);
|
|
|
|
|
|
// 返回所有窗体的指针
|
|
|
QVector<iWxBase*>* getAllWxPtr();
|
|
|
|
|
|
// 根据多相单相对右侧参数进行调整
|
|
|
void adjustParaUIsBy(bool bMultiPhase);
|
|
|
|
|
|
// 配置算法载体
|
|
|
bool configAlgModel();
|
|
|
|
|
|
protected:
|
|
|
|
|
|
// 重新调整工具栏
|
|
|
virtual void reAdjustToolbar(QToolBar*);
|
|
|
|
|
|
// 显示Anal的信息
|
|
|
virtual void showAnalInfoInput(AnalStepOption o);
|
|
|
|
|
|
// 根据流体类型刷新 流体对话框
|
|
|
void changeFluidOption();
|
|
|
|
|
|
// 算法类关联信号
|
|
|
virtual void buildAlgSignals();
|
|
|
|
|
|
// 是否正确支持的模型
|
|
|
virtual bool isModelSupported(iModelOption* p);
|
|
|
|
|
|
public slots:
|
|
|
|
|
|
// 对应流动段参数改变,如移动水平线,刷新结果视图
|
|
|
virtual void slotSegmentParamsChanged(ZxSegmentInfo& o);
|
|
|
|
|
|
// 常规拟合线程结束
|
|
|
virtual void slotCommonFitThreadFinished();
|
|
|
|
|
|
// 基础参数对话框流体类型发生改变
|
|
|
virtual void slotFluidTypeChanged(QString s);
|
|
|
// 左侧模型参数发生改变
|
|
|
virtual void slotOptionParasChanged(iModelOption* pOption);
|
|
|
|
|
|
// 返回流量
|
|
|
virtual void slotGetNqAll(double& d);
|
|
|
|
|
|
public: //20250211 为外部(如数值试井)增加接口
|
|
|
|
|
|
/// @brief 允许外部(比如数值试井)对当前子窗口Plot进行曲线添加/更改
|
|
|
/// @param o 具体哪一个,此处应该为 FSRT_DoubleLog、FSRT_SemiLog、FSRT_Hist 三者之一
|
|
|
/// @param vecDescs 具体曲线,定义参见iCurveDesc
|
|
|
/// @param bOverwrite 如果已有,是否覆盖
|
|
|
/// @param ptrError 错误描述之指针
|
|
|
/// @note 曲线名称,请参见 mAlgDefines.h文件中的定义进行,比如 s_Souce_Curve ,不能随便填写
|
|
|
virtual bool adjustFitSubPlotBy(FitSubRstTag o, \
|
|
|
QVector<iCurveDesc>& vecDescs, \
|
|
|
bool bOverwrite = true,
|
|
|
QString* ptrError = nullptr);
|
|
|
|
|
|
/// @brief 允许外部(比如数值试井)对当前结果子窗口进行填写
|
|
|
/// @param o 具体哪一个,此处通常 应该为 FSRT_NmRst
|
|
|
/// @param vecResults 具体结果,定义参见iResultInfo
|
|
|
/// @param bOverwrite 如果已有,是否覆盖
|
|
|
/// @param ptrError 错误描述之指针
|
|
|
/// @note 具体调用时,请与wzg协商
|
|
|
virtual bool adjustFitSubRstBy(FitSubRstTag o, \
|
|
|
QVector<iResultInfo>& vecResults, \
|
|
|
bool bOverwrite = true,
|
|
|
QString* ptrError = nullptr);
|
|
|
|
|
|
/// @brief 获取当前分析SunbWnd的子窗口
|
|
|
/// @param o 具体哪一个
|
|
|
/// @param bCreateIfNotExists 如果不存在,是否强制创建,为true 创建/否则不创建
|
|
|
/// @param ptrError 错误描述之指针
|
|
|
/// @note 具体返回的窗体实体类型,请参见FitSubRstTag定义中的说明
|
|
|
virtual QWidget* getFitSubRstWxOf(FitSubRstTag o, \
|
|
|
bool bCreateIfNotExists = false,
|
|
|
QString* ptrError = nullptr);
|
|
|
|
|
|
public:
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////////
|
|
|
// 如下接口只是,为了方便获取 m_vecWxDatas 即各个分析对话框的数据信息
|
|
|
// 注意:iAnalRun也有一套几乎完全类似的接口,但二者针对的对象不同,各自的分析对话框窗体
|
|
|
// 当然调用者也可以不采取这些接口,而直接对m_vecWxDatas进行操作
|
|
|
|
|
|
/// @brief 获取 基础页面中,测试类型,如:标准、干扰、小型压裂、多层
|
|
|
QString getBasicTestType();
|
|
|
/// @brief 获取 基础页面中,测试类型 对应的枚举变量
|
|
|
PvtTestType getBasicTestTypeEx();
|
|
|
|
|
|
/// @brief 获取 基础页面中,是否单相
|
|
|
bool isBasicPhaseS();
|
|
|
|
|
|
/// @brief 获取 基础页面中,相态选项,注意返回结果是组合形式,需要根据定义自行解析
|
|
|
PvtFluidType getBasicPft();
|
|
|
|
|
|
/// @brief 获取 基础页面中,相态选项,中文描述,其实就是下拉框显示的内容
|
|
|
QString getBasicPftDesc();
|
|
|
|
|
|
/// @brief 获取 基础页面中,主相,中文描述,即:油气水之一
|
|
|
/// @note 该函数仅仅为了兼容原先,比如,右键弹窗,根据油气水,筛选AnalRun
|
|
|
QString getBasicMainPft();
|
|
|
|
|
|
/// @brief 获取 基础页面中,某个参数的具体数值
|
|
|
/// @param sPara,参数,英文标识而且大小写敏感
|
|
|
/// @param d,返回的结果
|
|
|
/// @note 参数举例:"rw"/"wellDis"/"h"/"phi"/"Ct"/"Pi"
|
|
|
/// 对于多层,则以第一行数据为主
|
|
|
bool getBasicParaOf(QString sPara, double& d);
|
|
|
|
|
|
/// @brief 获取 基础页面中,储层参数表格中指定行数据
|
|
|
/// @param vvec,结果缓存
|
|
|
/// @param bOnlyChecked,为true,则返回勾选的行,否则,所有行数据
|
|
|
bool getBasicDataLayers(VVecVariant& vvec, bool bOnlyChecked = false);
|
|
|
|
|
|
/// @brief 获取 Pvt页面中,油气水项,某个参数的计算结果
|
|
|
/// @param pft,油气水,请根据需要传入 WFT_Oil 或 WFT_Gas 或 WFT_Water
|
|
|
/// @param sPara,参数,英文标识而且大小写敏感,如"Pb"/"Rs"/"Co"等
|
|
|
/// @param vecX,返回之x列,通常是压力或温度参数
|
|
|
/// @param vecY,返回之y列,即sPara对应的参数数值列,与vecX一一对应
|
|
|
/// @param ptrPtResult,结果选用的点(即PVT曲线上方块点)
|
|
|
/// @param ptrPtReferPb,对应的pb相应的参考点
|
|
|
/// @note vecY是物性参数计算结果列
|
|
|
/// vecX则比较特殊,可能是压力数值,也可能是温度数值,目前
|
|
|
/// 目前,泡点压力Pb、水黏度Miuw 为温度,其它为压力
|
|
|
bool getPvtRstOf(PvtFluidType pft, QString sPara, \
|
|
|
VecDouble& vecX, VecDouble& vecY, \
|
|
|
QPointF* ptrPtResult = nullptr, \
|
|
|
QPointF* ptrPtReferPb = nullptr);
|
|
|
|
|
|
/// @brief 获取 Pvt页面中,参数的值,比如Zg、Bg等,即选用的参数数值
|
|
|
/// @param listParas,参数列表,通常以英文标识为准
|
|
|
/// @param map 返回结果
|
|
|
/// @note 这些参数值通常存于Pvt:Header之中
|
|
|
bool getPvtParaValues(QStringList listParas, QMap<QString, double>& map);
|
|
|
|
|
|
/// @brief 获取 Diffusion页面中,某个参数的具体数值
|
|
|
/// @param dso,参数,代表是相渗还是压敏还是吸附
|
|
|
/// @param sPara,参数,英文标识而且大小写敏感
|
|
|
/// @param d,返回的结果
|
|
|
/// @note 主要是左侧属性页上的各项的数据,参照xml定义进行读取
|
|
|
bool getDiffusionParaOf(DiffusionSubOption dso, QString sPara, double& d);
|
|
|
|
|
|
/// @brief 获取 Diffusion页面中,计算结果,基本上就是右侧对应表格的数据
|
|
|
/// @param dso,参数,代表是相渗还是压敏还是吸附
|
|
|
/// @param vvec,返回数据,即计算结果,与右侧表格对应
|
|
|
bool getDiffusionRstOf(DiffusionSubOption dso, VVecDouble& vvec);
|
|
|
|
|
|
/// @brief 获取 拟压力页面中,拟压力结果表
|
|
|
/// @param vvec,返回数据,长度为4,分别为压力P/拟压力Ps/偏差因子Zg/黏度Miug
|
|
|
/// 压力,单位 Mpa
|
|
|
/// 拟压力,单位 Pa/sec
|
|
|
/// 偏差因子,单位 Pa/sec
|
|
|
/// 黏度,单位 Pa/sec
|
|
|
bool getPseuRstOf(VVecDouble& vvec);
|
|
|
|
|
|
public:
|
|
|
|
|
|
// 线程管理,被MainFrmWindow调用
|
|
|
// 当前窗体内部的线程,如Fitting里面的算法线程
|
|
|
// 增加参数QThread* p的目的为了后续扩展多个线程管理使用
|
|
|
virtual bool pauseSubThread(zxAlgThread* p = nullptr);
|
|
|
virtual bool continueSubThread(zxAlgThread* p = nullptr);
|
|
|
virtual bool quitSubThread(zxAlgThread* p = nullptr);
|
|
|
virtual zxAlgThread* getSubThread(zxAlgThread* p);
|
|
|
|
|
|
signals:
|
|
|
|
|
|
/// @brief 触发信号,获取当前的井位图井点信息
|
|
|
/// @return vecWms.count()>1时有效
|
|
|
/// @note 仅仅返回正确有效的井点,其中中心井默认放在第一个
|
|
|
/// 如果vecWms.count()<=1,则认为不考虑井位图
|
|
|
void sigGetWmInfos(QVector<ZxObjWmPoint*>& vecWms);
|
|
|
|
|
|
|
|
|
/// @brief 触发信号,获取当前的干扰井井点信息
|
|
|
/// @return vecWms.count()>1时有效
|
|
|
/// @note 仅仅返回正确有效的井点,其中中心井默认放在第一个
|
|
|
/// 如果vecWms.count()<=1,则认为不考虑井位图
|
|
|
void sigGetInfInfos(QVector<ZxObjInfPoint*>& vecWms);
|
|
|
|
|
|
protected:
|
|
|
|
|
|
// 分别为 Basic、Fluid、(GasConst)、PF、ModelOption、ModelParameter;
|
|
|
//QVector<iWxBase*> m_vecWxDatas;
|
|
|
// 分别为 Basic、Pvt、Diff、Pseu、ModelOption、ModelParameter;
|
|
|
QVector<iWxBase*> m_vecWxDatas;
|
|
|
|
|
|
// 输入参数部分,为了统一,此处用Wizard把iWxBase包裹
|
|
|
// 每个WiZard包括四个,但是只显示一个
|
|
|
QVector<iWxAnalWizard*> m_vecWxAnalWizards;
|
|
|
|
|
|
// 常规拟合算法类
|
|
|
// 由于Fitting和AnalDn都用到,故放在该类
|
|
|
iAlgModelBase* m_pAlgModel;
|
|
|
iParaManager* m_pParaManager;
|
|
|
|
|
|
// 是否序列化,由子类确定
|
|
|
QPointF m_ptFlowFirst;
|
|
|
|
|
|
#ifdef QT_DEBUG
|
|
|
bool m_bXcmBrother;
|
|
|
#endif
|
|
|
|
|
|
};
|