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/iWxModelOption.h

331 lines
12 KiB
C

#pragma once
#include "iWxBase.h"
#include "mGuiJob_global.h"
class ZxPlot;
class iWxModelSketch;
class iModelOption;
class iWxModelTipAssist;
class iModelInfoBase;
#ifdef _SCAN_OLD_CODES_
class iGridLineUtils;
#endif
class iModelDesc;
class tLayerDesc;
class ZxSplitterWx;
namespace Ui {
class iWxModelOption;
}
class M_GUI_JOB_EXPORT iWxModelOption : public iWxBase
{
Q_OBJECT
public:
enum ListWxItemType
{
LWIT_Group = 0, //这是分组Group比如直井、压裂直井等xml中配置为-1用于井型ListWx
LWIT_Separator = 1, //这是内部分割线通常项比较多的时候添加分割线xml中配置为-99
LWIT_Item_Todo = 2, //实际的ListWxItem项但是还没做完待完善TODOxml中配置有”TODO"
LWIT_Item_Enable = 3, //实际的ListWxItem项可以正常用
LWIT_Item_Unable = 4, //实际的ListWxItem项但因为模型不支持不能用
LWIT_Unknown
};
explicit iWxModelOption(QWidget *parent = 0);
~iWxModelOption();
// 初始化
virtual void initUI();
// 根据测试类型更改UI(比如多层、干扰等)
virtual void adjustUiByTestType(PvtTestType ptt);
virtual void hideAllUseOptions();
// 切换模型时刷新
virtual void refreshBrothers(bool bfreshSS = true);
virtual void refreshBrothers_SS();
// 组织结果数据,注vec不进行clear由调用方自行clear
virtual bool organizeResults(QVector<iResultInfo>& vec, QString sType);
// 返回所有参数Key为英文ID
virtual bool getAllParaValues(QMap<QString, double>& map,
bool bOnlyFitted = false,
bool bClearMap = true);
// 返回当前选中的
iModelOption* getOption();
// 示意图绘图(多幅,弹出对话框)
virtual void showSketchCharts();
/// @brief FitModel之后改变一些状态
void dealwithFitOption(iModelOption* p);
/// @brief 具体改变相的状态
/// @param pListWx QListWidget
/// @param sItem ID这是XML配置ID非ExtID
/// @param bSelectOnly 是否唯一选
void freshListWxCurrentItemTo(QListWidget* pListWx, QString sID, \
bool bSelectOnly = true);
#ifdef _SCAN_OLD_CODES_
void changeRowLineItem(iGridLineUtils* pLineUtils, \
QString sItem, QString sKey, \
bool bSelectOnly = true);
#endif
// 得到聚合物中启动低渗的按钮状态
bool getCbxStatePF();
protected:
// 新的listwidget展示模式
virtual void initNovelListWxs();
virtual void initSplitterWx();
virtual QWidget* initNovelListWxOf(QString sType, QListWidget*& pListWx);
virtual void fillNovelListWxOf(QListWidget* pListWx, QString sType);
virtual void adjustSplitterWx();
void initFromLasts();
#ifdef _SCAN_OLD_CODES_
void initUI_TopSpecial(QVBoxLayout*& pLayout); //该函数暂时不启用,后续可能需要重启
void initUI_ModelListWxs();
void initUI_ModelGridLines(QVector<iModelInfoBase*>& vec, \
QVBoxLayout* pLayout, \
QString sType = "");
QVector<iModelInfoBase*> classifyModelInfos(QVector<iModelInfoBase*>& vec, \
QString sType);
#endif
// 根据ini配置获取当前支持的模型序列
virtual bool _checkPossibleModelSeries(bool& bFilter, QStringList& listFilteredSeries);
// 判断当前Model是否需要考虑
virtual bool _isModelItemConsidered(iModelInfoBase* p, \
QString sType, \
const bool bFilter, \
const QStringList listFilteredSeries, \
int nIndex);
//考虑到Well也要做筛选这里单独写一个函数
virtual void fillWelListWx(QListWidget* pListWx, QString sType);
//由于WEl决定Res选项
virtual void fillResListWx(QListWidget* pListWx, QString sType);
// 填充List
virtual void fillListWx(QListWidget* pListWx, QString sType);
// 重新填充
virtual bool refreshListWxRes(); //重新填充储层Res
virtual bool refreshListWxWbs(); //刷新井储Wbs
virtual bool refreshListWxBdy(); //刷新边界Bdy
virtual bool _refreshListWxWbsOrBdy(QString sType); //刷新
/// @brief 根据当前的井型+储层,获取支持的井储类型或者边界类型
/// @param sType 井储或边界标识
/// @param listItemAlias 支持的井储或边界是中文Alias因为不会重复所以没用ID
/// @param bAdsorptionMode 是否吸附模式(统一情况下,吸附与非吸附分别对应西安和北京,二者的边界类型不太一致)
/// @note 内部自行获取当前的井型+储层类型
virtual bool _checkEnabledWbsOrBdyItems(QString sType, QStringList& listItemAlias, bool bAdsorptionMode);
/// @brief 根据当前的井型+储层获取iModelDesc
/// @param bAdsorptionMode 是否吸附模式(统一情况下,吸附与非吸附分别对应西安和北京,二者的边界类型不太一致)
/// @note 内部自行获取当前的井型+储层类型
virtual iModelDesc* _getCurModelDesc(bool bAdsorptionMode);
//////////////////////////////////////////////////////////
// 需要考虑看看能否统一通过配置来处理
// 四种ListWx的Item改变具体做什么
virtual void onWelItemChanged();
virtual void onResItemChanged(iModelDesc *pModelDesc);
virtual void onBdyItemChanged(iModelDesc* pModelDesc);
virtual void onWbsItemChanged();
// 模型切换后,对于吸附是否勾选的处理(控制到储层类型一级)
// 注意,该函数只是权宜之计,具体参见 iModelDesc 中说明
void freshUseOptionAS(iModelDesc* pModelDesc, bool bInit);
// 模型切换后,对于启动压力梯度是否勾选的处理(控制到储层类型一级)
// 注意,该函数只是权宜之计,具体参见 iModelDesc 中说明
void freshUseOptionPG(iModelDesc* pModelDesc, bool bInit);
// 模型切换后,对于小信号是否勾选的处理(控制到边界一级)
void freshUseOptionSS(iModelDesc* pModelDesc, bool bInit);
void _freshUseOptionOf(QCheckBox* pCbx, bool bInit, bool bEnable);
//////////////////////////////////////////////////////////
// 界面数据到Option载体
virtual void freshUi2Option();
void _freshUiListWx2Option(QListWidget* pListWx, QString sKey);
void _freshUiCheckBox2Option(QCheckBox* pCbx, QString sKey);
// 最近选用
void freshUiByOpenRecents();
void fillRecentModels();
// sModels形式
// QString sModel = QString("%1+%2+%3+%4:%5+%6+%7+%8").arg(pOption->getTagWbs())
// .arg(pOption->getTagWel())
// .arg(pOption->getTagRes())
// .arg(pOption->getTagBdy())
// .arg((int)pOption->m_oWbsType)
// .arg((int)pOption->m_oWelType)
// .arg((int)pOption->m_oResType)
// .arg((int)pOption->m_oBdyType);
void refreshRecentModels(QString sModels);
public:
// s 的格式:井储+井型+储层+边界(注意是一堆Code/ID
void freshModelDesc2ListWxs(QString sModelCodes, bool bFreshBrothers = true);
public:
// 序列化
virtual void onSerialize(ZxSerializer* ser);
virtual void onDeserialize(ZxSerializer* ser);
protected:
// 对于序列化父类的QListWidget处理已经不能满足要求故重载该函数
virtual bool _writeCtrl(ZxSerializer* ser, QWidget* p, QString& sTag);
virtual bool _readCtrl(ZxSerializer* ser, QWidget*& p, QString& sTag);
// 反序列化时进行精准遍历
int _fuzzyRealIndexOfListWx(QListWidget* pWx, QString sWhatThis, QString sText, int nCurRow);
// 对旧版本的临时处理从读取到的VecString遍历得到新的配置的编码WhatThis
bool _getItemCode4OldVersion(const VecString& vecOldSaveds, QString& sWhatThis);
protected:
virtual void paintEvent(QPaintEvent *);
virtual bool eventFilter(QObject *obj, QEvent *event);
protected:
// 查找组下面的项(如果有)(井型+储层类型)
virtual bool findChildItemsOf(QListWidget* pListWx, \
QListWidgetItem* pItem, \
QVector<QListWidgetItem*>& vecChildItems, \
bool* ptrIsHidden = nullptr);
void initContextMenu(QListWidget* pListWx, \
QListWidgetItem* pItem, \
bool bHidden);
/// @brief 绑定并切换Item状态
/// @param pItem
/// @param pModelInfo 关联的XML节点对象
/// @param oType 状态模式类型如果为Unknown则自动从pModelInfo获取
void bindAndChangeItemBy(QListWidgetItem* pItem, iModelInfoBase* pModelInfo, \
ListWxItemType oType = LWIT_Unknown);
/// @brief 切换Item状态的具体实现
void _changeItemStateTo(QListWidgetItem* pItem, ListWxItemType oType);
// 折叠/展开
void expandOrCollapse(bool bExpand);
void expandOrCollapseAll(bool bExpand);
// 隐藏Tip助手框
void hideWxAssist();
QListWidget* getListWxByType(QString sType);
QString getTypeByListWx(QListWidget* pListWx);
protected slots:
// 模型选择
virtual void slotModelOptionChanged(QString);
// 各复选框选项的状态设定
void slotUseOptionCbxChanged();
// 双击(井型+储层类型)
virtual void slotListWxItemDoubleClicked(QListWidgetItem* pItem);
//virtual void slotListWxItemClicked(QListWidgetItem* pItem);
// 鼠标移动至
virtual void slotListWxItemEntered(QListWidgetItem* pItem);
virtual void slotListWxLeaveAllItems();
virtual void slotCheckAndHideWxToolTips();
virtual void slotHideWxAssist();
// 右键(井型+储层类型)
virtual void slotListWxCustomMenu(const QPoint& pos);
// 右键菜单
virtual void slotExpandGroup();
virtual void slotCollapseGroup();
virtual void slotExpandGroupAll();
virtual void slotCollapseGroupAll();
// 最近选用
void on_listWxRecents_doubleClicked(const QModelIndex &index);
void on_cbxOpenRecents_clicked();
void on_sbRecentCounts_valueChanged(int arg1);
// ToolTips辅助助手开关
void on_btnAssist_clicked();
signals:
// 模型切换信号
void sigParasChangedEx(iModelOption* );
// 增加这个信号主要增加小信号的选择模式(目前小信号只比普通模式多一条线,增加信号,保证绘制时候出现)
void sigCbxStateSsChanged(bool bSsChecked);
#ifdef _SCAN_OLD_CODES_
// 聚合物PF
void sigCbxStatePfChanged(bool bCheck);
#endif
/// @brief 触发消息,获取具体的多层信息
void sigGetMultiLayerOptions(bool&, QVector<tLayerDesc*>*);
protected:
Ui::iWxModelOption *ui;
QListWidget* m_pListWxWel;
QListWidget* m_pListWxRes;
QListWidget* m_pListWxWbs;
QListWidget* m_pListWxBdy;
// 选择内容的载体
iModelOption* m_pOption;
// ListWidget Ctrls / CheckBox
QMap<QString, QWidget*> m_mapSubWxs;
// 示意图
iWxModelSketch* m_pWxSketch;
// iWxModelSketch* m_pWxTheory; //二者用的同一个窗体,暂未启用,后续考虑
// 临时变量,不涉及序列化
bool m_bRecentDbClick;
// 右键菜单
QMenu* m_pContextMenu;
// 临时,针对右键操作而设定的对象体
QListWidget* m_pTempListWx;
QListWidgetItem* m_pTempListWxItem;
ZxSplitterWx* m_pSplitterWx;
// 临时Tip助手相关
iWxModelTipAssist *m_pWxAssist;
QTimer* m_pTimerAssist;
bool m_bAssistOn;
QHBoxLayout* m_pLayoutBottom;//临时,为了产能
};