|
|
#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);
|
|
|
|
|
|
// 从各个Wx(m_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; //不涉及序列化
|
|
|
|
|
|
};
|