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

#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; //不涉及序列化
};