#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项,但是还没做完,待完善,TODO,xml中配置有”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& vec, QString sType); // 返回所有参数,Key为英文ID virtual bool getAllParaValues(QMap& 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& vec, \ QVBoxLayout* pLayout, \ QString sType = ""); QVector classifyModelInfos(QVector& 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& 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*); protected: Ui::iWxModelOption *ui; QListWidget* m_pListWxWel; QListWidget* m_pListWxRes; QListWidget* m_pListWxWbs; QListWidget* m_pListWxBdy; // 选择内容的载体 iModelOption* m_pOption; // ListWidget Ctrls / CheckBox QMap 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;//临时,为了产能 };