#pragma once #include "iWxPvtBase.h" #include "mAlgDefines.h" #include "mToolPvt_global.h" class iWxToolBar; class iRibbonXmlCmd; class iRibbonXmlTab; class TreeWxConfig; class iAlgPseuMethodTriInfo; class iAlgPseuMethodCompInfo; class iWxPvtUtilItemPseudo; class M_TOOL_PVT_EXPORT iWxPvtMain : public iWxPvtBase { Q_OBJECT public: iWxPvtMain(QWidget* parent = 0); ~iWxPvtMain(); /// @brief 设置PVT流体相态 /// @param listPhases所有相,英文标识 /// @param sBasePhase基准相/主相,英文标识 /// @note:规定:如果传入sBasePhase基准相/主相,则默认为解析,否则认为是数值 void setPhaseInfos(QStringList listPhases, \ QString sBasePhase = QString()); // 是否向导模式 void setWizardMode(bool b); // 初始化 virtual void initUI(); virtual bool savePvt(); virtual bool loadPvt(); // 文件标识 virtual QString getFilePvtTag(); // 新增接口(与一个数据对象体进行绑定式关联) virtual bool saveAsDataObj(ZxDataObject*& pDataObj); virtual bool loadFromDataObj(ZxDataObject*& pDataObj); /// @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相应的参考点 bool getPvtParaRstOf(PvtFluidType pft, QString sPara, \ VecDouble& vecX, VecDouble& vecY, \ QPointF* ptrPtResult = nullptr, \ QPointF* ptrPtReferPb = nullptr); /// @brief 获取 Pvt页面中,参数的值,比如Zg、Bg等,即选用的参数数值 /// @param listParas,参数列表,通常以英文标识为准 /// @param map 返回结果 /// @note 这些参数值通常存于Header之中 bool getPvtParaValues(QStringList listParas, QMap& map); /// @brief 根据 Pvt页面中,各自的算法,进行重新计算(目前暂时用于CO2模块之中) /// @param sPara,参数,通常以英文标识为准 /// @param mapInputs 该算法涉及的输入参数 /// @param dOut 计算结果 bool calPvtRstOf(QString sPara, QMap& mapInputs, double& dOut); // 返回所有参数,Key为英文ID virtual bool getAllParaValues(QMap& map, bool bOnlyFitted = false, bool bClearMap = true); virtual bool getAllParaValuesUnit(QMap& map, bool bOnlyFitted = false, bool bClearMap = true); // 组织结果数据,注:vec不进行clear,由调用方自行clear virtual bool organizeResults(QVector& vec, QString sType); // 返回名称标识 virtual QString getAwiName(); public: // 类似clone virtual void copyFrom(ZxUiBase* p); private: // void init(); // // 初始化 void initUI_MainLayout(); void initUI_Tops(); void initUI_StackedWx(); void initUI_Bottoms(); // 具体的内容填充 void initStatckedWxs(); void makesureSubWxOf(QString sName); iWxPvtBase* createSubHeader(); //Header iWxPvtBase* createSubOGW(QString sName); //油气水 // 20241122移除拟压力部分,但暂时为了解析试井正常运行,暂时保留了一个常规的拟压力计算 iWxPvtBase* createSubPseuP(); //常规拟压力 void calAndFreshPseu(bool bCreateIfFirst = true); // 该Action是否必须执行 bool isActionMust(QString sAction, bool bApplyMode); // 刷新 void refresh(); // void runAction(QString sAction); void refreshActionStates(PvtFluidType pft = WFT_Unknown); bool isActionEnable(QString sAction, PvtFluidType pft); void changeRibbonItemState(QWidget* pWxItem, bool bEnable); void refreshCurrentSubWx(PvtFluidType pft = WFT_Unknown); // 是否解析模式 bool isAnalMode(); // 是否包含相态 bool isPhaseIncluded(QString sPhase); // 收集当前条件下所有的结果参数 bool sumAllParaValues(QMap& map); protected: virtual void paintEvent(QPaintEvent*); virtual void resizeEvent(QResizeEvent*); virtual void onSerialize(ZxSerializer* ser); virtual void onDeserialize(ZxSerializer* ser); public: // 在导航模式下,点击下一步时,先判断本步是否正确 //virtual bool verifyCurInfos(QString& sLog); // 在导航模式下,点击下一步时,先判断本步是否正确 virtual bool checkCurWxInputs(); // 在每次设定时,从上一步获取数值,并且刷新至本窗体 virtual bool getAndFreshByPrevWx(); public slots: // 与sigPrevWxValueOf对应 virtual void slotValueToNextWx(QStringList& listParas, QMap& map); signals: void sigPvtResultsChanged(QMap& map); void sigPseudoResults(VVecDouble& vvec); void sigPseudoResults3(const VVecDouble&, const QMap&, const QMap&); void sigPseudoResultsC(const VVecDouble&, const QMap&, const QMap&); private slots: void slotBtnTriggered(); void slotBtnHelp(); void slotBtnApply(); void slotBtnOK(); void slotBtnCancel(); // 某项参数计算结果数据更改 void slotParaRstDataChanged(QString sPara); void slotActionByRibbon(QWidget* pCtrl, iRibbonXmlCmd* pInfo, QVariant o); void slotRibbonTabActivated(iRibbonXmlTab* pTab); /// @brief 响应:当Heade中流体选项发生改变时 /// @param nMain 大类,常规/特殊/状态方程 /// @param vecSubs 子类,油/气/水/凝析 // void slotHeaderOptionFluidChanged(int nMain, VecInt& vecSubs); // 当前面窗体参数改变时,本窗体响应 virtual void slotParasObtained(QMap& map); // 返回某个参数的PVT数据(比如Zg) // vvec为两列 // vvec[0]: p1 Zg1 // vvec[1]: p2 Zg2 // vvec[2]: p3 Zg3virtual void slotGetPvtDataOf(QString sPara,VVecVariant& vvec); // 返回所有的参数数据 void slotGetAllParaValues(QMap& map); private: // 规定:如果m_sBasePhase非空,则默认为解析,否则认为是数值 // 对于解析:区分是否主相 QString m_sBasePhase; // 对于解析:包括哪些相 // 对于数值:包括哪些相 QStringList m_listPhases; // Ribbon iWxToolBar* m_pWxToolBar; // 子窗体,与Cmd的ID一一对应 QMap m_mapSubWxs; // 布局相关 QVBoxLayout* m_pMainLayout; QStackedWidget* m_pStackedWx; // 是否向导模式 bool m_bWizardMode; };