You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/mGui/mGuiJob/SubMLs/tGridRowUtils.h

339 lines
14 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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<iGridRowItem*>& vec); //不考虑层级
virtual void bkAllItems();
public:
QVector<iGridRowItem*>* 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<QString, QVariant>& 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<QString, QVariant>& mapBackups, \
QStringList& listNowsCHs);
/// @brief 查找下面的Group节点
/// @param(in) pItemL 层Layer节点Item
/// @param(in) pItem 触发者
/// @param(out) vecSubGroupItems
void _findSubGroups(tGridRowGroupLayer* pItemL, \
tGridRowItemModel* pItem, \
QVector<iGridRowItem*>& vecSubGroupItems);
/// @brief 批分
/// @param(in) listNowsCHs 调整后应该包括的属性项(注:是中文)
/// @param(in) vecSubGroupItems 当前已有的Group节点
/// @param(out) mapGroupItemParas 结果
/// @param(out) mapLeftTypeParas 剩余的,无法批分的
void _splitPara2GroupItems(QStringList listNowsCHs, \
QVector<iGridRowItem*>& vecSubGroupItems, \
QMap<iGridRowItem*, QStringList>& mapGroupItemParas, \
QMap<QString, QStringList>& 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<iResultInfo>& vec, QString sType);
// 根据名字获取
virtual iGridRowItem* getItemByPara(QString sPara);
// 根据名字取数据
virtual QVariant getItemValueByPara(QString sPara);
// 从各个Wxm_vecWxDatas中遍历查找
virtual bool setParaValue(QString sPara, QVariant o);
virtual bool getParaValue(QString sPara, QVariant& o);
// 返回所有参数Key为英文ID
virtual bool getAllParaValues(QMap<QString, QVariant>& map,
bool bOnlyFitted = false,
bool bClearMap = true);
virtual bool getAllParaUnits(QMap<QString, QString>& map,
bool bOnlyFitted = false,
bool bClearMap = true);
/// @brief 收集多层相关的一些乱七八糟的信息,包括模型选项、边界类型、每条边的定压还是封闭等等。
/// @param map 收集的结果
/// @param bClearOlds 是否清空
/// @note 对于通用的,直接用标识,对于层内的添加层标识
bool collectFuzzyMLs(QMap<QString, QVariant>& 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<tGridRowItemModel*> m_vecMoItems;
iModelOption* m_pOption; //不涉及序列化
};