#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& map, bool bOnlyFitted); //返回所有的模型参数 virtual bool getAllParaValuesUnit(QMap& map, bool bOnlyFitted); //返回所有的跟模型相关的参数(参与拟合的参数) virtual bool getFitParaAbouts(QMap& mapValues, \ QMap& mapUnits); bool getFitParaValues(QMap& map); bool getFitParaUnits(QMap& map); // 返回所有的跟模型相关的边界参数的类型,不渗透或定压 // 不渗透:0 // 定压:1 bool getBdyInfos(QMap& 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* 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& 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& 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& 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& vecWms); /// @brief 触发信号,获取当前的干扰井井点信息 /// @return vecWms.count()>1时有效 /// @note 仅仅返回正确有效的井点,其中中心井默认放在第一个 /// 如果vecWms.count()<=1,则认为不考虑井位图 void sigGetInfInfos(QVector& vecWms); protected: // 分别为 Basic、Fluid、(GasConst)、PF、ModelOption、ModelParameter; //QVector m_vecWxDatas; // 分别为 Basic、Pvt、Diff、Pseu、ModelOption、ModelParameter; QVector m_vecWxDatas; // 输入参数部分,为了统一,此处用Wizard把iWxBase包裹 // 每个WiZard包括四个,但是只显示一个 QVector m_vecWxAnalWizards; // 常规拟合算法类 // 由于Fitting和AnalDn都用到,故放在该类 iAlgModelBase* m_pAlgModel; iParaManager* m_pParaManager; // 是否序列化,由子类确定 QPointF m_ptFlowFirst; #ifdef QT_DEBUG bool m_bXcmBrother; #endif };