#pragma once #include "iModelInfoBase.h" #include "iGridRowUtils.h" #include "mGuiJob_global.h" class iModelDescGroup; class tGridRowItemModel; class tGridRowGroupLayer; class iModelOption; // 多层模型,参数区统一处理的Utils class M_GUI_JOB_EXPORT tGridRowUtils : public iGridRowUtils//QAbstractScrollArea { Q_OBJECT public: explicit tGridRowUtils(bool bSimple = false, QWidget *parent = 0); ~tGridRowUtils(); /// @brief 设置初始多层信息 /// @param nLayerCount(in) 层数,至少为2 /// @param bCrossFlow(in) 是否窜流,默认不窜流 /// @param pOption(in) ModelOption对话框传递过来的Option bool setLayerInfos(int nLayerCount, bool bCrossFlow = false, \ iModelOption* pOption = nullptr); // 对外暴露接口 virtual bool buildRowUtils(QStringList listParas, \ bool bDnMode, \ QWidget* pWxDlg); protected: /// @brief 把参数根据当前选项,一拆为3 /// @param (in) listParas全部参数 /// @param (out) listOuters 放在层外的模型选项(比如井储,[串流模式下]边界) /// @param (out) listInners 层内1:层内的模型选项(比如井型、储层类型,[串流模式下]边界) /// 层内2:普通参数(比如渗透率、表皮等) /// @param (in) bCrossFlow 是否串流 bool splitParas(QStringList listParas, \ QStringList& listOuters, \ QStringList& listInners, \ bool bCrossFlow); #ifdef _SCAN_OLD_CODES_ // 创建模型选项部分(如果非窜流) bool buildRowUtils_Model(); #endif // 创建数据项(层外部分) bool buildRowUtils_LayerOuters(QStringList listParas, \ bool bDnMode); // 创建数据项(层内部分) bool buildRowUtils_LayerInners(QStringList& listInners, \ bool bDnMode); // 具体调用的内部实现函数 virtual bool _buildRowUtils(QStringList listParas, \ iGridRowItem* pItemParent, \ bool bDnMode, \ bool bProperOrder = true); protected: // 具体每一项的具体实现 virtual bool createAndAddItem(iGridRowItem* pParent, \ iParameter* p, QString sPara); virtual void connectSignalsOf(iGridRowItem* p); // 把所有Item从上到下(不考虑层级记录下来) virtual bool getAllItems(QVector& vec); //不考虑层级 virtual void bkAllItems(); public: QVector* getPtrAllItems(); protected: /// @brief 获取模型选项的具体内容(主要是下拉) /// @param pItem(in),针对操作的Item /// @param sPara(in),具体哪种模型选项 /// @param listTexts(out),下拉选项文本 /// @param listCodes(out),下拉选项Code bool getMoListsOf(tGridRowItemModel* pItem, QString sPara, \ QStringList& listTexts, QStringList& listCodes); /// @brief 获取 井型 选项的具体内容(主要是下拉) /// @param pItem(in),针对操作的Item /// @param listTexts(out),下拉选项文本 /// @param listCodes(out),下拉选项Code bool getMoListsOf_Wel(tGridRowItemModel* pItem, QStringList& listTexts, QStringList& listCodes); /// @brief 获取 储层 选项的具体内容(主要是下拉) /// @param pItem(in),针对操作的Item /// @param listTexts(out),下拉选项文本 /// @param listCodes(out),下拉选项Code bool getMoListsOf_Res(tGridRowItemModel* pItem, QStringList& listTexts, QStringList& listCodes); /// @brief 获取 边界 选项的具体内容(主要是下拉) /// @param pItem(in),针对操作的Item /// @param listTexts(out),下拉选项文本 /// @param listCodes(out),下拉选项Code bool getMoListsOf_Bdy(tGridRowItemModel* pItem, QStringList& listTexts, QStringList& listCodes); /// @brief 获取 井储 选项的具体内容(主要是下拉) /// @param pItem(in),针对操作的Item /// @param listTexts(out),下拉选项文本 /// @param listCodes(out),下拉选项Code bool getMoListsOf_Wbs(tGridRowItemModel* pItem, QStringList& listTexts, QStringList& listCodes); /// @brief 根据某个Item 获取 与之相关联的 指定类型的 Item(比如,根据 储层选项,获取 井型选项) /// @param sType(in),具体哪种类型(如 s_Key_Wel) /// @param pItem(in),基于哪个Item进行查找 /// @param bIterative(in),是否迭代遍历 /// @return 找到的item /// @note 遍历逻辑如下: /// 如果pItem非空,则查找同级别 ,找到第一个满足条件的,则返回 /// 如果同级别未能找到,则根据 bIterative 决定是否全局找(其实是从上级找) /// 如果pItem为空,bIterative无效,即全局搜索,找到第一个满足条件的,则返回 /// [Important]上述所说的同级别,指的是,同一 Layer 层之下 tGridRowItemModel* getMoBrotherItemOf(QString sType, tGridRowItemModel* pItem, bool bIterative = true); /////////////////////////////////////////////////////////////////////// // 内部实现的一些函数,参考借鉴子iWxModelOption,邹代码 // 模型组 iModelDescGroup* getModelDescGroup(QString sTag, QString sCode); // 在根据井子节点查找对应的储层模型是否存在 bool findSubModelResInfo(iModelDescGroup* pMoldeDesc, QStringList listSrcs); // 具体Model iModelInfoBase* getModelInfo(QString sTag, vecModelInfoBasesPtr* pVec); /////////////////////////////////////////////////////////////////////// /// @brief 获取模型选项的具体内容(当前的选项文本) /// @param sPara(in),具体哪种模型选项 /// @param nLayerIndex(in),当前所在的层的索引,可以为-1,表示在层外 /// @param oValue(out),当前值(对应的是文本) bool getMoTextOf(QString sPara, int nLayerIndex, \ QVariant& oValue); protected: virtual void mousePressEvent(QMouseEvent *); virtual void mouseDoubleClickEvent(QMouseEvent* e); virtual void mouseReleaseEvent(QMouseEvent *); virtual void mouseMoveEvent(QMouseEvent *); virtual void resizeEvent(QResizeEvent *); virtual void paintEvent(QPaintEvent *); public slots: virtual void slotActivateItem(iGridRowItem* p); virtual void onActiveItemChanged(iGridRowItem* p); virtual void slotValuePrevChanged(QVariant& o1, QVariant& o2); // 响应 模型选项下拉的数据改变 virtual void slotMoItemValueChanged(QString sPara, QVariant o); virtual void slotGetValueOf(QString sPara, QVariant& o, bool& bOk); // 右键 virtual void slotCustomContextMenu(const QPoint &pos); virtual void slotCopyCurrentItem(); virtual void slotCopyCurrentGroup(); virtual void slotCopyAllItems(); protected: /////////////////////////////////////////////////////////////////// // 响应 模型选项下拉的数据改变 具体事项 // 重新填写 下拉 void reFillMoResBy(tGridRowItemModel* pItemWel); void reFillMoBdyBy(tGridRowItemModel* pItemWel, tGridRowItemModel* pItemRes); // 重新布局除模型选项之外的参数部分 void freshSubItemsByWelRes(tGridRowItemModel* pItemWel, tGridRowItemModel* pItemRes); void freshSubItemsByBdy(tGridRowItemModel* pItemBdy); /// @brief 重新调整某个选项所关联的属性 /// @param(in) pItem 触发者 /// @param(in) bBdyMode 操作类型 /// @param(in) listNowsCHs 调整后应该包括的属性项(注:是中文) /// @param(in) listAllPossibleENs 需要删除的所有项(注:是英文) /// @note 这个listAllPossible比较特殊,如果为空,则默认全部删除,除了???? void _freshSubItemsBy(tGridRowItemModel* pItem, bool bBdyMode, \ QStringList& listNowsCHs, \ QStringList& listAllPossibleENs/* = QStringList()*/); /// @brief 删除父级节点下面的,非 模型选项、非ItemGroup 的节点Item /// @param(in) pItemP 父节点Item /// @param(in) pItem 触发者 /// @param(in/out) mapBackups 删除之前进行备份 /// @param(in) listAllPossibleENs 需要删除的所有项(注:是英文) /// @param(in) bIgnoreBdy 是否忽略边界下面的节点 /// @note 这个listAllPossible比较特殊,如果为空,则默认全部删除,除了???? void _removePureItemsOf(iGridRowItem* pItemP, \ tGridRowItemModel* pItem, \ QMap& mapBackups, \ QStringList& listAllPossibleENs/* = QStringList()*/, \ bool bIgnoreBdy = false); /// @brief 在pItemP节点下面重建新的Item(非 模型选项、非ItemGroup) /// @param(in) pItemP 父节点Item /// @param(in) listNowsCHs 调整后应该包括的属性项(注:是中文) /// @param(in) bIgnoreAliasP 是否忽略类型校验 /// @param(in) bRelayout 是否刷新布局 void _buildPureItemsTo(iGridRowItem* pItemP, QStringList& listNowsCHs, \ bool bIgnoreAliasP = false, \ bool bRelayout = true); /// @brief 重建新的Item(非 模型选项) /// @param(in) pItemL 层Layer节点Item /// @param(in) nBdyGroupIndex 边界索引 /// @param(in) sGroupAlias 组名称 /// @param(in) listNowsCHs 调整后应该包括的属性项(注:是中文) /// @param(in) bIgnoreAliasP 是否忽略类型校验 /// @param(in) bRelayout 是否刷新布局 void _buildNovelItemsTo(tGridRowGroupLayer* pItemL, int nBdyGroupIndex, \ QString sGroupAlias, QStringList& listNowsCHs, \ bool bIgnoreAliasP = false, \ bool bRelayout = true); /// @brief 恢复内容的Item(非 模型选项、非ItemGroup) /// @param(in) pItemP 父节点Item /// @param(in) mapBackups 删除之前进行备份 /// @param(in) listNowsCHs 调整后应该包括的属性项(注:是中文) void _restorePureItems(iGridRowItem* pItemP, \ QMap& mapBackups, \ QStringList& listNowsCHs); /// @brief 查找下面的Group节点 /// @param(in) pItemL 层Layer节点Item /// @param(in) pItem 触发者 /// @param(out) vecSubGroupItems void _findSubGroups(tGridRowGroupLayer* pItemL, \ tGridRowItemModel* pItem, \ QVector& vecSubGroupItems); /// @brief 批分 /// @param(in) listNowsCHs 调整后应该包括的属性项(注:是中文) /// @param(in) vecSubGroupItems 当前已有的Group节点 /// @param(out) mapGroupItemParas 结果 /// @param(out) mapLeftTypeParas 剩余的,无法批分的 void _splitPara2GroupItems(QStringList listNowsCHs, \ QVector& vecSubGroupItems, \ QMap& mapGroupItemParas, \ QMap& mapLeftTypeParas); /// @brief 查找Layer下面,边界组是第几个,可以为-1 /// @param(in) pItemL 层Layer节点Item int _getBdyGroupIndexOf(tGridRowGroupLayer* pItemL); /// @brief 结构改变之后的刷新及缓存等 void _finishItemsChanging(); /////////////////////////////////////////////////////////////////// signals: // void sigHelpMsg(QString& s); public: // 组织数据 // 序列化 virtual void onSerialize(ZxSerializer* ser); virtual void onDeserialize(ZxSerializer* ser); // 组织结果数据,注:vec不进行clear,由调用方自行clear virtual bool organizeResults(QVector& vec, QString sType); // 根据名字获取 virtual iGridRowItem* getItemByPara(QString sPara); // 根据名字取数据 virtual QVariant getItemValueByPara(QString sPara); // 从各个Wx(m_vecWxDatas)中遍历查找 virtual bool setParaValue(QString sPara, QVariant o); virtual bool getParaValue(QString sPara, QVariant& o); // 返回所有参数,Key为英文ID virtual bool getAllParaValues(QMap& map, bool bOnlyFitted = false, bool bClearMap = true); virtual bool getAllParaUnits(QMap& map, bool bOnlyFitted = false, bool bClearMap = true); /// @brief 收集多层相关的一些乱七八糟的信息,包括模型选项、边界类型、每条边的定压还是封闭等等。 /// @param map 收集的结果 /// @param bClearOlds 是否清空 /// @note 对于通用的,直接用标识,对于层内的添加层标识 bool collectFuzzyMLs(QMap& map, \ bool bClearOlds = false); public: // 20260107开始扩充,与层有关的内容 // 获取当前所在的父级层的标识,可能为空 virtual tGridRowGroupLayer* getUpperLayerOf(iGridRowItem* pItem); // 获取当前所在的父级层的标识,可能为空 virtual QString getUpperLayerTagOf(iGridRowItem* pItem); // 获取当前所在的父级层的Index(第几层),从0开始,如果没找到,则为-1 virtual int getUpperLayerIndexOf(iGridRowItem* pItem); // 是否层内节点(不考虑层内本身的层级) virtual bool isUpperLayerInnerOf(iGridRowItem* pItem); protected: // 是否多层模型,其实就是true,该类就是针对多层模型设计,非多层不调用本类 bool m_bMultiLayer; // 层数,至少为2 int m_nLayerCount; // 是否窜流,默认不窜流 // 窜流:模型一致、参数不一致 // 非窜流:模型不一致、参数不一致 bool m_bCrossFlow; // 不涉及序列化,只是为了检索方便,所有的模型选项Item QVector m_vecMoItems; iModelOption* m_pOption; //不涉及序列化 };