diff --git a/Include/iAlg/iAlgMath/zxBessel.h b/Include/iAlg/iAlgMath/zxBessel.h index bbb5113..adf848f 100644 --- a/Include/iAlg/iAlgMath/zxBessel.h +++ b/Include/iAlg/iAlgMath/zxBessel.h @@ -14,12 +14,21 @@ public: public: // 202604 由殷维基于PF需要进行贝塞尔函数扩充,不限于0和1,而是改为传递double分数 - // 在此基础上,解航提出,解析模型采用该方法,可以规避震荡问题 + // 在此基础上,解航提出,解析模型采用该方法,可以规避震荡问题(但是目前只用到novel_besselk) // 第一类修正贝塞尔函数 I_nu(z) + // 注:该函数目前只被yinw算法应用 + // 1.算法由yinw提供,后来因为震荡,经xieh针对溢出进行修改 + // 2.但后来随着yinw算法调整,调用该函数发现,xieh修改不妥 + // 只好再次倒回去 + // 幸亏xieh本身没有用到该函数 + // 后续还是需要进一步完善优化该函数的 static double novel_besseli(double nu, double z); + // 第二类修正贝塞尔函数 K_nu(z) + // 注:该函数目前被yinw算法+xieh算法中均有应用 static double novel_besselk(double nu, double z); + // 纯手工实现伽马函数 Gamma(z) static double bessel_gamma(double z); diff --git a/Include/iBase/iDefines/Macros.h b/Include/iBase/iDefines/Macros.h index 962c985..22ce4d2 100644 --- a/Include/iBase/iDefines/Macros.h +++ b/Include/iBase/iDefines/Macros.h @@ -46,6 +46,7 @@ #define xVecModelWels zxSysUtils::getInstance()->m_vecModelWels #define xVecModelRess zxSysUtils::getInstance()->m_vecModelRess #define xVecModelBdys zxSysUtils::getInstance()->m_vecModelBdys +#define xVecModelInterferes zxSysUtils::getInstance()->m_vecModelInterferes #define xVecModelGroups zxSysUtils::getInstance()->m_vecModelGroups //#define xVecParaGroups zxSysUtils::getInstance()->m_vecParaGroups //#define xVecParaGroupSps zxSysUtils::getInstance()->m_vecParaGroupSps diff --git a/Include/iBase/iPlugin/ZxComboBox.h b/Include/iBase/iPlugin/ZxComboBox.h new file mode 100644 index 0000000..46e138a --- /dev/null +++ b/Include/iBase/iPlugin/ZxComboBox.h @@ -0,0 +1,70 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "Defines.h" +#include "iPlugin_global.h" + +// 该类基于AI,主要是控件显示内容的优化 +// 默认隐藏箭头(可通过 setArrowHidden(false) 恢复),节省的空间全部留给文字显示 +// 弹出视图自动计算宽度,根据所有选项文本的最大宽度动态调整 +// 弹出位置自适应,防止在屏幕边缘被裁剪 +// 文本省略号处理,当控件宽度不足时自动显示"...",但弹出时完整显示 +// 支持动态调整:添加/删除/插入项目时自动重新计算弹出宽度 +// 屏幕适配:弹出宽度不超过屏幕的指定百分比(默认80%) +class I_PLUGIN_EXPORT ZxComboBox : public QComboBox +{ + Q_OBJECT + +public: + + explicit ZxComboBox(QWidget *parent = 0); + ~ZxComboBox(); + + // 设置是否启用动态箭头(根据文本长度自动显示/隐藏箭头) + void setDynamicArrowEnabled(bool enabled); + bool isDynamicArrowEnabled() const { return m_dynamicArrowEnabled; } + + // 设置是否自动调整弹出视图宽度(默认开启) + void setAutoAdjustPopupWidth(bool autoAdjust); + bool autoAdjustPopupWidth() const { return m_autoAdjustPopupWidth; } + + // 重载QComboBox的虚函数 + virtual void addItem(const QString &text, const QVariant &userData = QVariant()); + virtual void addItem(const QIcon &icon, const QString &text, const QVariant &userData = QVariant()); + virtual void addItems(const QStringList &texts); + virtual void insertItem(int index, const QString &text, const QVariant &userData = QVariant()); + virtual void insertItem(int index, const QIcon &icon, const QString &text, const QVariant &userData = QVariant()); + virtual void insertItems(int index, const QStringList &list); + virtual void removeItem(int index); + virtual void clear(); + +protected: + + virtual void showEvent(QShowEvent *event); + virtual void paintEvent(QPaintEvent *event); + virtual void showPopup(); + virtual void currentIndexChanged(int index); + + virtual QSize sizeHint() const; + +private: + + void updatePopupViewWidth(); + void adjustPopupPosition(); + +private: + bool m_dynamicArrowEnabled; // 是否启用动态箭头 + bool m_arrowHidden; // 当前箭头是否隐藏(实际状态) + double m_popupWidthFactor; // 弹出视图宽度因子 + bool m_autoAdjustPopupWidth; // 是否自动调整弹出宽度 + int m_maxPopupWidthPercent; // 最大宽度百分比(相对于屏幕) + int m_cachedPopupWidth; // 缓存的计算宽度 +}; diff --git a/Include/iBase/iPlugin/ZxSplitterWx.h b/Include/iBase/iPlugin/ZxSplitterWx.h index a0554a5..052145b 100644 --- a/Include/iBase/iPlugin/ZxSplitterWx.h +++ b/Include/iBase/iPlugin/ZxSplitterWx.h @@ -19,6 +19,9 @@ public: ZxSplitterWx(QWidget* parent = 0); ZxSplitterWx(int rows, int cols, QWidget* parent = 0); + /// @brief 趨ֱ϶Ƿͬ϶ĬΪtrue + void setSyncDragging(bool bSyncDragging); + /// @brief 趨ʾ /// @param policyH ˮƽ /// @param policyV ֱ @@ -43,11 +46,26 @@ public: /// @param vecVs ֱ /// @note 1WidgetȫãsetCellWidgetϺñ /// 2ijãVecIntΪռ - void setSpStrenchSizes(QList& vecHs, QList& vecVs); + void setSpStrenchSizes(const QList& vecHs, const QList& vecVs); + + /// @brief 趨ָ(ֱ)Сӣ + /// @param vecSizes + /// @note WidgetȫãsetCellWidgetϺñ + void setSpMainSizes(const QList& vecSizes); + + /// @brief 趨ָ(ֱ)Сӣ + /// @param vecSizes + /// @note WidgetȫãsetCellWidgetϺñ + void setSpSubSizes(int r, const QList& vecSizes); /// @brief ӿڣʼUI virtual void initUI(); + /// @brief ȡֱֵָ + ZxSplitter* getSpMain(); + /// @brief ȡӷָÿһеģˮƽָ + ZxSplitter* getSpSub(int r); + private: // ʼ @@ -56,6 +74,9 @@ private: // ʼָ void layoutSplitters(); + // + void setSpSizes(ZxSplitter* p, const QList& vecSizes); + public: // QSplitter Ӳ @@ -80,6 +101,7 @@ private: ZxSplitter* m_pSplitterMain; int m_nSpacing; //漰л + bool m_bSyncDragging; //ֱ϶Ƿͬ϶ĬΪtrue bool m_bUnableSP; }; diff --git a/Include/iBase/iPlugin/ZxTableHeaderView.h b/Include/iBase/iPlugin/ZxTableHeaderView.h index d4407df..383fbfb 100644 --- a/Include/iBase/iPlugin/ZxTableHeaderView.h +++ b/Include/iBase/iPlugin/ZxTableHeaderView.h @@ -4,83 +4,41 @@ #include "iPlugin_global.h" -// 此处是为了响应在ZxTableView中的表头进行下拉选择(支持多选/单选两种模式)而做的三个类。 -// 其中ZxTableHeaderView是表头,点中其某一列时,创建ZxTableHeaderViewCbx,而ZxTableHeaderViewCbx -// 内部又设置了view为ZxTableHeaderViewCbxView -// 所以ZxTableHeaderView、ZxTableHeaderViewCbx、ZxTableHeaderViewCbxView为一组 -// 该组实现了表头的Radio选择(单选)+ Check选择(多选) - -class ZxTableHeaderViewCbx; - -// 表头HeaderView +// 表头HeaderView 基类,主要为了统一,比如下拉框隐藏等等接口 class I_PLUGIN_EXPORT ZxTableHeaderView : public QHeaderView { Q_OBJECT public: - ZxTableHeaderView(const QStringList& listItems, \ - bool bMultiSelMode, - QWidget* parent = 0); - ~ZxTableHeaderView(); - - // 设置表头下拉列表取值(两个接口,分别对应多选和单选) - void setColumnItems(const QStringList& listFields, \ - const QStringList& listAlls); - void setColumnItems(const QString& sCurSel, \ - const QStringList& listAlls); + ZxTableHeaderView(QWidget* parent = 0); + ~ZxTableHeaderView(); - // 设置Titles - void changeTitles(QStringList listTitles); + // 下拉框组件控制 + virtual bool isColCbxVisible() const; + virtual void hideColCbxs(); protected: // 处理鼠标单击消息 - void mousePressEvent(QMouseEvent *e); - void mouseReleaseEvent(QMouseEvent *e); - - // 重置表头combo控件大小 - void resizeItem(int index); - - // 删除comboBox控件 - void removeCombo(); + virtual void mousePressEvent(QMouseEvent *e); + virtual void mouseReleaseEvent(QMouseEvent *e); // 重绘,此处有待完善,目前是没有版本,直接把父类搬过来了。 - void paintSection(QPainter* painter, const QRect &rect, int logicalIndex) const; + virtual void paintSection(QPainter* painter, const QRect &rect, int logicalIndex) const; + + // 重置表头combo控件大小 + virtual void resizeItem(int index); public Q_SLOTS: - // 选择改变时响应 - void slotSelChanged(const int, const QStringList); - - // 选择改变时响应 - void slotSelChanged(const int, const QString); - // 处理表头单元缩放事件 - void handleSectionResized(int index); + virtual void handleSectionResized(int index); signals: - void sigGetColumnItems(int index); - void sigSelChanged(const int, const QStringList); - void sigSelChanged(const int, const QString); - -private: - - QStringList m_listTitles; //标题 - bool m_bMultiSelMode; //是否多选模式 - - ZxTableHeaderViewCbx* m_pCbxSel; //下拉控件 - - // 当前表头索引 - int m_nCurIndex; - - // 当前选择的项 - QStringList m_listCbxCheckedItems; //多选模式 - QString m_sRadioCheckedItem; //单选模式 +protected: - // 所有项 - QStringList m_listAllItems; }; diff --git a/Include/iBase/iPlugin/ZxTableHeaderViewFilter.h b/Include/iBase/iPlugin/ZxTableHeaderViewFilter.h new file mode 100644 index 0000000..fa262af --- /dev/null +++ b/Include/iBase/iPlugin/ZxTableHeaderViewFilter.h @@ -0,0 +1,87 @@ +#pragma once + +#include "ZxTableHeaderView.h" + +#include "iPlugin_global.h" + +// 此处是为了响应在ZxTableView中的表头进行下拉选择(支持多选/单选两种模式)而做的三个类。 +// 其中ZxTableHeaderViewFilter是表头,点中其某一列时,创建ZxTableHeaderViewFilterCbx, +// 而ZxTableHeaderViewFilterCbx 内部又设置了view为ZxTableHeaderViewFilterCbxView +// 所以ZxTableHeaderViewFilter、ZxTableHeaderViewFilterCbx、ZxTableHeaderViewFilterCbxView为一组 +// 该组实现了表头的Radio选择(单选)+ Check选择(多选) + +class ZxTableHeaderViewFilterCbx; + +// 表头HeaderView +class I_PLUGIN_EXPORT ZxTableHeaderViewFilter : public ZxTableHeaderView +{ + Q_OBJECT + +public: + + ZxTableHeaderViewFilter(const QStringList& listItems, \ + bool bMultiSelMode, + QWidget* parent = 0); + ~ZxTableHeaderViewFilter(); + + // 设置表头下拉列表取值(两个接口,分别对应多选和单选) + virtual void setColumnItems(const QStringList& listFields, \ + const QStringList& listAlls); + virtual void setColumnItems(const QString& sCurSel, \ + const QStringList& listAlls); + + // 设置Titles + virtual void changeTitles(QStringList listTitles); + + virtual bool isColCbxVisible() const; + virtual void hideColCbxs(); + +protected: + + // 处理鼠标单击消息 + virtual void mousePressEvent(QMouseEvent *e); + virtual void mouseReleaseEvent(QMouseEvent *e); + + // 重置表头combo控件大小 + virtual void resizeItem(int index); + + // 删除comboBox控件 + virtual void removeCombo(); + + // 重绘,此处有待完善,目前是没有版本,直接把父类搬过来了。 + virtual void paintSection(QPainter* painter, const QRect &rect, int logicalIndex) const; + +public Q_SLOTS: + + // 选择改变时响应 + virtual void slotSelChanged(const int, const QStringList); + + // 选择改变时响应 + virtual void slotSelChanged(const int, const QString); + +signals: + + void sigGetColumnItems(int index); + void sigSelChanged(const int, const QStringList); + void sigSelChanged(const int, const QString); + +protected: + + QStringList m_listTitles; //标题 + bool m_bMultiSelMode; //是否多选模式 + + ZxTableHeaderViewFilterCbx* m_pCbxColTag; //下拉控件 + + // 当前表头索引 + int m_nCurIndex; + + // 当前选择的项 + QStringList m_listCbxCheckedItems; //多选模式 + QString m_sRadioCheckedItem; //单选模式 + + // 所有项 + QStringList m_listAllItems; +}; + + + diff --git a/Include/iBase/iPlugin/ZxTableHeaderViewFilterCbx.h b/Include/iBase/iPlugin/ZxTableHeaderViewFilterCbx.h new file mode 100644 index 0000000..11a5f31 --- /dev/null +++ b/Include/iBase/iPlugin/ZxTableHeaderViewFilterCbx.h @@ -0,0 +1,49 @@ +#pragma once + +#include + +#include "iPlugin_global.h" + +// 自定义Combobox 失去焦点是能够自动隐藏 +class I_PLUGIN_EXPORT ZxTableHeaderViewFilterCbx :public QComboBox +{ + Q_OBJECT + +public: + + explicit ZxTableHeaderViewFilterCbx(bool bMultiSelMode, QWidget *parent = 0); + ~ZxTableHeaderViewFilterCbx(); + +public: + + // hidePopup 重写隐藏下拉列表 + void hidePopup(); + + // 所在列索引 + void setColumnIndex(int nIndex); + +protected: + + // 重写失去焦点事件 + void focusOutEvent(QFocusEvent *e); + +signals: + + // 选择改变(多选) + void sigSelChanged(const int, const QStringList); + + // 选择改变(单选) + void sigSelChanged(const int, const QString); + +private: + + // 列索引 + int m_nCurIndex; + + // 是否多选模式 + bool m_bMultiSelMode; + + // 每次都发送两遍消息,奇怪 + int m_nLastSendIndex; + QString m_sLastSendText; +}; diff --git a/Include/iBase/iPlugin/ZxTableHeaderViewFilterCbxView.h b/Include/iBase/iPlugin/ZxTableHeaderViewFilterCbxView.h new file mode 100644 index 0000000..47a4483 --- /dev/null +++ b/Include/iBase/iPlugin/ZxTableHeaderViewFilterCbxView.h @@ -0,0 +1,85 @@ +#pragma once + +#include +#include +#include + +#include "iPlugin_global.h" + +// 为了QCombobox下拉列表添加QCheckBox复选框创建QListViewEx +class I_PLUGIN_EXPORT ZxTableHeaderViewFilterCbxView : public QListWidget +{ + Q_OBJECT + +public: + + ZxTableHeaderViewFilterCbxView(QWidget* parent, \ + QComboBox* pComboBox, \ + QStringList* listItemAlls); + + // 返回用户选择项的用户自定义数据(如果单选,只返回一项) + virtual bool getSelectItems(QStringList& listItems); + +protected: + + bool m_bMultiSelMode; //是否多选模式 + + // 相关的变量,主要为控制 + QComboBox* m_pComboBox; +// QStringList m_listItems; +// QList m_listChecked; +// QList m_listItemData; +// QList m_listCheckBoxes; +// bool m_bAllConsider; +// bool m_bByAll; + QMap m_mapRawStates; + + + +// QList m_listRadioButtons; + + bool m_bUnableSP; + +}; + +class I_PLUGIN_EXPORT ZxTableHeaderViewFilterCbxViewS : public ZxTableHeaderViewFilterCbxView +{ + Q_OBJECT + +public: + + ZxTableHeaderViewFilterCbxViewS(QWidget* parent, \ + QComboBox* pComboBox, \ + QStringList* listItemAlls, \ + const QString& sCurSel); + + + // 返回用户选择项的用户自定义数据(如果单选,只返回一项) + virtual bool getSelectItems(QStringList& listItems); + +protected slots: + + void slotRadioChanged(bool b); +}; + +class I_PLUGIN_EXPORT ZxTableHeaderViewFilterCbxViewM : public ZxTableHeaderViewFilterCbxView +{ + Q_OBJECT + +public: + + ZxTableHeaderViewFilterCbxViewM(QWidget* parent, \ + QComboBox* pComboBox, \ + QStringList* listItemAlls, \ + QStringList* listItemCheckeds); + + + // 返回用户选择项的用户自定义数据(如果单选,只返回一项) + virtual bool getSelectItems(QStringList& listItems); + +protected slots: + + void slotCheckBoxChanged(int state); + +protected: +}; diff --git a/Include/iBase/iPlugin/ZxTableHeaderViewUnit.h b/Include/iBase/iPlugin/ZxTableHeaderViewUnit.h new file mode 100644 index 0000000..689e882 --- /dev/null +++ b/Include/iBase/iPlugin/ZxTableHeaderViewUnit.h @@ -0,0 +1,63 @@ +#pragma once + +#include "Defines.h" +#include "ZxTableHeaderView.h" + +class iUnitGroup; +class iUnitItem; + +// 此处是为了支持单位下拉筛选表格而额外定义的类 +// +class I_PLUGIN_EXPORT ZxTableHeaderViewUnit : public ZxTableHeaderView +{ + Q_OBJECT + +public: + + ZxTableHeaderViewUnit(QWidget* parent = nullptr); + ~ZxTableHeaderViewUnit(); + + void setHeaderData(const QStringList& listTitles, \ + const QStringList& listUnits); + + virtual bool isColCbxVisible() const; + virtual void hideColCbxs(); + +signals: + + void sigCbxValueChanged(int column, \ + const iUnitItem* pSrcUnitItem, \ + const iUnitItem* pDestUnitItem); + +protected: + + virtual void paintSection(QPainter *painter, \ + const QRect &rect, \ + int logicalIndex) const; + virtual void mousePressEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent *event); + virtual bool eventFilter(QObject *obj, QEvent *event); + +private slots: + + void onComboBoxActivated(int index); + void onComboBoxLostFocus(); + void onSectionClicked(int logicalIndex); + + +private: + + QComboBox* m_pCbxColUnit; + + QStringList m_listTitles; + QStringList m_listCurUnits; + QStringList m_listBaseUnits; + + int m_nCurCol; + int m_nLastCol; + bool m_bCbxColUnitVisible; + + QMap m_mapUnitGroups; + + bool m_bUnableSP; +}; diff --git a/Include/iBase/iPlugin/ZxTableModel.h b/Include/iBase/iPlugin/ZxTableModel.h index 383ea09..221642d 100644 --- a/Include/iBase/iPlugin/ZxTableModel.h +++ b/Include/iBase/iPlugin/ZxTableModel.h @@ -4,6 +4,8 @@ #include #include +class iUnitItem; + #include "Defines.h" #include "iBase_global.h" #include "iPlugin_global.h" @@ -69,6 +71,8 @@ public: QString title(int column) const; int column(const QString &sTitle) const; + void checkFuzzyTitles(); + // 数据传递 QModelIndex index( int row, int column, const QModelIndex & parent = QModelIndex()) const; void setData(const VVecVariant &vecsData); @@ -179,6 +183,15 @@ public: void dealwithPaste(const QModelIndex &topLeft, \ const QModelIndex &bottomRight); + // 增加单位处理,v已经是Double 或float + void adjustByUnit(int col, QVariant& v, bool bBase2Show = true) const; + +public slots: + + void slotColUnitChanged(int column, \ + const iUnitItem* pSrcUnitItem, \ + const iUnitItem* pDestUnitItem); + signals: void sigDataReset(); //每次调用setData时触发 @@ -200,6 +213,12 @@ signals: void modified(); + // 由View更新标题 + void sigAdjustHeaderView(const QStringList& listTitles, \ + const QStringList& listUnits, \ + bool bUnitNeeded, \ + bool& bConsidered); + protected: void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); @@ -215,7 +234,9 @@ protected: int m_nColCount; // 标题 + QStringList m_listRawTitles; QStringList m_listTitles; + QStringList m_listUnits; // 数据 VVecVariant m_vvecData; @@ -257,4 +278,9 @@ protected: // 修改标记 bool m_bModified; + + bool m_bUnitConsidered; + + // 当前列对应的单位对 + QMap > m_mapColUnitPairs; }; diff --git a/Include/iBase/iPlugin/ZxTableView.h b/Include/iBase/iPlugin/ZxTableView.h index 6e44541..3c1858a 100644 --- a/Include/iBase/iPlugin/ZxTableView.h +++ b/Include/iBase/iPlugin/ZxTableView.h @@ -1,7 +1,10 @@ #pragma once #include + #include "Defines.h" +#include "IxSerDes.h" + #include "iBase_global.h" #include "iPlugin_global.h" @@ -9,7 +12,8 @@ class ZxTableModel; class ZxComboBoxDelegate; /// @brief The ZxTableView class 通用数据表视图对象类 -class I_PLUGIN_EXPORT ZxTableView : public QTableView +class I_PLUGIN_EXPORT ZxTableView : public QTableView, + virtual public IxSerDes { Q_OBJECT @@ -30,6 +34,8 @@ public: QAbstractItemModel* model = nullptr); virtual ~ZxTableView(); + //virtual void setUseUnitHeaderView(bool b); + virtual void setModel(QAbstractItemModel* model); // initMenu @@ -70,6 +76,13 @@ public: void restoreRowStates(bool bClearSelection = false); +public: + + // 序列化 + virtual void onSerialize(ZxSerializer* ser); + virtual void onDeserialize(ZxSerializer* ser); + virtual void copyFrom(ZxTableView* p1); + protected: //绘制纵向网格 @@ -81,10 +94,13 @@ protected: // 重载 virtual void paintEvent(QPaintEvent* event); virtual void dragEnterEvent(QDragEnterEvent* event); + virtual void dropEvent(QDropEvent* event); virtual void keyPressEvent(QKeyEvent *event); virtual void resizeEvent(QResizeEvent *event); virtual void mouseDoubleClickEvent(QMouseEvent *); + virtual void mousePressEvent(QMouseEvent *event); + virtual QModelIndex moveCursor(CursorAction cursorAction, \ Qt::KeyboardModifiers modifiers); virtual void selectionChanged(const QItemSelection &selected, \ @@ -189,7 +205,8 @@ signals: void sigSaveDatabase(); // 这是允许外界对粘贴板内容进行解析,解析为二维表格数据 - void sigParseContents(const QString& s, VVecVariant& vvec); + void sigParseContents(const QString& s, VVecVariant& vvec, \ + const int& left, const int& top); protected: diff --git a/Include/iBase/iPlugin/ZxTableViewFilter.h b/Include/iBase/iPlugin/ZxTableViewFilter.h new file mode 100644 index 0000000..f9187f1 --- /dev/null +++ b/Include/iBase/iPlugin/ZxTableViewFilter.h @@ -0,0 +1,61 @@ +#pragma once + +#include "Defines.h" +#include "ZxTableView.h" + +class ZxTableHeaderViewFilter; + +// 本类主要实现表头可以筛选的表格 +class I_PLUGIN_EXPORT ZxTableViewFilter : public ZxTableView +{ + Q_OBJECT + +public: + + explicit ZxTableViewFilter(bool bMultiSel = true, \ + QWidget* parent = 0, \ + QAbstractItemModel* model = nullptr); + virtual ~ZxTableViewFilter(); + +//private: + void initHeaderView(QStringList list, \ + ZxTableModel* pModel = nullptr); + /// @brief 取得某列不重复的数据,并且转换为QString + /// @param nCol 列索引 + /// @param bOnlyCurShow 是否仅仅获取表格当前显示内容(考虑筛选后) + QStringList getColDistinct(int nCol, bool bOnlyCurShow = true); + + VVecVariant getCurFilterData(int nIndex); + +public: + + // 序列化 + virtual void onSerialize(ZxSerializer* ser); + virtual void onDeserialize(ZxSerializer* ser); + virtual void copyFrom(ZxTableView* p1); //为了兼容旧版本,此处用ZxTableView + +public slots: + + // 表头的响应 + void slotOnGetColumnItems(int index); + void slotSelChanged(const int index, const QStringList list); + + void slotRawDataChanged(); + +signals: + + void sigGetFilterData(VVecVariant& vvec, \ + const int index, \ + const QStringList list); + +protected: + + bool m_bMultiSel; //true:多选,CheckBox + VVecVariant m_vvecDataAll; //这是当前表格的所有数据,只有当最顶层的筛选条件改变时才会更新 + QMap m_mapAllFields; + QMap m_mapFilterFields; + ZxTableHeaderViewFilter* m_pHeaderView; //false:单选,Radio + + bool m_bEnableSP; + +}; diff --git a/Include/iBase/iPlugin/ZxTableViewUnit.h b/Include/iBase/iPlugin/ZxTableViewUnit.h new file mode 100644 index 0000000..f10fefb --- /dev/null +++ b/Include/iBase/iPlugin/ZxTableViewUnit.h @@ -0,0 +1,51 @@ +#pragma once + +#include "Defines.h" +#include "ZxTableView.h" + +class ZxTableHeaderViewUnit; + +// 本类主要实现表头进行单位下拉切换的表格 +class I_PLUGIN_EXPORT ZxTableViewUnit : public ZxTableView +{ + Q_OBJECT + +public: + + explicit ZxTableViewUnit(QWidget* parent = 0, \ + QAbstractItemModel* model = nullptr, \ + bool bUnitTitleIfNeeded = true); + virtual ~ZxTableViewUnit(); + + virtual void setModel(QAbstractItemModel* model); + +public: + + // 序列化 + virtual void onSerialize(ZxSerializer* ser); + virtual void onDeserialize(ZxSerializer* ser); + virtual void copyFrom(ZxTableView* p1); //为了兼容旧版本,此处用ZxTableView + +public slots: + + // 更新标题 + virtual void slotAdjustHeaderView(const QStringList& listTitles, \ + const QStringList& listUnits, \ + bool bUnitNeeded, \ + bool& bConsidered); + +protected: + + void makesureHeaderView(ZxTableModel* pModel); + +signals: + + +protected: + + ZxTableHeaderViewUnit* m_pHeaderView; //不涉及序列化 + + bool m_bUnitTitleIfNeeded; + + bool m_bUnableSP; +}; diff --git a/Include/iBase/iUnit/iUnitGroup.h b/Include/iBase/iUnit/iUnitGroup.h index ea2cef8..968630c 100644 --- a/Include/iBase/iUnit/iUnitGroup.h +++ b/Include/iBase/iUnit/iUnitGroup.h @@ -20,16 +20,19 @@ public: void writeInfo(QDomElement& e,QDomDocument &doc); //写入xml void copyFrom(iUnitGroup* p); - // 数据转换 - // bool convert(QString sUnitSrc, double dValueSrc, - // QString sUnitDest, double& dValueDest, int &nDigit); -// bool convert(QString sUnitSrc, VecDouble vecValueSrc, -// QString sUnitDest, VecDouble& vecValueDest, int &nDigit); - + /// @brief 单位转换函数 + /// @param sUnitSrc 源单位 + /// @param dValueSrc 源数值 + /// @param sUnitDest 目的单位 + /// @param dValueDest 目的数值,即转换后的数值 + /// @param nDigit 转换后,需要的小数位数,可能未配置 bool convert(QString sUnitSrc, double dValueSrc, QString sUnitDest, double& dValueDest, int &nDigit); bool convert(QString sUnitSrc, VecDouble vecValueSrc, QString sUnitDest, VecDouble& vecValueDest, int &nDigit); + static bool convert(const double dValueSrc, double& dValueDest, \ + const double k_src, const double b_src, \ + const double k_dest, const double b_dest); // 查找是否还有某个单位 int indexOf(QString sUnit); @@ -38,7 +41,7 @@ public: iUnitItem* getUnitItem(QString sUnit); // 获取所有的单位名称 - QStringList getAllUnitNames(); + QStringList getAllUnitNames(QStringList* ptrListUnitIDs = nullptr); // 获取该单位组的基准单位 QString getUnitBase(); diff --git a/Include/iBase/iUtils/ZxBaseUtil.h b/Include/iBase/iUtils/ZxBaseUtil.h index aa5c653..d4a713d 100644 --- a/Include/iBase/iUtils/ZxBaseUtil.h +++ b/Include/iBase/iUtils/ZxBaseUtil.h @@ -222,7 +222,9 @@ public: // 0.0009868==》9.9e-4 // 0.0009003==》9e-4 // 0.000009003==》9e-6//*/ - static QString fuzzyFormatDouble(double d, int nValidDigit = 2); + + // nValidDigit = -1,则默认2位,否则,按指定位数进行 + static QString fuzzyFormatDouble(double d, int nValidDigit = -1); static QString trimValueStrZero(QString s); // 启动Help diff --git a/Include/iData/iFileEngine/iFileEngine.h b/Include/iData/iFileEngine/iFileEngine.h index d5048b4..3197b00 100644 --- a/Include/iData/iFileEngine/iFileEngine.h +++ b/Include/iData/iFileEngine/iFileEngine.h @@ -40,6 +40,15 @@ public: QStringList getTitles(); QStringList getUnits(); + /// @brief 行索引 + /// @param nLineIndexTitle 标题所在行 + /// @param nLineIndexUnit 单位所在行 + /// @param nLineIndexValue 数据起始行 + void getIndexOfLines(int& nLineIndexTitle, \ + int& nLineIndexUnit, \ + int& nLineIndexValue); + + // 错误信息 QString getLastError(); @@ -57,8 +66,8 @@ protected: // 利用倒回两行,try查找标题单位 virtual bool tryParseTitleUnit(QString s); - // 单位 - bool isProperUnit(QString s); + // 加载完毕,做些特殊的处理 + virtual bool finalDeals(const VVecVariant& vvecData); public: @@ -67,16 +76,18 @@ public: static QString getCodecStrOf(Text_File_Format o); static bool isUtf8WithoutBOM(QFile& file); + // 单位 + static bool isProperUnit(QString s); + protected: - QString m_sError; //存错误信息 QString m_sHeaders; //顶部文件说明信息 QStringList m_listTitles; //顶部单位和标题 QStringList m_listUnits; + int m_nLineIndexTitle; //标题所在行 + int m_nLineIndexUnit; //单位所在行 int m_nLineIndexValue; //数据起始行 - int m_nLineIndexTitle; - int m_nLineIndexUnit; int m_nDataRowCountPreviewed;//头包含多少行数据,默认为2,外界可传入 int m_nDataLineTryMax; //在try时数据多少条即可认为是数据,默认为3 @@ -84,11 +95,44 @@ protected: // 是否采用编码转换 bool m_bUsingCodecMode; Text_File_Format m_oTff; + + QString m_sError; //存错误信息 }; // iFileEngineUtils class I_FILE_ENGINE_EXPORT iFileEngineUtils { + +public: + + // 为了结果传输方便,而启用 + struct fprParseResult { + + QString sHeaders; //顶部文件说明信息 + QStringList listTitles; //顶部单位和标题 + QStringList listUnits; + + int nLineIndexTitle; //标题所在行 + int nLineIndexUnit; //单位所在行 + int nLineIndexValue; //数据起始行 + + fprParseResult() + { + clear(); + } + + void clear() + { + sHeaders = ""; + listTitles.clear(); + listUnits.clear(); + + nLineIndexValue = -1; + nLineIndexTitle = -1; + nLineIndexUnit = -1; + } + }; + public: // 统一加载接口 @@ -103,9 +147,7 @@ public: // 统一加载接口 // 如果不传入 oType 则根据文件后缀,自动识别 static bool loadEx(VVecVariant& vvecData, - QString& sHeaders, - QStringList& listTitles, - QStringList& listUnits, + fprParseResult& rsts, QString sFile, FileEngineType oType = FET_Unknown, QString sExt = "",//如sheetName diff --git a/Include/iData/iFileEngine/iFileEngineDat.h b/Include/iData/iFileEngine/iFileEngineDat.h index 18a5c66..45b6cf4 100644 --- a/Include/iData/iFileEngine/iFileEngineDat.h +++ b/Include/iData/iFileEngine/iFileEngineDat.h @@ -25,6 +25,9 @@ protected: virtual bool tryParseTitleUnit(QString s1); virtual bool tryParseTitle(QString s1); + // 加载完毕,做些特殊的处理 + virtual bool finalDeals(const VVecVariant& vvecData); + // 判断改行是否全是数字 bool isDigitLine(const QByteArray &ba); bool isDigitLine(const QString& sLine); diff --git a/Include/iData/iFileEngine/iFileEngineExcel.h b/Include/iData/iFileEngine/iFileEngineExcel.h index 5fc3a0c..ed1f798 100644 --- a/Include/iData/iFileEngine/iFileEngineExcel.h +++ b/Include/iData/iFileEngine/iFileEngineExcel.h @@ -20,6 +20,8 @@ public: protected: +#ifdef _SCAN_OLD_CODES_ + // 尝试对名称和单位的模糊解析 virtual bool tryParse(VVecVariant& vvec); @@ -30,6 +32,9 @@ protected: // 判断改行是否全是数字 bool isDigitLine(const VecVariant& vec); +#endif + // 加载完毕,做些特殊的处理 + virtual bool finalDeals(const VVecVariant& vvecData); protected: diff --git a/Include/iData/iFileEngine/iTryParseHelper.h b/Include/iData/iFileEngine/iTryParseHelper.h new file mode 100644 index 0000000..67eb3e5 --- /dev/null +++ b/Include/iData/iFileEngine/iTryParseHelper.h @@ -0,0 +1,45 @@ +#pragma once + +#include "Defines.h" +#include "iFileEngine.h" +#include "iFileEngine_global.h" + +// 专用解析,tryParse +class I_FILE_ENGINE_EXPORT iTryParseHelper +{ + +public: + + iTryParseHelper(); + ~iTryParseHelper(); + +public: + + iFileEngineUtils::fprParseResult getRsts(); + QString getLastError(); + + // 尝试对名称和单位的模糊解析 + virtual bool tryParse(const VVecVariant& vvec); + +protected: + + // 利用倒回两行,try查找标题单位 + // + virtual bool tryParseTitleUnit(const VecVariant& vec); + virtual bool tryParseTitle(const VecVariant& vec); + + // 判断改行是否全是数字 + bool isDigitLine(const VecVariant& vec); + +protected: + +protected: + + iFileEngineUtils::fprParseResult m_oRst; + + int m_nDataRowCountPreviewed;//头包含多少行数据,默认为2,外界可传入 + int m_nDataLineTryMax; //在try时数据多少条即可认为是数据,默认为3 + + QString m_sError; //存错误信息 + +}; diff --git a/Include/iData/iSysUtils/iUnitHelper.h b/Include/iData/iSysUtils/iUnitHelper.h index db56ef9..76b46c5 100644 --- a/Include/iData/iSysUtils/iUnitHelper.h +++ b/Include/iData/iSysUtils/iUnitHelper.h @@ -5,6 +5,7 @@ class iUnitItem; class iUnitGroup; +// 为单位系统而额外增加的接口以方便快捷调用 class I_SYSUTILS_EXPORT iUnitHelper { public: diff --git a/Include/iData/iSysUtils/zxSysUtils.h b/Include/iData/iSysUtils/zxSysUtils.h index 16ddf19..2136b25 100644 --- a/Include/iData/iSysUtils/zxSysUtils.h +++ b/Include/iData/iSysUtils/zxSysUtils.h @@ -97,6 +97,9 @@ public: // 是否启用RichEdit模式,对于属性页 bool isPtyRichMode(); + // + bool isUnitConvertMode(); //是否支持单位下拉 + private: zxSysUtils(); @@ -114,6 +117,8 @@ private: bool m_bPtyRichMode; //是否启用RichEdit模式,对于属性页 + bool m_bUnitConvert; //是否支持单位下拉 + public: // 各种参数缓存,一旦成功加载,即可作为全局变量进行使用 @@ -128,6 +133,9 @@ public: vecModelInfoBasesPtr m_vecModelBdys; vecModelDescGroupsPtr m_vecModelGroups; + vecModelInfoBasesPtr m_vecModelInterferes; + + //新的模型模式下加载 vecModelInfosPtr m_vecWelModels; vecModelInfosPtr m_vecResModels; diff --git a/Include/iData/iXmlManager/Models/iModelExtInfoInterfere.h b/Include/iData/iXmlManager/Models/iModelExtInfoInterfere.h new file mode 100644 index 0000000..6c8f51a --- /dev/null +++ b/Include/iData/iXmlManager/Models/iModelExtInfoInterfere.h @@ -0,0 +1,60 @@ +#pragma once + +#include "iModelInfoBase.h" + +/*-- 20260626针对干扰模型新增,以方便后期更好地维护 + 目的:就是在常规解析模型业已配置的基础上,针对干扰模型,允许进行再次调整 + 前提:1.干扰的模型,在常规解析模型中,业已配置:包括井型、储层、边界(如果支持)、井储(如果支持) + 2.干扰的模型,是通过在常规解析模型中,增加Flag标识来完成的,即:flagInterfere = 0x00000002 + 举例: Alias="无限大" Tips="" ExtID ="Bdy00001" Flags="35" FlagDescs="1多层+2干扰+32小信号" /> + 3.如果本处未配置,则干扰模型自动走解析模型配置的参数 + 4.干扰的模型,如果后续支持边界或井储,二者涉及的参数,不再额外配置 + 配置说明: + 1.WelModel/ResModel分别对应井型/储层类型ID,支持;间隔连续配置 + 2.ParasAll,重置常规解析模型配置的所有参数(井储/边界除外) + 3.ParasAdd,在常规解析模型配置参数基础上追加参数 + 4.ParasRemove,在常规解析模型配置参数基础上删除参数 +--//*/ +class I_XMLMANAGER_EXPORT iModelExtInfoInterfere : public iModelInfoBase +{ +public: + + iModelExtInfoInterfere(); + ~iModelExtInfoInterfere(); + + // 检测是否包括 + bool checkDefinesOf(const QString sWel, const QString sRes); + + // 进行参数校正 + bool adjustParasOf(const QString sWel, const QString sRes, \ + QStringList& listParas); + +public: + + // 解析xml节点到List + virtual void parseInfo(const QDomElement& e); + + // 把List分配到成员变量 + // 输入开始的m_listValues中index,并且返回下一个index + virtual int allocateInfo(int nIndex); + + // 序列化 + virtual void onSerialize(ZxSerializer* ser); + virtual void onDeserialize(ZxSerializer* ser); + +protected: + + virtual void initXmlTags(); + +public: + + // xml解析的数据项 + QStringList m_listWels; //井型,支持多个,以;分割 + QStringList m_listRess; //油藏类型,支持多个,以;分割 + + QStringList m_listParasAll; //重置常规解析模型配置的所有参数(井储/边界除外) + QStringList m_listParasAdd; //在常规解析模型配置参数基础上追加参数 + QStringList m_listParasRemove; //在常规解析模型配置参数基础上删除参数 + + QMap m_mapSubItems; //配置的类似nf之类的子项,其中value为;逗号分割的QString +}; diff --git a/Include/iData/iXmlManager/Models/iModelInfoBase.h b/Include/iData/iXmlManager/Models/iModelInfoBase.h index 29a5100..64b1743 100644 --- a/Include/iData/iXmlManager/Models/iModelInfoBase.h +++ b/Include/iData/iXmlManager/Models/iModelInfoBase.h @@ -54,8 +54,12 @@ public: // 该方案放在此处只是一种权宜之计 flagWDT = 0x00000100, //(数字Flag+256) + // 该模型选项是否是:只支持干扰(默认不支持) + // 对应的是 只支持干扰,注意,与其它所有标识互斥(数字Flag+512) + // 该方案放在此处只是一种权宜之计 + flagInterfereOnly =0x00000200, //(数字Flag+512) + // 该模型选项是否支持:扩展1~6(默认不支持) - flagExt2 = 0x00000200, //(数字Flag+512) flagExt3 = 0x00000400, //(数字Flag+1024) flagExt4 = 0x00000800, //(数字Flag+2048) flagExt5 = 0x00001000, //(数字Flag+4096) diff --git a/Include/iData/iXmlManager/Models/iParameter.h b/Include/iData/iXmlManager/Models/iParameter.h index 53c355b..fd4662d 100644 --- a/Include/iData/iXmlManager/Models/iParameter.h +++ b/Include/iData/iXmlManager/Models/iParameter.h @@ -12,15 +12,16 @@ enum ParaInfoType PIT_Ba, //4:二进制 TODO PIT_DateTime, //5:时间类型 "Text"存放时间 PIT_Cbx, //6:下拉Cmb 具有"ItemOptions"属性 - PIT_SubSeg, //7:Seg流动段模式 具有"SubItems"属性,具有累积长度、产量等内容 - PIT_SubSegEx, //8:Seg流动段模式,扩展模式 具有"SubItems"属性, + PIT_SubSeg, //7:Seg模式 具有"SubItems"属性,如裂缝条数 + PIT_SubSegEx, //8:Seg流动段模式,扩展模式 具有"SubItems"属性,具有累积长度、产量等内容 // 并且以More按钮形式弹出可视化窗口 PIT_CbxClasp, //9:双下拉(扣型+公母),派生自 PIT_Cbx, // 具有"ItemOptions"+"ItemOptionExs"属性 PIT_SubNormal, //10:具有"SubItems"属性,普通的模式,比如 层数据,CO2,新增20250717 PIT_CbxEx, //11:[废弃,暂未启用]11:下拉Cmb,针对模型选项的进一步扩展,需要动态填充的 "ItemOptions"属性可有可无 // 放在外部进行处理,不依赖底层 - PIT_BtnTable, //12:按钮,比如弹出表格,由外部进行控制 + PIT_Btn, //12:按钮,比如弹出表格,由外部进行控制 + PIT_DoubleBtn, //13:Double数值 扩展 按钮类,比 Double数值 多了一个按钮,点击后,由外部控制,比如重新计算该项 PIT_UNKNOWN }; diff --git a/Include/iData/iXmlManager/Models/iParameterSeg.h b/Include/iData/iXmlManager/Models/iParameterSeg.h index 37c4315..ef67365 100644 --- a/Include/iData/iXmlManager/Models/iParameterSeg.h +++ b/Include/iData/iXmlManager/Models/iParameterSeg.h @@ -36,9 +36,10 @@ protected: public: // xml解析的数据项,填写项的英文Name - QStringList m_listSubItemNames; //控制的项,如产液段数 控制 三项:产液段位置;产液段长度;产液段产量 + QStringList m_listSubItemNames; //控制的项,如产量段数 控制 三项:产量段位置;产量段长度;产量段产量 QStringList m_listSubItemAliass;//别称 //QMap m_mapSubParas; //控制的项对应的基础参数,个数与m_listSubTags对应 + //QStringList m_listSubItemNamesBk; //m_listSubItemNames的备份 - QStringList m_listSubItemNamesBk; //m_listSubItemNames的备份 + QString m_sSubGroupTag; //显示的子项分组的名称,如压裂段#、产量段# }; diff --git a/Include/iData/iXmlManager/Models/iParameterSegEx.h b/Include/iData/iXmlManager/Models/iParameterSegEx.h index 7f5201f..b00c4fb 100644 --- a/Include/iData/iXmlManager/Models/iParameterSegEx.h +++ b/Include/iData/iXmlManager/Models/iParameterSegEx.h @@ -31,9 +31,8 @@ protected: public: // // xml解析的数据项,填写项的英文Name -// QStringList m_listSubItemNames; //控制的项,如产液段数 控制 三项:产液段位置;产液段长度;产液段产量 +// QStringList m_listSubItemNames; //控制的项,如产量段数 控制 三项:产量段位置;产量段长度;产量段产量 // QStringList m_listSubItemAliass;//别称 // //QMap m_mapSubParas; //控制的项对应的基础参数,个数与m_listSubTags对应 - // QStringList m_listSubItemNamesBk; //m_listSubItemNames的备份 }; diff --git a/Include/iData/iXmlManager/iXmlUtilModels.h b/Include/iData/iXmlManager/iXmlUtilModels.h index 1f8cbf0..b11d474 100644 --- a/Include/iData/iXmlManager/iXmlUtilModels.h +++ b/Include/iData/iXmlManager/iXmlUtilModels.h @@ -20,6 +20,7 @@ public: vecModelInfoBasesPtr* pVecWel, vecModelInfoBasesPtr* pVecRes, vecModelInfoBasesPtr* pVecBdy, + vecModelInfoBasesPtr* pVecExtInterfere, vecModelDescGroupsPtr*& pVecGroups, QString sFile); diff --git a/Include/iGui/iGuiBase/iDlgBase.h b/Include/iGui/iGuiBase/iDlgBase.h index 8e2ee14..8d7eff3 100644 --- a/Include/iGui/iGuiBase/iDlgBase.h +++ b/Include/iGui/iGuiBase/iDlgBase.h @@ -10,6 +10,8 @@ class iParameter; class iParaItemCtrl; class ZxSerializer; +class iUnitWxBinder; + /// @brief 基础窗体ZxUiBase之上的再次封装 class X_GUI_BASE_EXPORT iDlgBase : public ZxUiBase { @@ -39,6 +41,41 @@ public: // 当清空Layout布局时,把m_mapCtrls中涉及到的Wx清除 virtual bool removeSubCtrlCached(QWidget* pWx); + // 参数来源标识,默认情况下,为 s_Sys_Para_Default + void setParaSrcTag(QString s); + + // 绑定单位对 + // 需要特别注意:调用该函数之前,如果需要更改参数来源标识,一定要先setParaSrcTag + virtual bool bindUnitPairWxs(QLineEdit* pTbx, \ + QComboBox* pCbx, \ + QString sPara, \ + bool bBindOnly); + + // 绑定单位对 + // 需要特别注意:调用该函数之前,如果需要更改参数来源标识,一定要先setParaSrcTag + virtual bool bindUnitPairWxs(QLineEdit* pTbx1, \ + QLineEdit* pTbx2, \ + QComboBox* pCbx, \ + QString sPara, \ + bool bBindOnly); + + // 基准数值及单位 + virtual bool getUnitBinderParaValue(QString sPara, double& d); + virtual bool getUnitBinderParaUnit(QString sPara, QString& sUnit); +// virtual bool getAllUnitBinderParaValues(QMap& map, +// bool bClearMap = true); +// virtual bool getAllUnitBinderParaUnits(QMap& map, +// bool bClearMap = true); + + +protected slots: + + /// @brief 对于参数/单位绑定的情形,数据编辑,允许外部进行判断是否合理 + /// @param sPara 具体哪个参数,英文标识 + /// @param baseValue 基准数值,并非显示数值 + /// @param bValid 是否有效的数值,返回值 + virtual void slotValidateParaInput(const QString sPara, const double baseValue, bool& bValid); + protected: // 单位切换 @@ -56,4 +93,10 @@ protected: protected: + iUnitWxBinder* m_pUnitBinder; + + // 参数来源标识,默认情况下,为 s_Sys_Para_Default + // 不涉及序列化 + QString m_sParaSrcTag; + }; diff --git a/Include/iGui/iGuiBase/iParaItemCtrl.h b/Include/iGui/iGuiBase/iParaItemCtrl.h index 4548c73..75f80ac 100644 --- a/Include/iGui/iGuiBase/iParaItemCtrl.h +++ b/Include/iGui/iGuiBase/iParaItemCtrl.h @@ -12,6 +12,7 @@ class QLineEdit; class QComboBox; class QLabel; class iParameter; +class iUnitWxBinder; class X_GUI_BASE_EXPORT iParaItemCtrl : public QWidget { @@ -21,10 +22,12 @@ public: /// @brief 参数系列,自动从后台获取相关信息 /// @param sPara 参数名称,可以是 英文也可以是中文,软件会自动判断 + /// @param sParaSrcTag 标识,跟随主对话框走 /// @param pParameter 参数对应的对象体,如果为空,软件会自动判断 /// @param sUnit,当前选取的单位,如果为空,则默认从后台获取 /// @param oValue,当前的数值,如果不传入,则取空 iParaItemCtrl(QString sPara, + QString sParaSrcTag, QVariant oValue = QVariant(), QString sUnit = "", iParameter* pParameter = nullptr); @@ -87,6 +90,7 @@ public: bool isInputOk(); signals: + void sigUnableSP(bool&); void sigValueChanged(QString sPara, QVariant o); @@ -103,16 +107,34 @@ public: // 数据范围 QString getScaleStr(); + static QString getScaleStrOf(QString sPara, \ + QString sParaSrcTag, \ + QString sCurUnit = "", \ + iUnitGroup* pUnitGroup = nullptr); + static QString getScaleStrOf(iParameter* pParameter, \ + QString sCurUnit = "", \ + iUnitGroup* pUnitGroup = nullptr); QVector getStrenchRatios(); + void freshTips(); + private slots: void slotTextChanged(QString s); void slotCbxIndexChanged(int index); void slotTextStrChanged(); - + +protected slots: + + /// @brief 对于参数/单位绑定的情形,数据编辑,允许外部进行判断是否合理 + /// @param sPara 具体哪个参数,英文标识 + /// @param baseValue 基准数值,并非显示数值 + /// @param bValid 是否有效的数值,返回值 + virtual void slotValidateParaInput(const QString sPara, const double baseValue, bool& bValid); + private: + QLabel* m_pItemTag; //标签 //QWidget* m_pItemEdit; QLineEdit* m_pItemEdit; //编辑框 @@ -141,4 +163,7 @@ private: int m_nMarginR; //整体的右侧偏移(边界) bool m_bStrench; //是否启用Strench(如果为false,则不启用) QVector m_vecStreches;//如果启用strench采用的数值 + + iUnitWxBinder* m_pUnitBinder; + QString m_sParaSrcTag; }; diff --git a/Include/iGui/iGuiBase/iUnitWxBinder.h b/Include/iGui/iGuiBase/iUnitWxBinder.h new file mode 100644 index 0000000..d4c1f7b --- /dev/null +++ b/Include/iGui/iGuiBase/iUnitWxBinder.h @@ -0,0 +1,163 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +#include "zxBindWxPair.h" + +// 单位控件绑定器 - 将QLineEdit和QComboBox绑定,统一管理单位转换 +// 每个对话框/窗口独立拥有自己的实例 +class X_GUI_BASE_EXPORT iUnitWxBinder : public QObject +{ + Q_OBJECT + +public: + + explicit iUnitWxBinder(QObject *parent = 0, QString sParaSrcTag = ""); + ~iUnitWxBinder(); + +private: + + // 禁止拷贝 + iUnitWxBinder(const iUnitWxBinder&); + iUnitWxBinder& operator=(const iUnitWxBinder&); + +public: + + /// @brief 注册单位组(根据参数进行) + /// @param pTbxValue 数值输入区 + /// @param pCbxUnit 单位下拉框 + /// @param sPara 绑定的参数,可以为空,但是不建议为空,如果为空,则自动根据combo已经填写的内容,搜索UnitGroup + /// @param bBindWxOnly 是否仅仅绑定,true,这时候不重新填写数值和下拉 + bool registerUnitGroup(QLineEdit* pTbxValue, \ + QComboBox* pCbxUnit, \ + QString sPara = "", \ + bool bBindWxOnly = false); + + /// @brief 注册单位组(根据参数进行,两个算比较常见的,所以单位增加一个接口) + /// @param pTbxValue1 数值输入区 + /// @param pTbxValue2 数值输入区 + /// @param pCbxUnit 单位下拉框 + /// @param sPara 绑定的参数,可以为空,但是不建议为空,如果为空,则自动根据combo已经填写的内容,搜索UnitGroup + /// @param bBindWxOnly 是否仅仅绑定,true,这时候不重新填写数值和下拉 + bool registerUnitGroup(QLineEdit* pTbxValue1, \ + QLineEdit* pTbxValue2, \ + QComboBox* pCbxUnit, \ + QString sPara = "", \ + bool bBindWxOnly = false); + +private: + + // 注册单位组(单个LineEdit) + bool _registerUnitGroup(QLineEdit* pTbxValue, \ + QComboBox* pCbxUnit, \ + iUnitGroup* pUnitGroup, \ + const QString& sBaseUnit, \ + double dValueInit = 0.0, \ + QString sPara = "", \ + bool bBindWxOnly = false); + + // 注册单位组(多个LineEdit共用一个ComboBox) + bool _registerUnitGroup(QList listTbxValues, \ + QComboBox* pCbxUnit, \ + iUnitGroup* pUnitGroup, \ + const QString& sBaseUnit, \ + QList listValueInits = QList(), \ + QString sPara = "", \ + bool bBindWxOnly = false); + + void _freshTips(zxBindWxPair* pBindPair); + +public: + + // 获取基准单位的数值 + double getBaseValue(QLineEdit* pTbxValue) const; + double getBaseValue(QString sPara) const; //慎用,只有一对一的情形才能用 + // 设置基准值(会同步更新显示) + void setBaseValue(QLineEdit* pTbxValue, double baseValue); + void setBaseValue(double baseValue); + + + // 获取当前单位下的显示值 + double getDisplayValue(QLineEdit* pTbxValue) const; + double getDisplayValue(QString sPara) const; //慎用,只有一对一的情形才能用 + + QString getShowValue(QLineEdit* pTbxValue) const; + QString getShowValue(QString sPara) const; //慎用,只有一对一的情形才能用 + + // 获取当前单位名称 + QString getCurrentUnit(QLineEdit* pTbxValue) const; + QString getBaseUnit(QString sPara) const; //慎用,只有一对一的情形才能用 + + // 设置当前单位(会同步转换数值) + void setCurrentUnit(QLineEdit* pTbxValue, const QString& unitName); + + // 获取当前单位索引 + int getCurrentUnitIndex(QLineEdit* pTbxValue) const; + + // 获取单位组 + iUnitGroup* getUnitGroup(QLineEdit* pTbxValue) const; + + zxBindWxPair* getWxPairOf(QLineEdit* pTbxValue); + const zxBindWxPair* getWxPairOf(QLineEdit* pTbxValue) const; + zxBindWxPair* getWxPairOf(QComboBox* pCbxUnit); + const zxBindWxPair* getWxPairOf(QComboBox* pCbxUnit) const; + + zxBindWxPair* getDefaultWxPair(); + const zxBindWxPair* getDefaultWxPair() const; + + // 这一组慎用,只有一对一情形适用 + zxBindWxPair* getWxPairOf(QString sPara); + const zxBindWxPair* getWxPairOf(QString sPara) const; + + // 手动触发更新显示 + void updateDisplay(QLineEdit* pTbxValue); + + // 移除单位组(当控件销毁时自动调用) + void removeUnitGroup(QLineEdit* pTbxValue); + + // 清理所有已销毁控件的组数据 + void cleanupDestroyedGroups(); + + QString getEditorCss(bool bValid); + + QString getLastError(); + + // 判断输入是否OK,如果为空,则默认第一个 + bool isInputOK(QLineEdit* pTbxValue = nullptr, \ + bool bCheckOnly = true, \ + double* ptrBaseValue = nullptr); + +signals: + + // 触发信号,由外部控制,是否输入OK,比如参数ValidStr校验 + void sigInputOK(const QString sPara, const double dBaseValue, bool& bOK); + +private slots: + + void onUnitChanged(int index); + void onEditingFinished(); + void onWidgetDestroyed(QObject* obj); + +private: + + void updateDisplayInternal(zxBindWxPair* pBindPair); + int getDecimalDigitsFromUnit(zxBindWxPair* pBindPair, const QString& unitName) const; + QString formatNumber(double value, int nDigit) const; + +private: + + QList m_listPairs; + + // 参数来源标识,默认情况下,为 s_Sys_Para_Default + // 不涉及序列化 + QString m_sParaSrcTag; + + // Error + QString m_sError; + +}; diff --git a/Include/iGui/iGuiBase/zxBindWxPair.h b/Include/iGui/iGuiBase/zxBindWxPair.h new file mode 100644 index 0000000..29b467a --- /dev/null +++ b/Include/iGui/iGuiBase/zxBindWxPair.h @@ -0,0 +1,38 @@ + +#pragma once + +#include "Defines.h" + +#include "iGuiBase_global.h" + +class iUnitGroup; +class iParameter; + +// 绑定组数据结构 +class X_GUI_BASE_EXPORT zxBindWxPair +{ +public: + + zxBindWxPair(); + ~zxBindWxPair(); + +public: + + bool isValid() const; + int getLineEditIndex(QLineEdit* pTbx) const; + +public: + + QList > listTbxValues; + QPointer pCbxUnit; + + iUnitGroup* pUnitGroup; + QString sBaseUnit; + QList listBaseValues; + + bool isUpdating; + int nCurDigit; + + iParameter* pParameter; + QString sPara; +}; diff --git a/Include/iGui/iGuiGridPty/iGridResultItem.h b/Include/iGui/iGuiGridPty/iGridResultItem.h index be87621..fc241c9 100644 --- a/Include/iGui/iGuiGridPty/iGridResultItem.h +++ b/Include/iGui/iGuiGridPty/iGridResultItem.h @@ -55,7 +55,8 @@ public: virtual QRectF getBounds(); // virtual QRectF getLeftBounds(); //左 virtual QRectF getRightBounds_Main(); - virtual QRectF getRightBounds_Unt(); + virtual QRectF getRightBounds_Unt(); // 单位以文本显示时的范围) + virtual QRectF getRightBounds_UntCbx();//单位以ComboBox显示时的范围 virtual double getItemHeight(); //当前节点高度 virtual void setSplitPos(double d); //中间分隔 diff --git a/Include/iGui/iGuiGridPty/iGridResultUtils.h b/Include/iGui/iGuiGridPty/iGridResultUtils.h index ecda15f..c623edc 100644 --- a/Include/iGui/iGuiGridPty/iGridResultUtils.h +++ b/Include/iGui/iGuiGridPty/iGridResultUtils.h @@ -69,9 +69,6 @@ public: // 模型解释选用了某一项 void setItemAsSelected(QString sAlias, bool bSelected = true); - // 参数来源标识,默认情况下,为 s_Sys_Para_Default - void setParaSrcTag(QString s); - protected: // 按键 @@ -183,7 +180,4 @@ private: protected: - // 参数来源标识,默认情况下,为 s_Sys_Para_Default - // 不涉及序列化 - QString m_sParaSrcTag; }; diff --git a/Include/iGui/iGuiGridPty/iGridRowItem.h b/Include/iGui/iGuiGridPty/iGridRowItem.h index d483b81..3a490ac 100644 --- a/Include/iGui/iGuiGridPty/iGridRowItem.h +++ b/Include/iGui/iGuiGridPty/iGridRowItem.h @@ -30,6 +30,7 @@ public: int getChildCount(); //孩子数目 int getChildVisibleCount(); //可见的孩子数目 iGridRowItem* getChildAt(int n); //获取 + int indexOf(iGridRowItem* pChild); void removeAllChildren(); //Clear bool getAllItems(QVector& vec);//不考虑层级 int getItemLevel(); //获取层次级别 @@ -53,6 +54,7 @@ public: virtual void configEditor(); virtual QString getEditorCss(bool bValid); virtual QWidget* getMainEditor(); + virtual void getAllEditors(QVector& vec); // 位置相关Bounds virtual void setBounds(QRectF& rt); //全局 @@ -125,6 +127,9 @@ signals: // 是否启用正则验证,比如,直角边界,第一个边界要大于井长/2,只有点源才支持 void sigOuterValidate(QString sPara, QVariant o, bool& bValid, bool& bSet); + // 绑定unit + void sigUnitWxBind(QLineEdit* pTbx, QComboBox* pUnit, QString sPara, bool bBindOnly); + protected slots: // QLineEdit 类型的数据change响应 @@ -189,6 +194,11 @@ public: virtual void organizeResult(iResultInfo& o, QString sType); + // 序列化标识 + virtual QString getSerDesTag(/*int nIndex*/); + + virtual void makesureChildren(int nTargetCount); //在反序列化时如果发现孩子个数不一致,则需要确保 + protected: // 对于只读等属性的管理 @@ -278,4 +288,5 @@ protected: // 参数来源标识,默认情况下,为 s_Sys_Para_Default // 不涉及序列化 QString m_sParaSrcTag; + }; diff --git a/Include/iGui/iGuiGridPty/iGridRowItemBdy.h b/Include/iGui/iGuiGridPty/iGridRowItemBdy.h index da39058..5e98879 100644 --- a/Include/iGui/iGuiGridPty/iGridRowItemBdy.h +++ b/Include/iGui/iGuiGridPty/iGridRowItemBdy.h @@ -47,7 +47,8 @@ public: virtual void setBounds(QRectF& rt);//全局 virtual QRectF getRightBounds_Main();//右 virtual QRectF getRightBounds_Bdy(); - virtual QRectF getRightBounds_Unt(); + virtual QRectF getRightBounds_Unt(); // 单位以文本显示时的范围) + virtual QRectF getRightBounds_UntCbx();//单位以ComboBox显示时的范围 // 结果 virtual QVariant getInfoRight(); diff --git a/Include/iGui/iGuiGridPty/iGridRowItemBtn.h b/Include/iGui/iGuiGridPty/iGridRowItemBtn.h index 520d8f0..982e003 100644 --- a/Include/iGui/iGuiGridPty/iGridRowItemBtn.h +++ b/Include/iGui/iGuiGridPty/iGridRowItemBtn.h @@ -28,6 +28,12 @@ public: virtual void setDlgBase(QWidget* p); virtual void setParameter(iParameter* p); + // 从外部绑定数据 + virtual void bindTableInfos(const QStringList& listTitles, \ + const VVecVariant& vvec, \ + bool bReadonly = true, \ + bool bExpanded = false); + virtual bool isInputOk(); virtual void setActive(bool b); diff --git a/Include/iGui/iGuiGridPty/iGridRowItemDoubleBtn.h b/Include/iGui/iGuiGridPty/iGridRowItemDoubleBtn.h new file mode 100644 index 0000000..12bbf41 --- /dev/null +++ b/Include/iGui/iGuiGridPty/iGridRowItemDoubleBtn.h @@ -0,0 +1,81 @@ +#pragma once + +#include "iGridRowItemDouble.h" + +// 在 iGridRowItemDouble 基础上,增加按钮,即:激活时,多了一个按钮 +// 用于,比如 对某些Item,自行进行计算,点击按钮 响应,目前用于数值 + +class X_GUI_GRIDPTY_EXPORT iGridRowItemDoubleBtn : + public iGridRowItemDouble +{ + Q_OBJECT + +public: + + explicit iGridRowItemDoubleBtn(iGridRowItem* pParent = nullptr); + ~iGridRowItemDoubleBtn(); + +public: + + // 序列化 + virtual void onSerialize(ZxSerializer* ser); + virtual void onDeserialize(ZxSerializer* ser); + + // 控件 + virtual void initEditor(); + virtual void configEditor(); + virtual void initOtherEditors(); + + virtual void setDlgBase(QWidget* p); + virtual void setParameter(iParameter* p); + + // 从外部绑定数据 + virtual void bindTableInfos(const QStringList& listTitles, \ + const VVecVariant& vvec, \ + bool bReadonly = true, \ + bool bExpanded = false); + virtual bool isInputOk(); + virtual void setActive(bool b); + + // 该基类默认按double进行实现 + virtual bool setCurValue(QVariant o);//现值 + virtual QVariant getCurValue(); + virtual QString getShowValue(); //非激活时显示在右侧的文本 + + // 原值,请在setParameter之前调用 + virtual void setRawValue(QVariant o); + QVariant getRawValue(); + + // 位置相关 + virtual void setBounds(QRectF& rt); + virtual QRectF getRightBounds_Main(); + virtual QVariant getInfoRight(); + virtual QString getInfoUnit(); + +signals: + + /// @brief 触发按钮,允许外部进行按钮操作,比如弹出对话框之类 + /// @param sName: (in) 参数标识,为英文标识 + /// @param vCustom: (in & out) 外部弹出后,可以把数据传递回来,并且缓存,以支持序列化 + /// @param bModified: (out) 是否正确触发且vCustom发生改变 + void sigBtnClicked(const QString sSegName, \ + QVariant& vCustom, \ + bool& bModified); + +public slots: + + virtual void slotBtnClicked(); + +protected: + + virtual void onCustomDataChanged(); + +protected: + + QPushButton* m_pBtn; + + QVariant m_vCustom; //这是额外增加的数据体,暂时保留,以便后续扩展 + +// QStringList m_listTitles; +// VVecVariant m_vvecData; +}; diff --git a/Include/iGui/iGuiGridPty/iGridRowItemImg.h b/Include/iGui/iGuiGridPty/iGridRowItemImg.h index 8aaa00c..1ed9d0c 100644 --- a/Include/iGui/iGuiGridPty/iGridRowItemImg.h +++ b/Include/iGui/iGuiGridPty/iGridRowItemImg.h @@ -33,7 +33,8 @@ public: // 范围 virtual void setBounds(QRectF& rt); virtual QRectF getRightBounds_Main();//右 - virtual QRectF getRightBounds_Unt(); + virtual QRectF getRightBounds_Unt(); // 单位以文本显示时的范围) + virtual QRectF getRightBounds_UntCbx();//单位以ComboBox显示时的范围 // 双击 virtual void onItemDoubleCliked(GridTickPos o); diff --git a/Include/iGui/iGuiGridPty/iGridRowItemStr.h b/Include/iGui/iGuiGridPty/iGridRowItemStr.h index 0ddd057..38a5820 100644 --- a/Include/iGui/iGuiGridPty/iGridRowItemStr.h +++ b/Include/iGui/iGuiGridPty/iGridRowItemStr.h @@ -36,7 +36,8 @@ public: // 范围 virtual void setBounds(QRectF& rt);//全局 virtual QRectF getRightBounds_Main();//右 - virtual QRectF getRightBounds_Unt(); + virtual QRectF getRightBounds_Unt(); // 单位以文本显示时的范围) + virtual QRectF getRightBounds_UntCbx();//单位以ComboBox显示时的范围 // 结果 virtual QVariant getInfoRight(); diff --git a/Include/iGui/iGuiGridPty/iGridRowItemSub.h b/Include/iGui/iGuiGridPty/iGridRowItemSub.h index 75f1ad8..f2cde09 100644 --- a/Include/iGui/iGuiGridPty/iGridRowItemSub.h +++ b/Include/iGui/iGuiGridPty/iGridRowItemSub.h @@ -2,7 +2,7 @@ #include "iGridRowItemUnt.h" -// 流动段数、产液段数 +// 产量段数 class iParameterSeg; class X_GUI_GRIDPTY_EXPORT iGridRowItemSub : public iGridRowItemUnt @@ -29,10 +29,6 @@ public: virtual void setBounds(QRectF& rt);//全局 virtual QRectF getRightBounds_Main();//右 - // 刷新 - // n:段数 - virtual void freshSubChild(int n, bool bBySegCount); - // 对于Editor的范围及颜色管理 virtual void checkAndClr(); virtual QString getEditorCss(bool bValid); @@ -42,6 +38,79 @@ public: virtual bool setCurValue(QVariant o); virtual QVariant getCurValue(); +public: + + // 刷新 + // n:段数 + virtual void freshSubChild(int n, bool bBySegCount); + + virtual void makesureChildren(int nTargetCount); //在反序列化时如果发现孩子个数不一致,则需要确保 + + /// @brief 创建(多少行/层)子项,为了后续改成表格方便,姑且用Row + /* 第1层(李三) + * 深度 100 + * 压力 27 + * 渗透率 1.098 + * 第2层(王五) + * 深度 110 + * 压力 21 + * 渗透率 3.098 + */ + /// @param nTargetRowCount: (in) 目标是多少行/层 + /// @param bResetAll: (in) 是否是否重新生成所有 + virtual bool createRowChildren(int nTargetRowCount, bool bResetAll = false); + + /// @brief 创建子项(第几行/层)比如第一层、第二层的一或二,为了后续改成表格方便,姑且用Row + /* 第1层(李三) + * 深度 100 + * 压力 27 + * 渗透率 1.098 + * 第2层(王五) + * 深度 110 + * 压力 21 + * 渗透率 3.098 + */ + /// @param listSubItemNames: (in) 子项,具体可能需要加序号标识 + /// @param listSubItemAliass: (in) 子项别称,具体可能需要加序号标识 + /// @param nRowIndex: (in) 当前第几行/层 + /// @param bAddNo: (in) 是否需要添加序号标识 + virtual bool createOneRowChildOf(const QStringList& listSubItemNames, \ + const QStringList& listSubItemAliass, \ + int nRowIndex, \ + bool bAddNo = true); + + /// @brief 在过程中createRowChildOf允许根据当前数据进行调整某些项 + /// @param pItemChild: (in) 待调整的项 + /// @param sPara: (in) 子项,具体可能需要加序号标识 + /// @param nRowIndex: (in) 当前第几行/层 + /// @param nColIndex: (in) 当前行/层的第几个参数,默认为-1,其实与sPara是对应的 + virtual bool adjustValueOfRowChild(iGridRowItem* pItemChild, \ + const QString sPara, \ + int nRowIndex, \ + int nColIndex = -1); + + /// @brief 在过程中createRowChildOf允许调整内部标识 + /// @param sTagInner: (in&out) TagInner + /// @param sNameInner: (in&out) NameInner + /// @param nRowIndex: (in) 当前第几行/层 + virtual bool adjustTagOfRowChild(QString& sTagInner, \ + QString& sNameInner, \ + int nRowIndex); + + /// @brief 在过程中createRowChildOf允许调整内部标识 + /// @param sTagInner: (in&out) TagInner + /// @param sNameInner: (in&out) NameInner + /// @param nRowIndex: (in) 当前第几行/层 + virtual bool adjustTagOfRowGroup(QString& sTagInner, \ + int nRowIndex); + + /// @brief 允许外部对子项进行调整 + /// @param listSubItemNames: (in & out) 调整后的子项 + /// @param listSubItemAliass: (in & out) 调整后的子项别称 + /// @result 是否已经调整 + bool adjustSubItemNames(QStringList& listSubItemNames, \ + QStringList& listSubItemAliass); + public slots: virtual void slotSubCountChanged(int n); diff --git a/Include/iGui/iGuiGridPty/iGridRowItemSubNormal.h b/Include/iGui/iGuiGridPty/iGridRowItemSubNormal.h index d9dce81..03ddbd6 100644 --- a/Include/iGui/iGuiGridPty/iGridRowItemSubNormal.h +++ b/Include/iGui/iGuiGridPty/iGridRowItemSubNormal.h @@ -3,7 +3,15 @@ #include "iGridRowItemSub.h" // 常规的Sub,比如层数据 - +/* 第1层(李三) + * 深度 100 + * 压力 27 + * 渗透率 1.098 + * 第2层(王五) + * 深度 110 + * 压力 21 + * 渗透率 3.098 + */ class X_GUI_GRIDPTY_EXPORT iGridRowItemSubNormal : public iGridRowItemSub { @@ -41,11 +49,37 @@ public: bool bReadonly = true, \ bool bExpanded = false); + virtual void makesureChildren(int nTargetCount); //在反序列化时如果发现孩子个数不一致,则需要确保 + + /// @brief 在过程中createRowChildOf允许根据当前数据进行调整某些项 + /// @param pItemChild: (in) 待调整的项 + /// @param sPara: (in) 子项,具体可能需要加序号标识 + /// @param nRowIndex: (in) 当前第几行/层 + /// @param nColIndex: (in) 当前行/层的第几个参数,默认为-1,其实与sPara是对应的 + virtual bool adjustValueOfRowChild(iGridRowItem* pItemChild, \ + const QString sPara, \ + int nRowIndex, \ + int nColIndex = -1); + + /// @brief 在过程中createRowChildOf允许调整内部标识 + /// @param sTagInner: (in&out) TagInner + /// @param sNameInner: (in&out) NameInner + /// @param nRowIndex: (in) 当前第几行/层 + virtual bool adjustTagOfRowChild(QString& sTagInner, \ + QString& sNameInner, \ + int nRowIndex); + + /// @brief 在过程中createRowChildOf允许调整内部标识 + /// @param sTagInner: (in&out) TagInner + /// @param sNameInner: (in&out) NameInner + /// @param nRowIndex: (in) 当前第几行/层 + virtual bool adjustTagOfRowGroup(QString& sTagInner, \ + int nRowIndex); + public slots: protected: QStringList m_listTagRows; -// QStringList m_listTagCols; VVecVariant m_vvecSubInfos; }; diff --git a/Include/iGui/iGuiGridPty/iGridRowItemSubSeg.h b/Include/iGui/iGuiGridPty/iGridRowItemSubSeg.h index 57bf49b..14b75ad 100644 --- a/Include/iGui/iGuiGridPty/iGridRowItemSubSeg.h +++ b/Include/iGui/iGuiGridPty/iGridRowItemSubSeg.h @@ -2,7 +2,7 @@ #include "iGridRowItemSub.h" -// 流动段数、产液段数 +// 7:Seg模式 具有"SubItems"属性,如裂缝条数 class iParameterSeg; class X_GUI_GRIDPTY_EXPORT iGridRowItemSubSeg : public iGridRowItemSub @@ -29,11 +29,6 @@ public: virtual void setBounds(QRectF& rt);//全局 virtual QRectF getRightBounds_Main();//右 - // 关联绑定的Item,长度 - virtual void setLenAll(double d); - virtual void setBrotherItem(iGridRowItem* p); - // 关联绑定的产量 - virtual void setNqQAll(double d); // 刷新 // n:段数 virtual void freshSubChild(int n, bool bBySegCount); @@ -47,23 +42,41 @@ public: virtual bool setCurValue(QVariant o); virtual QVariant getCurValue(); + virtual void makesureChildren(int nTargetCount); //在反序列化时如果发现孩子个数不一致,则需要确保 + + /// @brief 在过程中createRowChildOf允许根据当前数据进行调整某些项 + /// @param pItemChild: (in) 待调整的项 + /// @param sPara: (in) 子项,具体可能需要加序号标识 + /// @param nRowIndex: (in) 当前第几行/层 + /// @param nColIndex: (in) 当前行/层的第几个参数,默认为-1,其实与sPara是对应的 + virtual bool adjustValueOfRowChild(iGridRowItem* pItemChild, \ + const QString sPara, \ + int nRowIndex, \ + int nColIndex = -1); + + /// @brief 在过程中createRowChildOf允许调整内部标识 + /// @param sTagInner: (in&out) TagInner + /// @param sNameInner: (in&out) NameInner + /// @param nRowIndex: (in) 当前第几行/层 + virtual bool adjustTagOfRowChild(QString& sTagInner, \ + QString& sNameInner, \ + int nRowIndex); + + /// @brief 在过程中createRowChildOf允许调整内部标识 + /// @param sTagInner: (in&out) TagInner + /// @param sNameInner: (in&out) NameInner + /// @param nRowIndex: (in) 当前第几行/层 + virtual bool adjustTagOfRowGroup(QString& sTagInner, \ + int nRowIndex); + public slots: virtual void slotSubCountChanged(int n); - virtual void slotItemLenthChanged(QString, QVariant); protected: - // 对于需要调整的,计算其默认的位置 - virtual VecDouble calDefaultPoss(int n, double dLenAll); - // 结果 virtual QVariant getInfoRight(); virtual QString getInfoUnit(); -protected: - - iGridRowItem* m_pBrotherItem; //关联的长度Item - double m_dLenAll; - double m_dNqAll; }; diff --git a/Include/iGui/iGuiGridPty/iGridRowItemSubSegEx.h b/Include/iGui/iGuiGridPty/iGridRowItemSubSegEx.h index f07d83d..bea60ae 100644 --- a/Include/iGui/iGuiGridPty/iGridRowItemSubSegEx.h +++ b/Include/iGui/iGuiGridPty/iGridRowItemSubSegEx.h @@ -2,8 +2,10 @@ #include "iGridRowItemSubSeg.h" -// 流动段数、产液段数 +// 产量段数、产量段数 Nq,注意:有水平段长度L // 注:界面上显示所有子项,为各自的合计,比如裂缝总长度 +//8:Seg流动段模式,扩展模式 具有"SubItems"属性, +// 并且以More按钮形式弹出可视化窗口 class iParameterSegEx; class X_GUI_GRIDPTY_EXPORT iGridRowItemSubSegEx : public iGridRowItemSubSeg @@ -34,6 +36,8 @@ public: // 关联绑定的Item,长度 virtual void setLenAll(double d); virtual void setBrotherItem(iGridRowItem* p); + // 关联绑定的产量 + virtual void setNqQAll(double d); // 刷新 // n:段数 @@ -68,6 +72,33 @@ public: bool bClearMap = true); virtual bool checkAndOrgaSubResults(QVector& vec, QString sType); + virtual void makesureChildren(int nTargetCount); //在反序列化时如果发现孩子个数不一致,则需要确保 + + /// @brief 在过程中createRowChildOf允许根据当前数据进行调整某些项 + /// @param pItemChild: (in) 待调整的项 + /// @param sPara: (in) 子项,具体可能需要加序号标识 + /// @param nRowIndex: (in) 当前第几行/层 + /// @param nColIndex: (in) 当前行/层的第几个参数,默认为-1,其实与sPara是对应的 + virtual bool adjustValueOfRowChild(iGridRowItem* pItemChild, \ + const QString sPara, \ + int nRowIndex, \ + int nColIndex = -1); + + /// @brief 在过程中createRowChildOf允许调整内部标识 + /// @param sTagInner: (in&out) TagInner + /// @param sNameInner: (in&out) NameInner + /// @param nRowIndex: (in) 当前第几行/层 + virtual bool adjustTagOfRowChild(QString& sTagInner, \ + QString& sNameInner, \ + int nRowIndex); + + /// @brief 在过程中createRowChildOf允许调整内部标识 + /// @param sTagInner: (in&out) TagInner + /// @param sNameInner: (in&out) NameInner + /// @param nRowIndex: (in) 当前第几行/层 + virtual bool adjustTagOfRowGroup(QString& sTagInner, \ + int nRowIndex); + signals: /// @brief 触发子参数列表改变,比如调用水平井段数编辑功能,目前只限于 iGridRowItemSubSegEx 类型的信号传递 @@ -98,8 +129,13 @@ private: protected: - QPushButton* m_pBtn; +protected: + iGridRowItem* m_pBrotherItem; //关联的长度Item + double m_dLenAll; + double m_dNqAll; + + QPushButton* m_pBtn; QVector< QMap > m_vvecSubParas; }; diff --git a/Include/iGui/iGuiGridPty/iGridRowItemUnt.h b/Include/iGui/iGuiGridPty/iGridRowItemUnt.h index a4c44b0..168d936 100644 --- a/Include/iGui/iGuiGridPty/iGridRowItemUnt.h +++ b/Include/iGui/iGuiGridPty/iGridRowItemUnt.h @@ -2,25 +2,62 @@ #include "iGridRowItem.h" +class ZxComboBox; +class iUnitWxBinder; + // 对于有单位的生成,目前默认所有的均有单位,为了对齐 class X_GUI_GRIDPTY_EXPORT iGridRowItemUnt : public iGridRowItem { Q_OBJECT public: + explicit iGridRowItemUnt(iGridRowItem* pParent = nullptr); ~iGridRowItemUnt(); + virtual void setDlgBase(QWidget* p); + virtual void setParameter(iParameter* p); + + // 控件 + virtual void initEditor(); + virtual void configEditor(); + virtual void initOtherEditors(); + + virtual bool isInputOk(); + virtual void setActive(bool b); + // 范围 virtual void setBounds(QRectF& rt);//全局 virtual QRectF getRightBounds_Main();//右 - virtual QRectF getRightBounds_Unt(); + virtual QRectF getRightBounds_Unt(); // 单位以文本显示时的范围) + virtual QRectF getRightBounds_UntCbx();//单位以ComboBox显示时的范围 // 允许在外部调整参数,主要指的是产量单位,处理方/万方问题 + // 该函数暂未启用(调试时用过) virtual void setShowUnit(QString sUnit, QString sUnitRaw = ""); virtual QString getUnit(bool bUnitRaw = false); + virtual QVariant getInfoRight(); + virtual QString getInfoUnit(); + + virtual bool setCurValue(QVariant o); + virtual QVariant getCurValue(); + virtual QString getShowValue(); //非激活时显示在右侧的文本 + +protected slots: + + void slotUnitChanged(QString s); + + // QLineEdit 类型的数据change响应 + virtual void slotItemValueChanged(QString s); + + /// @brief 对于参数/单位绑定的情形,数据编辑,允许外部进行判断是否合理 + /// @param sPara 具体哪个参数,英文标识 + /// @param baseValue 基准数值,并非显示数值 + /// @param bValid 是否有效的数值,返回值 + virtual void slotValidateParaInput(const QString sPara, const double baseValue, bool& bValid); + protected: // 绘图 @@ -44,6 +81,18 @@ protected: protected: + ZxComboBox* m_pCbxUnits; + QStringList m_listUnitNames; + QStringList m_listUnitCodes; //对应的是ID + QString m_sCurUnit; + + iUnitGroup* m_pUnitGroup; //只是缓存 + + bool m_bUnableSP; //临时变量 + + // 两变量暂未启用(调试时用过) QString m_sUnit; QString m_sUnitRaw; //20250704 + + iUnitWxBinder* m_pUnitBinder; }; diff --git a/Include/iGui/iGuiGridPty/iGridRowUtils.h b/Include/iGui/iGuiGridPty/iGridRowUtils.h index fec89f3..39b0585 100644 --- a/Include/iGui/iGuiGridPty/iGridRowUtils.h +++ b/Include/iGui/iGuiGridPty/iGridRowUtils.h @@ -33,6 +33,13 @@ public: // 初始化 virtual void initUI(); + + // Header + virtual void setHeaderVisible(bool b); + virtual bool isHeaderVisible(); + +public: + #ifdef _SCAN_OLD_CODES_ // 对外暴露接口 virtual bool buildRowUtils(QStringList listParas, \ @@ -45,6 +52,7 @@ public: bool bDnMode, \ bool bProperOrder = true); #else + // 对外暴露接口 // 注:20260108,全面去除listParaTags参数接口 virtual bool buildRowUtils(QStringList listParas, \ @@ -66,68 +74,119 @@ public: int& nIndex); #endif - virtual void setParaItems(QVector& vec, \ - bool bDnMode, \ - QWidget* pWxDlg); + // 对外暴露接口 + // 允许在外部创建Item,然后传递进来, + // 该方式用的比较少 + virtual void buildRowUtilsEx(QVector& vec, \ + bool bDnMode, \ + QWidget* pWxDlg); - virtual void setBounds(QRectF& rt); - virtual double getUtilHeight(); +public: + /////////////////////////////////////////////////////////////////// + // 创建过程中,涉及到的一些操作 + + // 插入Item + virtual void insertItem(int nIndex, iGridRowItem* pItem); + + // 信号关联 virtual void connectSignalsOf(iGridRowItem* p); - virtual void bkAllItems(); - virtual QStringList getAllTags(); //不考虑层级 + + // 布局相关 + virtual void setBounds(QRectF& rt); + virtual double getUtilHeight(); virtual void resetLayout(); //流动段增减后重置 + + // 刷新 + virtual void updateItem(iGridRowItem* p); + + /////////////////////////////////////////////////////////////////// + + +public: + + // 得到所有的大节点Group + virtual QVector getAllGridGroupItems(); + + // 删除 + virtual void removeGridGroupItem(iGridRowItem* pItemG); + virtual void removeGridChildItem(iGridRowItem* pItemC); + + // 删除组中的一个节点 + virtual void removeGridItemFromGroup(iGridRowItem* pItemG, iGridRowItem* pItemC); + +public: + // 根据名字获取 virtual iGridRowItem* getItemByPara(QString sPara); //virtual iGridRowItem* getGridGroupItem(QString sTag); + // 根据名字取数据 virtual QVariant getItemValueByPara(QString sPara); - // 查询并处理 UseMdoe == 3 的参数,初始不显示 - virtual void dealwithHide(bool bHideMode, bool& bItemChanged); +public: - // 查询并处理 多相/单相切换 的参数,初始不显示 - virtual void deawithMpMode(bool bMultiPhase, bool& bItemChanged); + /////////////////////////////////////////////////////////////////// + // 一些特殊的处理部分 - virtual void dealwithItemOfs(ParaUseMode o, bool bHideMode, bool& bItemChanged); - // 清空 - virtual void clearAllItems(); + // 特殊处理:相互绑定,就是创建完成所有Item后,相关的关联 + // 目前只是实现了 产量段数 Nq 与 水平井长度L 绑定 + virtual void dealwithItemBinds(); - // Header - virtual void setHeaderVisible(bool b); - virtual bool isHeaderVisible(); + // 特殊处理:为一些参数设定一些初始值 + // 目前只是实现了 产量段数 Nq 的总产量 + virtual void dealwithItemSpValues(double d); - // 对Items进行检测,正确输入 - virtual bool checkItems(); + // 查询并处理 UseMdoe == 3 (PUM_ShowBySwap )的参数,初始不显示 + virtual void dealwithItemSwaps(bool bHideMode, bool& bItemChanged, bool bRelayoutIfNeeded = true); - // 刷新 - virtual void updateItem(iGridRowItem* p); + // 查询并处理 多相/单相切换 (PUM_MultiPhase) 的参数,初始不显示 + virtual void dealwithItemMp(bool bMultiPhase, bool& bItemChanged, bool bRelayoutIfNeeded = true); + // 内部显隐 + virtual void dealwithItemOfs(ParaUseMode o, bool bHideMode, bool& bItemChanged, bool bRelayoutIfNeeded = true); - virtual void insertItem(int nIndex, iGridRowItem* pItem); - //得到所有的大节点Group - virtual QVector getAllGridGroupItems(); - //删除 - virtual void removeGridGroupItem(iGridRowItem* pItemG); - virtual void removeGridChildItem(iGridRowItem* pItemC); - //删除组中的一个节点 - virtual void removeGridItemFromGroup(iGridRowItem* pItemG, iGridRowItem* pItemC); + // 如果孩子为空或者全部not visibie,那么本item隐藏 + virtual void dealwithNullParentItems(bool& bItemChanged, bool bRelayoutIfNeeded = true); - virtual void dealwithSegItem(QString sTag, double dNqAll); + // 从叶子节点,依次往上更新父级节点的可见性 + virtual void updateParentVisibilityOfItem(iGridRowItem* pItem, \ + bool& bItemChanged, \ + bool bRelayoutIfNeeded = true); // 获取属性页中,对应的第几个边界参数,顺序也是按照 m_pParaManager->getBdyRealNameOf(1); //对应 x1 // 把原来的"x1"之类,根据索引传递,查阅真实的,比如 ee,se,we,ne // xIndex 从1开始,即遇到"x1"则传入1 virtual QString getBdyRealNameOf(int xIndex); - // 参数来源标识,默认情况下,为 s_Sys_Para_Default - void setParaSrcTag(QString s); + /////////////////////////////////////////////////////////////////// + +public: + + virtual void bkAllItems(); + virtual QStringList getAllTags(); //不考虑层级 + + // 把所有Item从上到下(不考虑层级记录下来) + virtual bool getAllItems(QVector& vec); //不考虑层级 + + // 指针 + //const QVector& getGridItems() const; ////不考虑层级 + QVector* getVecGridItemPtrs(); + QVector* getVecAllItemPtrs(); + + // 清空 + virtual void clearAllItems(); + + // 对Items进行检测,正确输入 + virtual bool checkItems(); protected: // 按键 virtual void keyPressEvent(QKeyEvent* e); + virtual bool eventFilter(QObject* obj, QEvent* event); + void installAllItemEvents(); /// @brief 获取当前激活的Item的索引,在全局m_vecAllItems中 /// @param bStrict 为true:取的item 处于激活同时hasFocus @@ -144,25 +203,19 @@ protected: // 搭建过程 virtual QStringList getParaTypes(QStringList listParas); + virtual bool createAndAddItem(iGridRowItem* pParent, \ iParameter* p, QString sPara); virtual iGridRowItem* createWithSegOlds(iGridRowItem* pParent, \ iParameter* p, QString sPara);//兼容原先,没有配置ParaType - - // 这是一些特殊处理,就是创建完成所有Item后,相关的关联 - // 如 产液段与有效长度 - virtual void bindItems(); - - // 把所有Item从上到下(不考虑层级记录下来) - virtual bool getAllItems(QVector& vec); //不考虑层级 - - // 范围及布局 virtual void setSplitPos(double d); virtual void updateLayout(); virtual void doLayout(); +protected: + // 右键拷贝数据 virtual void copyDataBy(CopyDataMode o); virtual bool collectsDataBy(CopyDataMode o, QVector& vec); @@ -195,6 +248,11 @@ public slots: virtual void slotGetValueOf(QString sPara, QVariant& o, bool& bOk); + + // 绑定unit + virtual void slotUnitWxBind(QLineEdit* pTbx, QComboBox* pUnit, QString sPara, bool bBindOnly); + + public slots: // 右键 @@ -281,6 +339,20 @@ signals: QVariant& vCustom, \ bool& bModified); + /// @brief 触发信号由外部对子项进行调整,比如干扰的xf与常规的不一致 + /// @param sName: (in) 参数标识,为英文标识 + /// @param listSubItemNames: (in & out) 调整后的子项 + /// @param listSubItemAliass: (in & out) 调整后的子项别称 + void sigAdjustSubItems(const QString sName, \ + QStringList& listSubItemNames, \ + QStringList& listSubItemAliass); + +public: + + void adjustSubItemNames(const QString sName, \ + QStringList& listSubItemNames, \ + QStringList& listSubItemAliass); + protected: // 节点操作及属性更改 @@ -309,6 +381,7 @@ public: // 从各个Wx(m_vecWxDatas)中遍历查找 virtual bool setParaValue(QString sPara, QVariant o); virtual bool getParaValue(QString sPara, QVariant& o); + // 返回所有参数,Key为英文ID virtual bool getAllParaValues(QMap& map, bool bOnlyFitted = false, @@ -324,12 +397,15 @@ public: virtual bool getBdyInfos(QMap& map); public: + // 20260107开始扩充,与层有关的内容 // 获取当前所在的父级层的标识,可能为空 virtual QString getUpperLayerTagOf(iGridRowItem* pItem); + // 获取当前所在的父级层的Index(第几层),从0开始,如果没找到,则为-1 virtual int getUpperLayerIndexOf(iGridRowItem* pItem); + // 是否层内节点(不考虑层内本身的层级) virtual bool isUpperLayerInnerOf(iGridRowItem* pItem); @@ -363,7 +439,4 @@ protected: protected: - // 参数来源标识,默认情况下,为 s_Sys_Para_Default - // 不涉及序列化 - QString m_sParaSrcTag; }; diff --git a/Include/iGui/iGuiRibbon/iWxGroupBar.h b/Include/iGui/iGuiRibbon/iWxGroupBar.h index c5df10c..477c4f9 100644 --- a/Include/iGui/iGuiRibbon/iWxGroupBar.h +++ b/Include/iGui/iGuiRibbon/iWxGroupBar.h @@ -13,7 +13,7 @@ class I_GUI_RIBBON_EXPORT iWxGroupBar : public QWidget public: - explicit iWxGroupBar(iRibbonXmlGroup* pGroupXml = NULL, \ + explicit iWxGroupBar(iRibbonXmlGroup* pGroupXml = nullptr, \ QWidget *parent = 0); ~iWxGroupBar(); diff --git a/Include/iPlot/iPlotCurveT/ZxPlot.h b/Include/iPlot/iPlotCurveT/ZxPlot.h index d14f63c..502dcba 100644 --- a/Include/iPlot/iPlotCurveT/ZxPlot.h +++ b/Include/iPlot/iPlotCurveT/ZxPlot.h @@ -128,6 +128,11 @@ public: virtual bool zoomPlot(QRectF rtTracker); + // 鼠标按住 + 滚轮时,缩放Plot主坐标轴范围,而不是缩放整个视图 + virtual bool zoomMainAxisByWheel(const QPointF& ptScene, + int delta, + int modifiers = 0); + protected: virtual ZxObjBase* _createObjOf(const PlotObjectType& oType, \ diff --git a/Include/iPlot/iPlotCurveT/ZxPlot.h.bak b/Include/iPlot/iPlotCurveT/ZxPlot.h.bak new file mode 100644 index 0000000..d14f63c --- /dev/null +++ b/Include/iPlot/iPlotCurveT/ZxPlot.h.bak @@ -0,0 +1,200 @@ +#pragma once + +#include "ZxPlotBase.h" + +class ZxObjBase; + +// 绘图载体再次封装,其实大部分绘图都是基于本类来实现 +class I_PLOTCURVE_T_EXPORT ZxPlot : public ZxPlotBase +{ + Q_OBJECT + ZX_DECLARE_DYNAMIC + +public: + + ZxPlot(); + ZxPlot(ZxRenderView* pView); + ~ZxPlot(); + +public: + + virtual void paintBack(QPainter* painter, + const ZxPaintParam& param); + virtual void paintBounds(QPainter* painter); + + // 布局 + virtual void onLayout(); + + // 上下文菜单 + virtual void onPrepareContextMenu(QMenu *pMenu, const QPointF &pos); + + // 20250219 新增接口,把所有子对象设置fix,不用readonly是因为ZxObjBase有该接口 + virtual void setAllObjsFixed(bool bFixed); + +public: + + // 鼠标 + virtual bool onLeftDown(const QPointF& pt); + virtual bool onLeftUp(const QPointF& pt); + virtual bool onMouseMove(const QPointF& pt); + virtual void onLeftDoubleClick(const QPointF& pt); + + // Tips + virtual void onShowTips(const QPointF& pt); + + // 删除(这是响应键盘Delete键) + virtual void onDeleteItem(); + virtual void deleteCurvePtsWithin(QRectF rt); + + // 属性填充 + virtual void fillPtyPano(IxPtyPano* sheet); + + // 序列化 + virtual void onSerialize(ZxSerializer* ser); + virtual void onDeserialize(ZxSerializer* ser); + virtual void onDeserialized(); + + // 模版序列化 + virtual void onLoadTempl(ZxSerializer* ser); + virtual void onSaveTempl(ZxSerializer* ser); + + // 重新绑定相互关联的 + virtual void onDeserializedReBounds(); + +public: + + // 布局 + virtual bool checkNeedLayout(); + virtual QRectF getNetBounds(); //去除Margin + virtual QRectF getInnerChartArea(QRectF rt); //内部绘图区,不包括坐标轴和标题区 + + double getTitleHeight(); //获取标题的高度 + double getNaviBarHeight(); //获取NaviBar高度 + + virtual double getAxisDisOf(AxisPos oPos); + virtual QVector getVisibleAxisOf(AxisPos oPos); + + // 坐标数值转换(屏幕坐标与实际坐标) + // 注意:Value表示实际坐标、Pos表示屏幕坐标 + // getValueForPos: 已知屏幕坐标,求实际坐标 + // getPosForValue: 已知实际坐标,求屏幕坐标 + virtual QPointF getValueForPos(QPointF& pt) const; + virtual QPointF getPosForValue(QPointF& pt) const; + virtual QVector getValueForPos(QVector& vecPts) const; + virtual QVector getPosForValue(QVector& vecPts) const; + +protected: + + // 布局Title,并且返回其Bound + virtual QRectF layoutTitle(QRectF rtLast, int nPos); + + // NaviBar + virtual QRectF layoutNaviBar(QRectF rtLast); + + // 上下左右侧坐标轴 + virtual QRectF layoutAxisOf(QRectF rtLast, AxisPos oPos); + virtual void _layoutAxisOf(QMap& map, \ + QRectF rt, AxisPos oPos); + +public: + + // 是否以正方形网格化显示,对于双对数有效 + bool isSquareGrid() const; + void setSquareGrid(bool b); + + // 只有m_bSquareGrid为true且xy为双对数 + bool checkSquareGridMode(double& w, double& h); + + // 是否正在执行插入新对象的操作 + bool isInserting(); + + // 特征线斜率 Special line ratio,权宜之计 + double getLineSlope() const; + void setLineSlope(double d); + + // 统一的增加接口,调用下面的创建和添加 + virtual ZxObjBase* addOneObj(const PlotObjectType& oType, + QString& sName, + bool bAppend = true, + ZxSubAxisX* pAxisX = nullptr, + ZxSubAxisY* pAxisY = nullptr, + bool bY2 = false); + + virtual bool addOneObj(ZxObjBase* pObj, + bool bAppend = true, + ZxSubAxisX* pAxisX = nullptr, + ZxSubAxisY* pAxisY = nullptr, + bool bY2 = false); + + virtual bool zoomPlot(QRectF rtTracker); + +protected: + + virtual ZxObjBase* _createObjOf(const PlotObjectType& oType, \ + QString& sName); + // 添加 + virtual void _appendObjOf(ZxObjBase* pObj); + + +protected: + + // 当对象选中后,右键关于顺序调整的菜单 + virtual void prepareMenuOfObjOrder(QMenu *pMenu, ZxObjBase* pObj); + +public: + + // 响应从ZxCmdTool过来的鼠标处理 + virtual bool runCmdSelect(PlotOperationMode o, \ + const QPointF& ptStart, \ + const QPointF& ptEnd); + virtual bool runCmdHitPoint(PlotOperationMode o, \ + const QPointF& pt); + + // 获取第一个选择的对象,后续再考虑多选TODO + virtual ZxObjBase* getSelectedObj(bool bFirstOnly = true); + +public slots: + + virtual void slotShowCurveData(); + virtual void slotClearPointsSelection(); + + virtual void slotSendToBack(); + virtual void slotSendBackward(); + virtual void slotBringForward(); + virtual void slotBringToFront(); + +signals: + + // 触发信号,允许外界处理鼠标HitPoint + void sigCmdHitPoint(PlotOperationMode o, \ + const QPointF& pt, \ + bool& b); + + void sigUpdate(); + void sigShowCurveData(ZxObjCurveBase*); + + // 当某个数据对象右键选中时,触发调整右键菜单 + void sigAdjustContextMenuBy(ZxObjBase* pObj, QMenu* pMenu); + + // 允许外界进行属性填充,bAtEnd false表示在一开始 true 表示在最后 + void sigAdjustPano(IxPtyPano* sheet, bool bAtEnd); + +protected: + + // 是否以正方形网格化显示,对于双对数有效 + bool m_bSquareGrid; + + // 临时标示,左键按下 + bool m_bLButtonDown; + + // 权宜之计 + QPainter* m_pPainter; + + // 权宜之计,其实不应该这么处理,不涉及序列化 + // 这是针对特征线时后的斜率值 + double m_dLineSlope; +}; + + + + diff --git a/Include/iPlot/iPlotCurveT/tCurvePlotView.h b/Include/iPlot/iPlotCurveT/tCurvePlotView.h index a66ee1e..e0c9097 100644 --- a/Include/iPlot/iPlotCurveT/tCurvePlotView.h +++ b/Include/iPlot/iPlotCurveT/tCurvePlotView.h @@ -5,6 +5,8 @@ #include "iPlotCurveT_global.h" +class QWheelEvent; + // 图视图 class I_PLOTCURVE_T_EXPORT tCurvePlotView : public ZxRenderView @@ -81,6 +83,9 @@ protected: void dropEvent(QDropEvent* event); void mouseMoveEvent(QMouseEvent* e); + // Ctrl+滚轮缩放Plot坐标轴,不再缩放整个RenderView视图 + virtual void wheelEvent(QWheelEvent* e); + void focusOutEvent(QFocusEvent *); void leaveEvent(QEvent *); diff --git a/Include/iPlot/iPlotCurveT/tCurvePlotView.h.bak b/Include/iPlot/iPlotCurveT/tCurvePlotView.h.bak new file mode 100644 index 0000000..a66ee1e --- /dev/null +++ b/Include/iPlot/iPlotCurveT/tCurvePlotView.h.bak @@ -0,0 +1,97 @@ +#pragma once + +#include "ZxRenderView.h" +#include "tCurvePlotScene.h" + +#include "iPlotCurveT_global.h" + +// 图视图 +class I_PLOTCURVE_T_EXPORT tCurvePlotView + : public ZxRenderView +{ + Q_OBJECT + + ZX_DECLARE_DYNAMIC + +public: + + tCurvePlotView(); + +public: + + // 获取Scene,仅仅类型转换 + tCurvePlotScene* getScene() const; + + virtual QRectF adjustRectFitViewAspect(const QRectF& rect); + + + // 准备右键菜单 + virtual void onPrepareContextMenu(QMenu* pMenu, + const QPointF& pos); + + // 图示简易模式(不显示缩放、不有滚动条) + virtual void setSimpleMode(bool bSimpleMode); + +public slots: + + virtual void slotSaveAsImg(); + virtual void slotCopyAsImg(); + + virtual void slotShowHideTitle(); + virtual void slotShowHideLegend(); + + virtual void slotUndo(); + virtual void slotRedo(); + +#ifdef _SACN_OLD_CODES_ + virtual void slotOptAxisXY(); + virtual void slotOptAxisX(); + virtual void slotOptAxisY(); + +public: + + virtual void optMainAxisScale(bool bX); +#endif + +signals: + + // 由于本来不依赖数据对象,所有通过信号槽关联出去 + void sigCheckDragAccepted(QDragEnterEvent*, bool&); + void sigDealwithDrop(QDropEvent*); + void sigMousePosChanged(const QPointF &pos); + + // 获取额外的tips,比如 探测半径 + void sigGetTipsExOfPos(QString& sTip, double dX, double dY); + + // 状态栏 + void sigFresh2Status(QString& s); + + // 允许外部进行菜单调整,通常是插入,默认是在 Redo/Undo 与保存图片 之间 + void sigAdjustContextMenu(QMenu* pMenu); + +#ifdef _SACN_OLD_CODES_ + // 优化显示坐标轴 + void sigOptMainAxisScale(bool); +#endif + +protected: + + /// @brief 拖拽支持 + void dragEnterEvent(QDragEnterEvent *event); + void dropEvent(QDropEvent* event); + void mouseMoveEvent(QMouseEvent* e); + + void focusOutEvent(QFocusEvent *); + void leaveEvent(QEvent *); + +protected: + + bool m_bSimpleMode; //是否简易模式 + + // 拖拽模式 + bool m_bDraging; + }; + + + + diff --git a/Include/iPlot/iPlotWxT/iPlotBaseWxT.h b/Include/iPlot/iPlotWxT/iPlotBaseWxT.h index 7a60bdb..30e2f39 100644 --- a/Include/iPlot/iPlotWxT/iPlotBaseWxT.h +++ b/Include/iPlot/iPlotWxT/iPlotBaseWxT.h @@ -70,6 +70,9 @@ protected: // 处理Resize,主要是正方形网格 bool changeToSize(QSize sz, bool bResizeMode); + //ZXF20260629增加一个函数 设置 坐标轴的最大最小(这里不设置导致 图无法恢复到原来状态) + void setResetAxisValue(); + public slots: virtual void slotChangeSizeWithChangedXY(); diff --git a/Include/iPlot/iPlotWxT/iPlotBaseWxT.h.bak b/Include/iPlot/iPlotWxT/iPlotBaseWxT.h.bak new file mode 100644 index 0000000..7a60bdb --- /dev/null +++ b/Include/iPlot/iPlotWxT/iPlotBaseWxT.h.bak @@ -0,0 +1,124 @@ +#pragma once + +#include "Defines.h" + +#include "IxSerDes.h" +#include "ZxXpf.h" +#include "ZxSerializer.h" +#include "iPlotWxT_global.h" + +class tCurvePlotScene; +class tCurvePlotView; +class ZxPlot; +class ZxObjCurve; +class tCurveObjFlow; +class ZxSubAxisBase; +class ZxObjCurveBase; + +// 这是最基础的绘图窗体 +class I_PLOTWX_T_EXPORT iPlotBaseWxT : public QWidget, + virtual public IxSerDes +{ + Q_OBJECT + +public: + explicit iPlotBaseWxT(QWidget *parent = 0); + ~iPlotBaseWxT(); + + // 初始化UI + virtual void initUI(QString sTitle, + QSize szDefault = QSize(265, 203)); + + virtual void clearAllPlots(); + +public: + + // 坐标轴相关设置 + virtual void setAxisX(QString sName, QString sUnit = ""); + virtual void setAxisY(QString sName, QString sUnit = "", bool bY2 = false); + virtual void setAxisXY(int nIndexXY, QString sName, QString sUnit = ""); + virtual void setAxisScaleX(double dMin, double dMax, VecDouble& vecTicks); + virtual void setAxisScaleY(double dMin, double dMax, VecDouble& vecTicks, \ + bool bAdjustSpan = false, double dPreferedSpan = -1.0); + virtual void setAxisScaleY2(double dMin, double dMax, VecDouble& vecTicks); + virtual void setAxisScaleXY(int nIndexXY, double& dMin, double& dMax, VecDouble& vecTicks); + virtual void setAxisXYLog(bool bLogAxis, int nIndexXY); + + // nIndexXY:0 x轴,1 左侧y轴,2 右侧y轴 + ZxSubAxisBase* getAxisOf(int nIndexXY); + void copyAxisScalesTo(iPlotBaseWxT* pDest, int nIndexXY = -1); + + // 设置x轴的基准时间 + void setAxisBaseDtX(QDateTime dt); + QDateTime getAxisBaseDtX() const; + + virtual void connectSignals(); + + // 序列化 + virtual void onSerialize(ZxSerializer* ser); + virtual void onDeserialize(ZxSerializer* ser); + virtual void resetAfterDeserialized(); + +protected: + + virtual void initChartView(QString sTitle, QSize szDefault); + virtual void resizeEvent(QResizeEvent *); + virtual void paintEvent(QPaintEvent *); + // 窗体关闭的情形 + virtual void closeEvent(QCloseEvent *); + + // 处理Resize,主要是正方形网格 + bool changeToSize(QSize sz, bool bResizeMode); + +public slots: + + virtual void slotChangeSizeWithChangedXY(); + + // 缩放复原 + virtual void zoomReset(); + + /// 响应信号:对于临时图层的特殊处理,比如在绘图图元移动过程中,隐藏(如果已经显示)十字线 + virtual void slotSaveTempLayerStates(); + virtual void slotRestoreTempLayerStates(); + +signals: + + void sigZoomReset(); + + // 在关闭的消息函数中触发 + void sigConfirmClosing(bool& bClosable); + +public: + + // 内部变量 + tCurvePlotView* m_pPlotView; + tCurvePlotScene* m_pPlotScene; + ZxPlot* m_pPlot; + +protected: + + QLayout* m_pMainLayout; + + // 记录各坐标轴原始状态 + // 为了回归原始 + double m_dMaxX; + double m_dMinX; + double m_dMaxY; + double m_dMinY; + double m_dMaxY2; + double m_dMinY2; + VecDouble m_vecTicksX; + VecDouble m_vecTicksY; + VecDouble m_vecTicksY2; + + // 信号槽标识开关 + bool m_bUnableSP; + + // 是否启用新的样式表,ZXF202407 + bool m_bNovelQss; + + // 临时,不涉及序列化 + bool m_bLastShowCrossLine; + bool m_bLastShowTips; +}; + diff --git a/Include/mAlg/mAlgDefines/iParaManager.h b/Include/mAlg/mAlgDefines/iParaManager.h index 0e030bf..bc3e275 100644 --- a/Include/mAlg/mAlgDefines/iParaManager.h +++ b/Include/mAlg/mAlgDefines/iParaManager.h @@ -79,6 +79,17 @@ public: //得到常数参数3.6-3.55292376017765 double getSpecialConstant(); + // 获取渗透率数值,通常是K但是也有可能是其他 + // 比如计算探测半径时用的K值为哪一个? + bool getPossibleValueK(double& d); + + /// @brief 获取这些参数标识的数值 + /// @param d,结果 + /// @param listKeys具体哪些参数 + /// @param n:计算方式,0:取存在的第一个 1:取存在的最后一个 2/2+:取存在的所有的算术平均 + /// @note 如果全都不存在,则返回false + bool getPossibleValueOf(double& d, const QStringList listKeys, int n = 0); + public: // 计算CD入口函数 @@ -99,6 +110,14 @@ public: virtual bool calPDIM_Wxd(); virtual bool calRcIM(); virtual bool calRc(); + /// @brief 计算探测半径的具体实现函数 + /// @param dRc,返回的结果,单位:m + /// @param dt,测试时间,单位:h + /// @param dRcIM,为过程中间变量,具体参见 calRcIM ,其实就是 K / (phi * Miuo * Ct) + /// 如果不传入,则认为需要重新进行计算 + /// @note 涉及两处, 一是解释结果,含义:这次试井测试,从开始到结束,压力波最远传到了哪里 + /// 二是鼠标移动过程tips,含义:在测试过程中,压力波此时此刻传到了哪里 + virtual bool calRc(double& dRc, double dt, double dRcIM = SYS_VALUE_INVALID); // 普通井的量纲转换需要变化 virtual bool calTDIMCommon(double& A); diff --git a/Include/mAlg/mAlgDefines/mAlgDefines.h b/Include/mAlg/mAlgDefines/mAlgDefines.h index e603fb7..7c96b83 100644 --- a/Include/mAlg/mAlgDefines/mAlgDefines.h +++ b/Include/mAlg/mAlgDefines/mAlgDefines.h @@ -153,6 +153,8 @@ enum m_Res_Type RT_TRI_K = 116, //三孔拟稳态 RT_TRI_K_EX = 117, //三孔单渗嵌套拟稳态(暂时屏蔽,20260417模型整合) + + ////////////////////////////////////////////////////////// // 如下全部暂时屏蔽,不再启用,从2024年开始 @@ -183,6 +185,8 @@ enum m_Res_Type // RT_COMP3 = 108, //三区复合 RT_SR_COMP = 350, //径向复合,就是双区 + RT_COMP = 351, //径向复合,20260720,xieh针对直井再次增加,部分流程模拟了 RT_SR_COMP + // 其他废弃 // RT_SR_HMGE, //均质油藏 @@ -352,6 +356,7 @@ struct zxFitParaInfo #define s_Ipr_Source "IprSource" #define s_Ipr_Fit "IprFit" #define s_Ipr_FitEx "IprFitEx" + #define s_Ipr_Result "IprResult" #define s_Ipr_ResultEx "IprResultEx" diff --git a/Include/mData/mModuleDefines/mModuleDefines.h b/Include/mData/mModuleDefines/mModuleDefines.h index d0111af..0a05048 100644 --- a/Include/mData/mModuleDefines/mModuleDefines.h +++ b/Include/mData/mModuleDefines/mModuleDefines.h @@ -80,6 +80,10 @@ #define s_Tag_IPR_EN "IPR" #define s_Tag_IPR_CN QObject::tr("Inflow Performance Relationship") +// WDT +#define s_Tag_WDT_EN "WDT" +#define s_Tag_WDT_CN QObject::tr("Well production test") + // 注入 #define s_Tag_Inject_EN "Inject" #define s_Tag_Inject_CN QObject::tr("Injection Of CO2") @@ -152,9 +156,15 @@ #define s_Tag_Pressure_EN "Pressure" #define s_Tag_FlowRate_EN "FlowRate" -#define s_Tag_Pressure_CN QObject::tr("Pressure") +#define s_Tag_Pressure_CN QObject::tr("Pressure") +#define s_Tag_FlowRate_CN QObject::tr("FlowRate") + +#define s_Tag_Temp_EN "Temprature" +#define s_Tag_Temp_CN QObject::tr("Temprature") +#define s_Tag_PresAndTemp_EN "Pressure" +#define s_Tag_PresAndTemp_CN QObject::tr("PressureAndTemp") + #define s_Tag_Pressure_CN_Avg QObject::tr("AvgP") -#define s_Tag_FlowRate_CN QObject::tr("FlowRate") #define s_Tag_ProdOil_EN "ProdOil" #define s_Tag_ProdOil_CN QObject::tr("ProdOil") @@ -172,6 +182,7 @@ #define s_Axis_NameY_P s_Tag_Pressure_CN #define s_Axis_NameY_PGas s_Tag_PressurePse_CN #define s_Axis_NameY_F s_Tag_FlowRate_CN +#define s_Axis_NameY_T s_Tag_Temp_CN #define s_Axis_NameX_R QObject::tr("Radius") #define s_Axis_NameY_Vis QObject::tr("Vis") @@ -229,6 +240,7 @@ #define s_Wdt_Wel QObject::tr("Wel") #define s_Wdt_SubWel QObject::tr("SubWel") #define s_Wdt_Method QObject::tr("Method") +#define s_Wdt_AnalOption QObject::tr("AnalOption") #define s_Wdt_P_Pseu QObject::tr("P_Pseu") #define s_Wdt_P_Square QObject::tr("P_Square") @@ -371,6 +383,19 @@ enum Model_Option_Type }; +// 当前数据对应的类型 +enum GaugeDataType +{ + GGDT_Pressure = 0, //压力数据 + GGDT_Temp, //温度 + GGDT_Fluid, //流量,通常指的主相,原先意义的流量 + GGDT_OGW_O, //油气水-油 + GGDT_OGW_G, //油气水-气 + GGDT_OGW_W, //油气水-水 + GGDT_Unkown // +}; + + // 分析的第几步 enum AnalStepOption { @@ -425,9 +450,23 @@ enum AnalWxIndex AWI_Unknown }; + // 只是为了方便,使用这个计数而言 #define AWI_AnalCount AWI_ModelOption +/// 结构体定义 +/// 输入参数数据体 +/// 主要用于批量相关的处理 +struct para_input_info +{ + QString sName; + QString sAlias; + QString sUnit; + QVariant oValue; + + bool bValid; +}; + ///////////////////////////////////////// // macros ///////////////////////////////////////// diff --git a/Include/mData/mModuleDefines/mTagDefines.h b/Include/mData/mModuleDefines/mTagDefines.h index 6c0928f..008aee6 100644 --- a/Include/mData/mModuleDefines/mTagDefines.h +++ b/Include/mData/mModuleDefines/mTagDefines.h @@ -56,6 +56,7 @@ #define s_Axis_UnitY_W "m^3/d" //#define s_Axis_UnitY_PGas "MPa^2/cp" #define s_Axis_UnitY_PGas "MPa^2/mPa.s" +#define s_Axis_UnitY_T QStringCH("℃") // WTAI大的模型分类,导航中选定等,目前暂时保留,后续会逐步屏蔽 #define s_Tag_LP_EN "LP" diff --git a/Include/mData/mProjectManager/DataModels/ZxDataGaugeBase.h b/Include/mData/mProjectManager/DataModels/ZxDataGaugeBase.h index 84c43f5..185bb09 100644 --- a/Include/mData/mProjectManager/DataModels/ZxDataGaugeBase.h +++ b/Include/mData/mProjectManager/DataModels/ZxDataGaugeBase.h @@ -1,5 +1,6 @@ #pragma once +#include "mModuleDefines.h" #include "ZxDataObjectStrUser.h" // 测量类数据(基类) @@ -8,6 +9,8 @@ class M_PROJECTMANAGER_EXPORT ZxDataGaugeBase { ZX_DECLARE_DYNAMIC +public: + public: ZxDataGaugeBase(); @@ -69,7 +72,7 @@ public: void setGaugeName(const QString& s); QString getGaugeName() const; - bool isPressure() { return m_bPressure; } + GaugeDataType getGgdt() { return m_oGgdt; } protected: @@ -80,7 +83,7 @@ protected: QByteArray m_baGaugeData; QString m_sGaugeName; - bool m_bPressure; + GaugeDataType m_oGgdt; }; diff --git a/Include/mData/mProjectManager/DataModels/ZxDataWell.h b/Include/mData/mProjectManager/DataModels/ZxDataWell.h index bc75c8c..d3bfa3d 100644 --- a/Include/mData/mProjectManager/DataModels/ZxDataWell.h +++ b/Include/mData/mProjectManager/DataModels/ZxDataWell.h @@ -53,6 +53,7 @@ public: virtual bool createChildrenLayer(); virtual bool createChildrenGuageP(); virtual bool createChildrenGuageF(); + virtual bool createChildrenGuageT(); virtual bool createChildrenGas(); virtual bool createChildrenWellBore(); diff --git a/Include/mData/mSysUtilsWDT/wdtDefineAnal.h b/Include/mData/mSysUtilsWDT/wdtDefineAnal.h new file mode 100644 index 0000000..8fa8b69 --- /dev/null +++ b/Include/mData/mSysUtilsWDT/wdtDefineAnal.h @@ -0,0 +1,33 @@ +#pragma once + +#include "wdtDefineBase.h" +#include "mSysUtilsWDT_global.h" + +class wdtAlgItem; + +// 产能方法定义(某井型-井别-Method 之下 的AnalOption) +class M_SYSUTILS_WDT_EXPORT wdtDefineAnal : public wdtDefineBase +{ +public: + + wdtDefineAnal(); + ~wdtDefineAnal(); + + // 把List分配到成员变量 + // 输入开始的m_listValues中index,并且返回下一个index + virtual int allocateInfo(int nIndex); + +protected: + virtual void initXmlTags(); + +public: + + // 绑定的AlgItem + wdtAlgItem* m_pAlgItem; + + int m_nDefaultRows; //默认显示多少行 + QString m_sUnit; +}; + + +typedef QVector vecWdtAnalDefinesPtr; diff --git a/Include/mData/mSysUtilsWDT/wdtDefineMethod.h b/Include/mData/mSysUtilsWDT/wdtDefineMethod.h index 6cde7f1..b3a39c9 100644 --- a/Include/mData/mSysUtilsWDT/wdtDefineMethod.h +++ b/Include/mData/mSysUtilsWDT/wdtDefineMethod.h @@ -5,6 +5,8 @@ class wdtAlgItem; +#include "wdtDefineAnal.h" + // 产能方法定义(某井型-井别 之下 的方法) class M_SYSUTILS_WDT_EXPORT wdtDefineMethod : public wdtDefineBase { @@ -13,6 +15,9 @@ public: wdtDefineMethod(); ~wdtDefineMethod(); + // 解析xml节点到List + virtual void parseInfo(const QDomElement& e); + // 把List分配到成员变量 // 输入开始的m_listValues中index,并且返回下一个index virtual int allocateInfo(int nIndex); @@ -24,6 +29,8 @@ public: // 绑定的AlgItem wdtAlgItem* m_pAlgItem; + + vecWdtAnalDefinesPtr m_vecWdtAnalDefines; }; diff --git a/Include/mData/mSysUtilsWDT/wdtSysUtilsHelper.h b/Include/mData/mSysUtilsWDT/wdtSysUtilsHelper.h index 0f349dd..b96a751 100644 --- a/Include/mData/mSysUtilsWDT/wdtSysUtilsHelper.h +++ b/Include/mData/mSysUtilsWDT/wdtSysUtilsHelper.h @@ -8,6 +8,7 @@ class iParameter; class wdtDefineWel; class wdtDefineSubWel; class wdtDefineMethod; +class wdtDefineAnal; class wdtAlgItem; class wdtAlgItemGroup; @@ -28,6 +29,7 @@ public: wdtDefineWel* getWdtWelDefine(QString sNameOrId); wdtDefineSubWel* getWdtSubWelDefine(QString sNameOrId, QString sNameOrIdWel); wdtDefineMethod* getWdtMethodDefine(QString sNameOrId, QString sNameOrIdWel, QString sNameOrIdSubWel); + wdtDefineAnal* getWdtAnalDefine(QString sNameOrId, wdtDefineMethod* p); QVector* getWdtAlgGroupPtrs(); wdtAlgItemGroup* getWdtAlgGroup(QString sNameOrId); diff --git a/Include/mGui/mGuiDataLoad/iWxDataLoad.h b/Include/mGui/mGuiDataLoad/iWxDataLoad.h index ca360ba..d0bd3a4 100644 --- a/Include/mGui/mGuiDataLoad/iWxDataLoad.h +++ b/Include/mGui/mGuiDataLoad/iWxDataLoad.h @@ -2,6 +2,7 @@ #include "iDlgBase.h" +#include "iFileEngine.h" #include "mGuiDataLoad_global.h" #include "iWxPressError.h" @@ -11,7 +12,7 @@ class iWxDataLoad; class ZxTableView; class ZxTableModel; -class ZxTableHeaderView; +class tTableHeaderViewUnit; class ZxPlot; class iGuiPlot; class ZxDataWell; @@ -29,6 +30,9 @@ public: { dtPressure = 0, //压力数据 dtFluid, //流量 + dtPresAndTemp, //温度+压力 + dtTemp, //温度 + dtOGW, //油气水,多相 dtAuto, //自动判断 dtUnkown // }; @@ -56,6 +60,8 @@ private: // 初始化 void initTitle(); // + QString getTagOfTitle(); + void initUI(); // 初始化各个子布局 @@ -65,9 +71,11 @@ private: QWidget* initUI_Charts(); void intUiBtns(); void initWells(); - void initUnits(); void initDataTag(); - QString getDefaultTag(bool bF); + + // 0,1,2分别对应压力、温度、流量 + QString getDefaultTag(int n = 0); + private: @@ -81,6 +89,24 @@ private: // 调用默认,配置表头 void initDefaultTableTitles(); + // 软件启动之后,表格的初始化(数据+表头) + void reCacheTableTitles(); + void reCacheDefaultData(bool bAutoFill = false); + void resetTableTitles(const QStringList& listTitles); + + // 一旦加载完成,查验m_oRst有几个时间,并作相应调整 + void fuzzyDtIndexFromRst(); + + // 一旦加载完成,从当前得到的m_oRst中重置表头 + void fuzzyTableTitlesFromRst(); + + // 得校正一下,看是否当前系统配置的单位 + bool checkAndAdjustUnit(QString& sUnit); + + // 根据表格标题,获取其对应的单位 + // 该单位是数据源单位,与后台配置无关,可以来自数据文件,也可以是指定 + QString getDataUnitOf(const QString& sTitle); + // 如果既有日期、又有时间列,则自动判断调整日期格式 void checkDateTimeSeparated(); @@ -94,7 +120,7 @@ private: QStringList getFirstRowCellOf(QVector listIndexes); bool checkStartDt(); - bool checkDataTag(bool bF); + bool checkDataTag(); // 检测时间格式,并根据当前数据进行细微调整 bool fuzzyFormatDT(QString& sFormatDT, \ @@ -104,8 +130,16 @@ private: // 获取当前的两列数据 +#ifdef _SCAN_OLD_CODES_ QByteArray sumCurData(VVecVariant& vvec, int nSample, \ int nIndexT1, int nIndexT2, int nIndexD); +#endif + bool sumCurData(VVecVariant& vvec, int nSample, \ + const QMap& mapCols, \ + VecDouble& vecX, \ + QMap& mapYs, \ + int& nIndexD); + VVecVariant getFilteredData(); int getDataRowStep(int nCount); @@ -137,7 +171,7 @@ private: // 处理起始时间、单位等等 void dealWithStartTime(); - void dealWithUnits(VecDouble& vecX, VecDouble& vecY); + void dealWithUnits(VecDouble& vec, int nColIndex, bool bX); void convertValueByUnit(QString sOld, QString sNew, VecDouble &vec); void adjustFlowRates(VecDouble& vecX, VecDouble& vecY); @@ -147,28 +181,30 @@ private: // 如果当前还有一个没有选择,则自动选择 void dealLastColAuto(int n, QString s); - // 获取表头位置索引 - bool getTitleIndexes(int& nIndexD, int& nIndexT1, int& nIndexT2); + // 即m_listTargetTitles对应的各个列索引 + bool getTitleIndexes(QMap& map); + bool getDtIndexFrom(const QMap& map, int& nIndexT1, int& nIndexT2); + bool getValueIndexFrom(const QMap& map, QMap& mapColVs); + + // 获取最小的,必须设置的列,以便继续保存 + QStringList getMustDataTags(); + bool isMustDataTag(QString s); + // 获取绘图时的XY轴标题 bool getTitleOfAxisXY(QString& sNameX, QString& sNameY, QString& sUnitX, QString& sUnitY); - void freshFromTos(); + ZxDataWell* getTargetWell(); - // 当前表格数据存入数据库 - bool saveData(); + void freshFromTos(bool bIgnoreFrom, int nFrom = 1); // 执行与实现 void runLoad(); void fillExcelSheets(); - - void runByTableColSelection(const int, const QString); - bool checkData(VecDouble& vecX, VecDouble& vecY); - private slots: // 各个按钮 @@ -195,7 +231,6 @@ private slots: // 日期模式 void on_cbxDtFormat_currentIndexChanged(const QString &arg1); void on_cbxDateTimeSeparated_clicked(); - void on_cbxFormat_currentIndexChanged(const QString &arg1); // 其它消息 @@ -227,7 +262,8 @@ private slots: void slotSetAsRowEnd(); // 这是允许外界对粘贴板内容进行解析,解析为二维表格数据 - void slotParseContents(const QString& s, VVecVariant& vvec); + void slotParseContents(const QString& s, VVecVariant& vvec, \ + const int& left, const int& top); void on_cbxAutoThinning_clicked(); @@ -246,52 +282,106 @@ signals: // p本身包括了WellCode,是否Pressure等信息 void sigPfObjSaved(ZxDataGaugeBase* p); +private: + + // 当前表格数据存入数据库 + bool saveData(); + + // 跟列类型创建对象 + ZxDataGaugeBase* createObjBy(int nColIndex, QString& sObjCode); + ZxDataGaugeBase* createObjBy(QString sTag, QString& sObjCode); + + // 根据vecY进行数据校验, + // 1.x与y长度一致 + // 2.对于y,从开头往后和结尾往前,分别查找无效数值(如果找到有效值,则停止) + // 3.xy同步去除开头和结尾处的数据, + bool adjustXYs(QVector& vecX, QVector& vecY, double dInvalid = SYS_VALUE_INVALID); + + // 按钮部分,记录每个Card的按钮 + struct obInfoExts { + QString sWellCode; + QString sGaugeTime; + QString sCreator; + QString sCreatedTime; + QString sGaugeName; + }; + + void collectInfoExts(obInfoExts& ext); + + bool saveObjsAsMerge(const VecDouble& vecX, \ + const QMap& mapYs, \ + const int& nIndexD, \ + const obInfoExts ext); + bool saveObjsAsSole(const VecDouble& vecX, \ + const QMap& mapYs, \ + const int& nIndexD, \ + const obInfoExts ext); + + void saveOneObj(VecDouble& vecX1, VecDouble& vecY1, \ + const int nIndex, const obInfoExts exta); + void saveOneObj(const QByteArray& ba1, const QByteArray& ba2, \ + const int nIndex, const obInfoExts ext); + private: Ui::iWxDataLoad *ui; + // 数据类,压力或流量 + DataLoadType m_oType; + + //////////////////////////////////////// // 布局载体 - QTextEdit* m_pTbxDataDesc; + + // 表格 ZxTableView* m_pTableView; - ZxTableHeaderView* m_pTableHeaderView; + tTableHeaderViewUnit* m_pTableHeaderView; // 图形数据 ZxPlot* m_pPlot; iGuiPlot* m_pWxPlot; - // 加载数据后解析解出来 - QString m_sHeaders; //顶部文件说明信息 - QStringList m_listTitles; //顶部单位和标题 - QStringList m_listUnits; - VVecVariant m_vvecData; //数据原始 + // 说明 + QTextEdit* m_pTbxDataDesc; + + // End of 布局载体 + //////////////////////////////////////// + + // 加载数据后解析解出来,这是原始数据的内容部分 + VVecVariant m_vvecData; //数据原始 + iFileEngineUtils::fprParseResult m_oRst; // 表格数据 QStringList m_listTableTitles; //表上显示的标题,可以为空 QStringList m_listTargetTitles; QStringList m_listKeyTitles; + // 这个数据比较特殊,是从文件读取之后并且转换为目标标题的单位信息 + // 即:key为目标标题、value为从文件解析出来的单位信息 + QMap m_mapTempBindUnits; + + // 空白表格数据 + VVecVariant m_vvecDefaults; - // 数据类,压力或流量 - DataLoadType m_oType; // 数据类的时间格式 DateTimeMode m_oDtm; - // 当前拖拽为正确的格式 - bool m_bDraging; - // 空标志 QString m_sTagNull; - // LastError - QString m_sLastError; + // 记录一下软件操作的起始时间,只是为了保存进行时间的粗略验证 + QDateTime m_dtInitStart; - // 限制井名 + // 初始传入,存到哪口井,不涉及序列化 + ZxDataWell* m_pTargetDataWell; + + // 限制井名,即是否不允许下拉选择井, + // 而只限于保存至当前井或者用户一开始指定的井 bool m_bFixWellName; - // 空白表格数据 - VVecVariant m_vvecDefaults; + // 当前拖拽为正确的格式(Obsoleted) + //bool m_bDraging; + + // LastError + QString m_sLastError; - QDateTime m_dtInitStart; - // 初始传入,存到哪口井,不涉及序列化 - ZxDataWell* m_pTargetDataWell; }; diff --git a/Include/mGui/mGuiDataLoad/tTableHeaderViewUnit.h b/Include/mGui/mGuiDataLoad/tTableHeaderViewUnit.h new file mode 100644 index 0000000..7b792c8 --- /dev/null +++ b/Include/mGui/mGuiDataLoad/tTableHeaderViewUnit.h @@ -0,0 +1,97 @@ +#pragma once + +#include + +#include "ZxTableHeaderViewFilter.h" +#include "mGuiDataLoad_global.h" + +class iUnitGroup; +class iUnitItem; + +// 在原先下拉表头的基础上,继续增加单位行,并且支持下拉 +// 该类比较特殊,即有ZxTableHeaderViewFilter的下拉内部 +// 又有ZxTableHeaderViewUnit的单位处理部分 +// 目前无好的方式,只能从ZxTableHeaderViewFilter派生, +// 而内部很多函数实现方式又来自ZxTableHeaderViewUnit +class M_GUI_DATA_LOAD_EXPORT tTableHeaderViewUnit : public ZxTableHeaderViewFilter +{ + Q_OBJECT + +public: + + tTableHeaderViewUnit(const QStringList& listItems, \ + QWidget* parent = 0); + ~tTableHeaderViewUnit(); + + + void setHeaderData(const QStringList& listTitles, \ + const QStringList& listUnits); + + + + // 设置表头下拉列表取值(两个接口,分别对应多选和单选) + virtual void setColumnItems(const QString& sCurSel, \ + const QStringList& listAlls); + + // 设置Titles,该父类接口请勿启用 [Obsolete] + virtual void changeTitles(QStringList listTitles); + // 请启用该接口 + void changeTitles(const QStringList& listTitles, const QStringList& listUnits); + + virtual bool isColCbxVisible() const; + virtual void hideColCbxs(); + + // 获取当前显示的列单位 + QString getCurUnitOfCol(int col) const; + +protected: + + // 重绘,此处有待完善,目前是没有版本,直接把父类搬过来了。 + virtual void paintSection(QPainter* painter, const QRect &rect, int logicalIndex) const; + + // 处理鼠标单击消息 + virtual void mousePressEvent(QMouseEvent *e); + virtual void mouseReleaseEvent(QMouseEvent *e); + virtual bool eventFilter(QObject *obj, QEvent *event); + + // 重置表头combo控件大小 + virtual void resizeItem(int index); + + // 删除comboBox控件 + virtual void removeCombo(); + +public Q_SLOTS: + + // 选择改变时响应 + virtual void slotSelChanged(const int, const QString); + +private slots: + + void onUnitCbxActivated(int index); + void onUnitCbxLostFocus(); + void onSectionClicked(int logicalIndex); + +signals: + + void sigCbxValueChanged(int column, \ + const iUnitItem* pSrcUnitItem, \ + const iUnitItem* pDestUnitItem); + +protected: + + QComboBox* m_pCbxColUnit; + + //QStringList m_listTitles; + QStringList m_listCurUnits; + QStringList m_listBaseUnits; + + int m_nLastIndex; + + QMap m_mapUnitGroups; + + + bool m_bUnableSP; +}; + + + diff --git a/Include/mGui/mGuiJob/SubMLs.rar b/Include/mGui/mGuiJob/SubMLs.rar new file mode 100644 index 0000000..d085abc Binary files /dev/null and b/Include/mGui/mGuiJob/SubMLs.rar differ diff --git a/Include/mGui/mGuiJob/SubMLs/tGridRowUtils.h b/Include/mGui/mGuiJob/SubMLs/tGridRowUtils.h index 968c00b..b8e3ef1 100644 --- a/Include/mGui/mGuiJob/SubMLs/tGridRowUtils.h +++ b/Include/mGui/mGuiJob/SubMLs/tGridRowUtils.h @@ -317,6 +317,13 @@ public: // 是否层内节点(不考虑层内本身的层级) virtual bool isUpperLayerInnerOf(iGridRowItem* pItem); +public: + + // 获取当前所在的父级层的标识,可能为空 + static tGridRowGroupLayer* upperLayerOf(iGridRowItem* pItem); + // 获取当前所在的父级层的标识,可能为空 + static QString upperLayerTagOf(iGridRowItem* pItem); + protected: // 是否多层模型,其实就是true,该类就是针对多层模型设计,非多层不调用本类 diff --git a/Include/mGui/mGuiJob/iWxDataObjEditPF.h b/Include/mGui/mGuiJob/iWxDataObjEditPF.h index 67ef4a5..ac660a3 100644 --- a/Include/mGui/mGuiJob/iWxDataObjEditPF.h +++ b/Include/mGui/mGuiJob/iWxDataObjEditPF.h @@ -14,6 +14,18 @@ class ZxDataWell; class M_GUI_JOB_EXPORT iWxDataObjEditPF : public iWxDataObjEdit { Q_OBJECT + +public: + + // 当前数据对应的类型 + enum DataObjType + { + DOT_Pressure = 0, //压力数据 + DOT_FlowRate, //流量 + DOT_Temp, //温度 + DOT_Unkown // + }; + public: explicit iWxDataObjEditPF(QWidget *parent = 0); @@ -38,7 +50,7 @@ protected: private: VVecDouble m_vvecGaugeData; - bool m_bPressure; + DataObjType m_oType; iGuiPlotEx* m_pWxPlot; diff --git a/Include/mGui/mGuiJob/iWxModelOption.h b/Include/mGui/mGuiJob/iWxModelOption.h index ba77ea9..bc75ac0 100644 --- a/Include/mGui/mGuiJob/iWxModelOption.h +++ b/Include/mGui/mGuiJob/iWxModelOption.h @@ -237,10 +237,13 @@ protected: // 隐藏Tip助手框 void hideWxAssist(); + QPoint getPreferAssistPos(const QPoint& desiredPos, const QSize& widgetSize); QListWidget* getListWxByType(QString sType); QString getTypeByListWx(QListWidget* pListWx); + + protected slots: // 模型选择 diff --git a/Include/mGui/mGuiJob/iWxModelParameter.h b/Include/mGui/mGuiJob/iWxModelParameter.h index 40e8396..b888d2c 100644 --- a/Include/mGui/mGuiJob/iWxModelParameter.h +++ b/Include/mGui/mGuiJob/iWxModelParameter.h @@ -64,6 +64,7 @@ public: virtual bool getAllParaUnits(QMap& map, bool bOnlyFitted = false, bool bClearMap = true); + virtual bool getVecAllItemPtrs(QVector*& pVecPtr); /// @brief 收集多层相关的一些乱七八糟的信息,包括模型选项、边界类型、每条边的定压还是封闭等等。 /// @param map 收集的结果 @@ -87,7 +88,9 @@ public: virtual void refreshUIs_ML(QStringList& listParas); //增加多层模式 virtual void _refreshUIs(QStringList& listParas); - void dealwithSegItem(double d); + // 特殊处理:为一些参数设定一些初始值 + // 目前只是实现了 产量段数 Nq 的总产量 + void dealwithItemSpValues(double d); protected: @@ -109,10 +112,9 @@ private slots: public: - // 当前面窗体参数改变时,本窗体响应 - virtual void slotParasObtained(QMap& map); // 根据多相单相对右侧参数进行调整 - void setToMpMode(bool bMultiPhase, PvtFluidType pft); + // 需要特别注意:本函数增加了对于空白项的处理 + void freshToMpMode(bool bMultiPhase, PvtFluidType pft); void freshParasByMap(QMap& mapOldValues); void freshParasByValue(QString sPara, QVariant o); @@ -122,6 +124,9 @@ public: public slots: + // 当前面窗体参数改变时,本窗体响应,暂未启用 + virtual void slotParasObtained(QMap& map); + // 启用的是本函数 virtual void slotParasObtainedEx(iModelOption* pOption); // 响应ParaCtrl数据的改变 @@ -171,10 +176,20 @@ public slots: /// @brief 响应Basic对话框的Changed:当勾选多层或者多层数据修改了,则触发 void slotBasicMultiLayerOptionChanged(); + /// @brief 对参数输入子项进行调整,比如干扰的xf与常规的不一致 + /// @param sName: (in) 参数标识,为英文标识 + /// @param listSubItemNames: (in & out) 调整后的子项 + /// @param listSubItemAliass: (in & out) 调整后的子项别称 + void slotAdjustSubItems(const QString sName, \ + QStringList& listSubItemNames, \ + QStringList& listSubItemAliass); + // 对GridRowUtils右键菜单进行调整 virtual void slotAdjustGridUtilContextMenu(QMenu*& pMenu, iGridRowItem* pItem); + virtual void slotBatchParaInputs(); + virtual void slotShowAllItems(); virtual void slotShowMainItems(); @@ -184,6 +199,11 @@ public slots: // help msg virtual void slotHelpMsg(QString& s); +private: + + // 为当前需要批量输入的内部收集参数及 + bool collectBatchParas(QVector& vec); + protected: void showItems(bool bMainItems); @@ -248,10 +268,6 @@ protected: protected: - // 参数来源标识,默认情况下,为 s_Sys_Para_Default - // 不涉及序列化 - QString m_sParaSrcTag; - // 临时,是否线性流,目前只考虑了 常规,其它如多层等均未考虑 // 该函数,是基于WelID,根据后台ini文件进行判断 // 目的是决定,边界是否特殊定制 diff --git a/Include/mGui/mGuiJob/iWxParam.h b/Include/mGui/mGuiJob/iWxParam.h index 8e60e0d..d90fbc4 100644 --- a/Include/mGui/mGuiJob/iWxParam.h +++ b/Include/mGui/mGuiJob/iWxParam.h @@ -35,6 +35,13 @@ public: double getBtWidth(); double getBtHight(); + /// @brief 是否折叠模式, + /// @note 如果当前根本就没有UseMode=3的参数 + /// 也就是说,所有参数都是正常显示的,这时候是不显示折叠按钮的 + /// 同样,也无需弹出右键进行显示/隐藏等操作 + bool isFoldMode(); + + /// @brief 在折叠模式为true的前提之下,当前折叠的状态 bool isFolded(); void setFolded(bool b); diff --git a/Include/mGui/mGuiPlot/iGuiPlot.h b/Include/mGui/mGuiPlot/iGuiPlot.h index d9d2128..97eadfa 100644 --- a/Include/mGui/mGuiPlot/iGuiPlot.h +++ b/Include/mGui/mGuiPlot/iGuiPlot.h @@ -2,6 +2,7 @@ #include "iPlotCurveWxT.h" #include "ZxDot.h" +#include "mModuleDefines.h" #include "mGuiPlot_global.h" class ZxDataGaugeBase; @@ -95,7 +96,7 @@ public: static bool saveDefaultCodePF(QString sWell, QString sCodeP, QString sCodeF); static bool saveDefaultCodePF(QString sWell, - QString sCode, bool bPressure); + QString sCode, GaugeDataType o); protected: diff --git a/Include/mGui/mGuiPlot/iGuiPlotEx.h b/Include/mGui/mGuiPlot/iGuiPlotEx.h index 0578e3e..0361024 100644 --- a/Include/mGui/mGuiPlot/iGuiPlotEx.h +++ b/Include/mGui/mGuiPlot/iGuiPlotEx.h @@ -56,7 +56,8 @@ public slots: void slotObjDeleted(ZxObjBase* p); // 在iGuiPlotTableHelper保存时,通过该信号获取对应的DataObj - void slotGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p); + //void slotGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p); + void slotGetDataObjOfView(QString sCurveName, ZxDataGaugeBase*& p); // Table改变时,刷新曲线 void slotRefreshCurveBy(ZxTableModel* p); diff --git a/Include/mGui/mGuiPlot/iGuiPlotPF.h b/Include/mGui/mGuiPlot/iGuiPlotPF.h index de55d51..4b160f9 100644 --- a/Include/mGui/mGuiPlot/iGuiPlotPF.h +++ b/Include/mGui/mGuiPlot/iGuiPlotPF.h @@ -160,7 +160,8 @@ public slots: void slotUpdateWhenFlowChanged(); // 在iGuiPlotTableHelper保存时,通过该信号获取对应的DataObj - void slotGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p); + //void slotGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p); + void slotGetDataObjOfView(QString sCurveName, ZxDataGaugeBase*& p); // 是否允许拖拽的响应处理 void slotCheckDropCurve(ZxDataGaugeBase* pObj, bool& bEnabled); diff --git a/Include/mGui/mGuiPlot/iGuiPlotTableHelper.h b/Include/mGui/mGuiPlot/iGuiPlotTableHelper.h index f408e8d..bd5e4ad 100644 --- a/Include/mGui/mGuiPlot/iGuiPlotTableHelper.h +++ b/Include/mGui/mGuiPlot/iGuiPlotTableHelper.h @@ -41,7 +41,7 @@ public: void setToolBarVisible(bool ); // 返回所有View - QMap* getMapTableViews(); + QMap* getMapTableViews(); // 保存入库 void runPossibleSave(); @@ -61,7 +61,8 @@ public slots: signals: // 在保存时,通过该信号获取对应的DataObj - void sigGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p); + //void sigGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p); + void sigGetDataObjOfView(QString sCurveName, ZxDataGaugeBase*& p); // 一旦压力或流量保存之后,则触发其他窗口的刷新 void sigDataSavedPF(QString sCode); @@ -89,5 +90,8 @@ private: bool m_bShowToolBar; // TableView载体 - QMap m_mapTableViews; + QMap m_mapTableViews; + + // 临时变量,当前右键针对的View所绑定的Curve + ZxObjCurveBase* m_pCurTargetCurve; }; diff --git a/Include/mGui/mGuiPlot/iWxTableMF.h b/Include/mGui/mGuiPlot/iWxTableMF.h index 975c82b..482fa75 100644 --- a/Include/mGui/mGuiPlot/iWxTableMF.h +++ b/Include/mGui/mGuiPlot/iWxTableMF.h @@ -58,7 +58,7 @@ signals: void sigAdjustToolBar(QToolBar*&); // 在保存时,通过该信号获取对应的DataObj - void sigGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p); + //void sigGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p); // 数据发生了改变 void sigTableDataChanged(VVecDouble&); diff --git a/Include/mGui/mGuiPlot/iWxTablePF.h b/Include/mGui/mGuiPlot/iWxTablePF.h index 538e66f..b45b78b 100644 --- a/Include/mGui/mGuiPlot/iWxTablePF.h +++ b/Include/mGui/mGuiPlot/iWxTablePF.h @@ -1,7 +1,7 @@ #pragma once #include "iDlgBase.h" - +#include "mModuleDefines.h" #include "mGuiPlot_global.h" class ZxTableView; @@ -16,8 +16,8 @@ class M_GUI_PLOT_EXPORT iWxTablePF : public iDlgBase public: explicit iWxTablePF(const QString& sTitle, - bool bPressure, - QWidget *parent = 0); + GaugeDataType o, + QWidget *parent = 0); ~iWxTablePF(); // 临时 @@ -31,7 +31,7 @@ public: void setToolBarCmdType(QString s); // 数据 - void changedTitle(bool bPressure); + void changedTitle(GaugeDataType o); void clearDataPF(); void setDataPF(VVecDouble &vvec); VVecDouble getDataPF(); @@ -60,7 +60,7 @@ signals: void sigAdjustToolBar(QToolBar*&); // 在保存时,通过该信号获取对应的DataObj - void sigGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p); + //void sigGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p); // 数据发生了改变 void sigTableDataChanged(VVecDouble&); @@ -86,7 +86,7 @@ protected: ZxTableView* m_pTableView; //视图 ZxObjBase* m_pObj; //关联的井点对象 - bool m_bPressure; //压力or流量 + GaugeDataType m_oGgdt; //压力or流量 bool m_bShowToolBar; //是否显示toolbar QString m_sCmdType; diff --git a/Include/mGui/mGuiSysManager/iWxWellNew.h b/Include/mGui/mGuiSysManager/iWxWellNew.h index b68d098..446eaca 100644 --- a/Include/mGui/mGuiSysManager/iWxWellNew.h +++ b/Include/mGui/mGuiSysManager/iWxWellNew.h @@ -75,6 +75,8 @@ signals: private slots: + void on_cmbRadiusUnit_currentIndexChanged(const QString &arg1); + // 克隆相关的选项 void on_cbxDataGaugeF_clicked(); void on_cbxDataGaugeP_clicked(); @@ -84,7 +86,6 @@ private slots: void on_btnOK_clicked(); void on_btnCancel_clicked(); - protected: Ui::iWxWellNew *ui; diff --git a/Include/mGui/mSubWnd/SubWxs/iWxRunOption.h b/Include/mGui/mSubWnd/SubWxs/iWxRunOption.h index db509dd..72c3835 100644 --- a/Include/mGui/mSubWnd/SubWxs/iWxRunOption.h +++ b/Include/mGui/mSubWnd/SubWxs/iWxRunOption.h @@ -8,7 +8,7 @@ class ZxDataWell; class iSubWnd; class iAnalRun; class iGuiPlot; -class ZxTableViewEx; +class ZxTableViewFilter; class M_SUB_WND_EXPORT iWxRunOption : public iDlgBase { Q_OBJECT @@ -56,12 +56,20 @@ protected: virtual bool isProperAnalType(PvtTestType ptt, \ bool bMiniFracMode = false); //筛选过滤合适的部分 +protected: + + // 窗体关闭的情形 + virtual void closeEvent(QCloseEvent *); + signals: // 从主窗体获取 void sigGetFitWnds(QMap& map); void sigRunOptionChanged(iAnalRun*, iSubWnd*, bool, bool, QString); + // 即将关闭OK/accepted()//Cance/rejected()/右上角x均触发该信号 + void sigWxToClose(); + protected: // 窗体名称的切换 @@ -115,7 +123,7 @@ protected: iGuiPlot* m_pPlotWx; // 表格组件 - ZxTableViewEx* m_pTableViewJ; + ZxTableViewFilter* m_pTableViewJ; // 下拉Anal类型 QComboBox* m_cbxAnalTypes;//ui->cbxAnalType diff --git a/Include/mGui/mSubWnd/SubWxs/iWxRunOptionStd.h b/Include/mGui/mSubWnd/SubWxs/iWxRunOptionStd.h index 785a36f..31243f1 100644 --- a/Include/mGui/mSubWnd/SubWxs/iWxRunOptionStd.h +++ b/Include/mGui/mSubWnd/SubWxs/iWxRunOptionStd.h @@ -4,6 +4,7 @@ class ZxSegmentInfo; class iAlgModelBase; +class iAlgDerivCurveCal; namespace Ui { class iWxRunOptionStd; @@ -44,6 +45,8 @@ public: void verifyDataPF(VecDouble& vecFt, VecDouble& vecFv, \ VecDouble& vecPt, VecDouble& vecPv); + //ZXF20260618得到压力导数算法对象 + iAlgDerivCurveCal* getAlgDerivCurveCal(); private slots: @@ -70,6 +73,19 @@ private slots: // 是否处理末端效应 void on_cbxAutoEndEffect_clicked(); +protected slots: + + // 调整右键,比如优化坐标轴、去除末端效应等 + // 通常是插入,默认是在 Redo/Undo 与保存图片 之间 + void slotAdjustSubContextMenu(QMenu* pMenu); + + // 优化坐标轴 + virtual void slotOptAxisXY(); + virtual void slotOptAxisX(); + virtual void slotOptAxisY(); + + virtual void optMainAxisScale(bool bX); + protected: // 下拉流体类型 diff --git a/Include/mGui/mSubWnd/SubWxs/iWxRunOptionStd.h.bak b/Include/mGui/mSubWnd/SubWxs/iWxRunOptionStd.h.bak new file mode 100644 index 0000000..2d4ef29 --- /dev/null +++ b/Include/mGui/mSubWnd/SubWxs/iWxRunOptionStd.h.bak @@ -0,0 +1,157 @@ +#pragma once + +#include "iWxRunOption.h" + +class ZxSegmentInfo; +class iAlgModelBase; + +namespace Ui { + class iWxRunOptionStd; +} + +class M_SUB_WND_EXPORT iWxRunOptionStd : public iWxRunOption +{ + Q_OBJECT + +public: + + explicit iWxRunOptionStd(QWidget *parent = 0, bool bMiniFrac = false); + ~iWxRunOptionStd(); + + // 初始化 + virtual void initUI(); + virtual void initTableViews(); + virtual void initChartView(); + + // 外界调用参数 + void setSegmentInfo(ZxSegmentInfo* p); + + // 默认调用模式,不弹出对话框 + virtual void runByDefault(); + + virtual void runByBtnOk(); + virtual bool runByBtnApply(); + + // 刷新 + virtual void freshUI(bool bAutoRun = false); + + // 返回对话框选择的结果 + + bool getDataPandF(QVector& vecP, \ + QVector& vecF); + + // 对压力流量进行校正式处理 + void verifyDataPF(VecDouble& vecFt, VecDouble& vecFv, \ + VecDouble& vecPt, VecDouble& vecPv); + + +private slots: + + // 是否启用光滑和抽稀 + void on_cbxUseSmoothing_clicked(); + void on_cbxUseThinning_clicked(); + + // OK cancel + void on_btnOK_clicked(); + void on_btnCancel_clicked(); + void on_btnApply_clicked(); + + virtual void slotAnalRunselectionChanged(); +//protected: + + // 设置MpData + void on_btnSetMpData_clicked(); + + void on_cbxBuildUpOrDown_currentIndexChanged(int index); + + // 原始曲线显示与否 + void on_cbxRawCurves_clicked(); + + // 是否处理末端效应 + void on_cbxAutoEndEffect_clicked(); + +protected slots: + + // 调整右键,比如优化坐标轴、去除末端效应等 + // 通常是插入,默认是在 Redo/Undo 与保存图片 之间 + void slotAdjustSubContextMenu(QMenu* pMenu); + + // 优化坐标轴 + virtual void slotOptAxisXY(); + virtual void slotOptAxisX(); + virtual void slotOptAxisY(); + + virtual void optMainAxisScale(bool bX); + +protected: + + // 下拉流体类型 + virtual void withAnalTypeChanged(); + + //处理勾选等变化引起的曲线变化(Smooth Or Thin) + virtual void withSmoothThinChanged(); + + // 是否处理末端效应 + virtual void withEndEffectChanged(); + + +signals: + +protected: + + // 填充下拉 + virtual bool fuzzyCbxAnalRuns(); + + // 刷新组件 + void refreshSegInfo(ZxSegmentInfo* p); + virtual void refreshChartInfo(); + void refreshSmoothState(); + void refreshThinningState(); + void updatePlotByAlgRst(); + void updatePlotByAlgRst_Raw(); + bool getCurveDataOf(QString sCurve, VecDouble& vecX, VecDouble& vecY); + + void makesureRawCurveAbouts(); + void freshPtCounts(); + + // 结果处理 + virtual bool runApply(); + virtual bool dealwithWndSel(); + virtual bool dealwithSmoothAndThin(bool bMultiPhase); + + //zxf设置当前的job + virtual bool setCurrentAnalRun(); + + // 对于多相确保多相数据 + void makesureMpData(QString sCurveIdF, QVector& vecF); + +protected: + + Ui::iWxRunOptionStd *ui; + + // 流动段载体 + ZxSegmentInfo* m_pSegInfo; + + // 多相数据,竖向排列,size为4,//注意:[0]时间,[1]油,[2]气,[3]水 + VVecDouble m_vvecMpData; + QString m_sFlowDataCode; + bool m_bIniting; + QVector m_vecBackupF; + + // 当前选择的 数据(如果截取) + QVector m_vecPtsCurveP; + QVector m_vecPtsCurveF; + + // 为了方便应用 + QComboBox* m_pCbxStepUpDown; + + QCheckBox* m_pCbxShowRawCurves; + QLabel* m_pLblPtCounts1; +// QLabel* m_pLblPtCounts2; + + //算法 + iAlgModelBase* m_pAlgModel; + + // 临时,不涉及序列化 + QString m_sPtsInit; +}; diff --git a/Include/mGui/mSubWnd/iModelCurveDesc.h b/Include/mGui/mSubWnd/iModelCurveDesc.h index c29c203..2a0e4ea 100644 --- a/Include/mGui/mSubWnd/iModelCurveDesc.h +++ b/Include/mGui/mSubWnd/iModelCurveDesc.h @@ -1,33 +1,70 @@ #pragma once -#include "mSubWnd_global.h" + #include "mAlgDefines.h" #include "iGuiPlot.h" #include "iCurveDesc.h" +#include "mSubWnd_global.h" -//曲线的一些基本信息设置 +// 曲线的一些基本信息设置 class M_SUB_WND_EXPORT iModelCurveDesc { public: + // 获取对象,单例模式 + static iModelCurveDesc* getInstance(); + + // 关闭消耗 + static void release(); + +private: + iModelCurveDesc(); ~iModelCurveDesc(); public: + // 设置曲线数据 void setCurveDescData(QString s, VecDouble &vecX, VecDouble &vecY); // 得到曲线的数据iCurveDesc(主要用于替换) bool getCurveDescByName(QString s, int &nIndex, iCurveDesc &o); + // 设置曲线 void changeOrAppendCurveDesc(QString s, iCurveDesc &o); -protected: - - // 初始化曲线的线型,颜色等 - void initModelCurveDesc(); + +private: // 默认从后台模板加载一下 bool loadFromTeml(iCurveDesc& o); -protected: + // 初始化曲线的线型,颜色等 + void initModelCurveDesc(); + + // 原先应编码模式 + void initCdByHardCode(); + +#ifdef QT_DEBUG + // 原先编码方式,可以直接生成ini供新的模式使用 + void exportConfigToFile(const QString& filePath); +#endif + + // 新的机制,配置化 + bool initCdByNovel(); + bool loadCdFile(const QString& filePath); + bool parseCdLine(const QString& line, \ + QString& name, \ + QStringList& params); + bool parseInfo2Cd(iCurveDesc& desc, \ + const QStringList& params); + +private: + + static iModelCurveDesc* m_pInstance; + +private: + QVector m_vecCurveDesc; + QMap m_mapCdConfigs; }; + +#define _curveHelper iModelCurveDesc::getInstance() diff --git a/Include/mGui/mSubWnd/iSubWnd.h b/Include/mGui/mSubWnd/iSubWnd.h index 5eab806..36918c7 100644 --- a/Include/mGui/mSubWnd/iSubWnd.h +++ b/Include/mGui/mSubWnd/iSubWnd.h @@ -38,6 +38,9 @@ class ZxRstWnd; // IPR:IPR准备和IPR分析两类 #define s_MdiType_DataIPR "DataIPR" +// 智能试井类 +#define s_MdiType_WndAI "WndAI" + // WDT:所有与产能相关 #define s_MdiType_DataWDT "DataWDT" @@ -79,7 +82,7 @@ public: ZxMainWindow* getMainWindow(); virtual void initUI(); //初始化入口 - virtual void configWnd(QString sPrevInfo); //配置窗体 + virtual void configWnd(QString sPrevInfo); //配置窗体 virtual void loadData(QString sWell = ""); //加载数据 virtual void runUpdate(); //刷新 virtual void firstLoadAndUpdate(); //窗体初始后允许数据加载及刷新 @@ -144,6 +147,11 @@ public: // 当井相关的内容更改时进行相关的处理,比如更新一下井位图 virtual void dealwithWellChange(ZxDataWell* pDataWell, TreeNodeCmd o); + // 当窗口激活时,需要的额外操作,比如针对产能计算,需要切换模式 + // 注意:仅仅针对,在Ribbon上按钮点击之后,进行激活所做的处理 + // 并非手工切换TabWidget + virtual void changeOnRibbonBtnActive(); + public: void keyPressEvent(QKeyEvent* e); diff --git a/Include/mGui/mSubWnd/iSubWndAnal.h b/Include/mGui/mSubWnd/iSubWndAnal.h index 64875b4..498ead8 100644 --- a/Include/mGui/mSubWnd/iSubWndAnal.h +++ b/Include/mGui/mSubWnd/iSubWndAnal.h @@ -173,6 +173,9 @@ public slots: bool bAnalRunAlreadyCurrent, QString sNewWndName); + // RunOption窗体即将关闭,允许进行状态调整,比如右键重复问题 + virtual void slotRunOptionWxClose(); + // 数据加载信号相应 virtual void slotPfObjSaved(ZxDataGaugeBase* p); @@ -223,4 +226,6 @@ protected: // 临时,不需序列化,为了区分ANal和AnalDn bool m_bTableVisible; + // 临时遍历不涉及序列化 + bool m_bRunOptionWxOn; //当前是否正开启弹窗 }; diff --git a/Include/mGui/mSubWnd/iSubWndBaseFit.h b/Include/mGui/mSubWnd/iSubWndBaseFit.h index d66fd5a..bc0e2ff 100644 --- a/Include/mGui/mSubWnd/iSubWndBaseFit.h +++ b/Include/mGui/mSubWnd/iSubWndBaseFit.h @@ -15,6 +15,8 @@ class iWxRunOptionStd; class zxAlgThread; class ZxObjWmPoint; class ZxObjInfPoint; +class iGridRowItem; +class iAlgDerivCurveCal; // 父类:拟合相关,有子窗体 class M_SUB_WND_EXPORT iSubWndBaseFit : public iSubWndBaseAF @@ -77,6 +79,8 @@ public: //返回所有的跟模型相关的参数(参与拟合的参数) virtual bool getFitParaAbouts(QMap& mapValues, \ QMap& mapUnits); + virtual bool getFitParaAbouts(QVector*& pVecPtr); + bool getFitParaValues(QMap& map); bool getFitParaUnits(QMap& map); @@ -104,6 +108,9 @@ public: // 配置算法载体 bool configAlgModel(); + //ZXF20260618设置算法的压力导数曲线计算算法对象 + void setAlgDerivCurveCalPtr(iAlgDerivCurveCal *pPtr); + protected: // 重新调整工具栏 diff --git a/Include/mGui/mSubWnd/iSubWndBaseFit.h.bak b/Include/mGui/mSubWnd/iSubWndBaseFit.h.bak new file mode 100644 index 0000000..dd863e6 --- /dev/null +++ b/Include/mGui/mSubWnd/iSubWndBaseFit.h.bak @@ -0,0 +1,302 @@ +#pragma once + +#include "mAlgDefines.h" +#include "mModuleDefines.h" +#include "iCurveDesc.h" +#include "iResultInfo.h" +#include "iSubWndBaseAF.h" + +class iParaManager; +class iWxAnalWizard; +class iAlgModelBase; +class cmAlgModelBase; +class iWxRunOption; +class iWxRunOptionStd; +class zxAlgThread; +class ZxObjWmPoint; +class ZxObjInfPoint; +class iGridRowItem; + +// 父类:拟合相关,有子窗体 +class M_SUB_WND_EXPORT iSubWndBaseFit : public iSubWndBaseAF +{ + Q_OBJECT + +public: + + explicit iSubWndBaseFit(QWidget *parent = 0, QString sExt = ""); + ~iSubWndBaseFit(); + + // 配置窗体 + virtual void configWnd(QString sPrevInfo); + + // 初始化Anals + virtual bool createRunWizardWxs(); + virtual bool initRunWizardWxUIs(); + virtual void setDataWell(ZxDataWell* p); + + // 序列化 + virtual void onSerialize(ZxSerializer* ser); + virtual void onDeserialize(ZxSerializer* ser); + + + // 执行命令:通常来自Ribbon + virtual bool runCmdBy(QString sName, QString sID); + + /// @brief 命令是否Enabled的状态判断,通常来自Ribbon + /// @param b (out),true:Enabled false:disabled + /// @param sName (in),Cmd Name + /// @param nID (in),Cmd ID + /// @param bLicensed (in),当前是否有授权 + /// @return 本窗体是否已经进行状态判断(即属于本窗体可执行的命令) + virtual bool checkCmdEnable(bool &b, \ + QString sName, int nID, \ + bool bLicensed); + + // 右键弹窗,然后激活Fitting窗口 + virtual bool firstRunByDataPF(iWxRunOption *pWxRunOption, \ + ZxSegmentInfo* pSegInfo); + // 试井设计模式 + virtual void copyModelOptionDn(iModelOption* p); + virtual void setDnMode(bool b); + +public: + + //virtual void setAnalRun(iAnalRun* p, bool bFuzzyPit = false); + virtual void setAnalRun(iAnalRun* pAnalRun, bool bFuzzyPit = false); + + // 从各个Wx(m_vecWxDatas)中遍历查找 + bool setParaValue(QString sPara, double d); + bool getParaValue(QString sPara, double& d); + // 返回所有参数,Key为英文ID + virtual bool getAllParaValues(QMap& map, + bool bOnlyFitted); + //返回所有的模型参数 + virtual bool getAllParaValuesUnit(QMap& map, + bool bOnlyFitted); + + //返回所有的跟模型相关的参数(参与拟合的参数) + virtual bool getFitParaAbouts(QMap& mapValues, \ + QMap& mapUnits); + virtual bool getFitParaAbouts(QVector*& pVecPtr); + + bool getFitParaValues(QMap& map); + bool getFitParaUnits(QMap& map); + + // 返回所有的跟模型相关的边界参数的类型,不渗透或定压 + // 不渗透:0 + // 定压:1 + bool getBdyInfos(QMap& map); + + // 返回当前模型相关的参数,包括ModelOption、以及井型等信息 + iModelOption* getModelOption(); + // 构建算法载体 + virtual bool buildAlgModel(iModelOption* pModelOption, \ + bool bReset = true, \ + bool bSetParas = true); + // 具体的创建算法载体 + virtual void createAlgModel(ModelSeriesType o, AlgModelSrc ams, \ + iModelOption* pModelOption); + + // 返回所有窗体的指针 + QVector* getAllWxPtr(); + + // 根据多相单相对右侧参数进行调整 + void adjustParaUIsBy(bool bMultiPhase); + + // 配置算法载体 + bool configAlgModel(); + +protected: + + // 重新调整工具栏 + virtual void reAdjustToolbar(QToolBar*); + + // 显示Anal的信息 + virtual void showAnalInfoInput(AnalStepOption o); + + // 根据流体类型刷新 流体对话框 + void changeFluidOption(); + + // 算法类关联信号 + virtual void buildAlgSignals(); + + // 是否正确支持的模型 + virtual bool isModelSupported(iModelOption* p); + +public slots: + + // 对应流动段参数改变,如移动水平线,刷新结果视图 + virtual void slotSegmentParamsChanged(ZxSegmentInfo& o); + + // 常规拟合线程结束 + virtual void slotCommonFitThreadFinished(); + + // 基础参数对话框流体类型发生改变 + virtual void slotFluidTypeChanged(QString s); + // 左侧模型参数发生改变 + virtual void slotOptionParasChanged(iModelOption* pOption); + + // 返回流量 + virtual void slotGetNqAll(double& d); + +public: //20250211 为外部(如数值试井)增加接口 + + /// @brief 允许外部(比如数值试井)对当前子窗口Plot进行曲线添加/更改 + /// @param o 具体哪一个,此处应该为 FSRT_DoubleLog、FSRT_SemiLog、FSRT_Hist 三者之一 + /// @param vecDescs 具体曲线,定义参见iCurveDesc + /// @param bOverwrite 如果已有,是否覆盖 + /// @param ptrError 错误描述之指针 + /// @note 曲线名称,请参见 mAlgDefines.h文件中的定义进行,比如 s_Souce_Curve ,不能随便填写 + virtual bool adjustFitSubPlotBy(FitSubRstTag o, \ + QVector& vecDescs, \ + bool bOverwrite = true, + QString* ptrError = nullptr); + + /// @brief 允许外部(比如数值试井)对当前结果子窗口进行填写 + /// @param o 具体哪一个,此处通常 应该为 FSRT_NmRst + /// @param vecResults 具体结果,定义参见iResultInfo + /// @param bOverwrite 如果已有,是否覆盖 + /// @param ptrError 错误描述之指针 + /// @note 具体调用时,请与wzg协商 + virtual bool adjustFitSubRstBy(FitSubRstTag o, \ + QVector& vecResults, \ + bool bOverwrite = true, + QString* ptrError = nullptr); + + /// @brief 获取当前分析SunbWnd的子窗口 + /// @param o 具体哪一个 + /// @param bCreateIfNotExists 如果不存在,是否强制创建,为true 创建/否则不创建 + /// @param ptrError 错误描述之指针 + /// @note 具体返回的窗体实体类型,请参见FitSubRstTag定义中的说明 + virtual QWidget* getFitSubRstWxOf(FitSubRstTag o, \ + bool bCreateIfNotExists = false, + QString* ptrError = nullptr); + +public: + + ///////////////////////////////////////////////////////////////////////////////// + // 如下接口只是,为了方便获取 m_vecWxDatas 即各个分析对话框的数据信息 + // 注意:iAnalRun也有一套几乎完全类似的接口,但二者针对的对象不同,各自的分析对话框窗体 + // 当然调用者也可以不采取这些接口,而直接对m_vecWxDatas进行操作 + + /// @brief 获取 基础页面中,测试类型,如:标准、干扰、小型压裂、多层 + QString getBasicTestType(); + /// @brief 获取 基础页面中,测试类型 对应的枚举变量 + PvtTestType getBasicTestTypeEx(); + + /// @brief 获取 基础页面中,是否单相 + bool isBasicPhaseS(); + + /// @brief 获取 基础页面中,相态选项,注意返回结果是组合形式,需要根据定义自行解析 + PvtFluidType getBasicPft(); + + /// @brief 获取 基础页面中,相态选项,中文描述,其实就是下拉框显示的内容 + QString getBasicPftDesc(); + + /// @brief 获取 基础页面中,主相,中文描述,即:油气水之一 + /// @note 该函数仅仅为了兼容原先,比如,右键弹窗,根据油气水,筛选AnalRun + QString getBasicMainPft(); + + /// @brief 获取 基础页面中,某个参数的具体数值 + /// @param sPara,参数,英文标识而且大小写敏感 + /// @param d,返回的结果 + /// @note 参数举例:"rw"/"wellDis"/"h"/"phi"/"Ct"/"Pi" + /// 对于多层,则以第一行数据为主 + bool getBasicParaOf(QString sPara, double& d); + + /// @brief 获取 基础页面中,储层参数表格中指定行数据 + /// @param vvec,结果缓存 + /// @param bOnlyChecked,为true,则返回勾选的行,否则,所有行数据 + bool getBasicDataLayers(VVecVariant& vvec, bool bOnlyChecked = false); + + /// @brief 获取 Pvt页面中,油气水项,某个参数的计算结果 + /// @param pft,油气水,请根据需要传入 WFT_Oil 或 WFT_Gas 或 WFT_Water + /// @param sPara,参数,英文标识而且大小写敏感,如"Pb"/"Rs"/"Co"等 + /// @param vecX,返回之x列,通常是压力或温度参数 + /// @param vecY,返回之y列,即sPara对应的参数数值列,与vecX一一对应 + /// @param ptrPtResult,结果选用的点(即PVT曲线上方块点) + /// @param ptrPtReferPb,对应的pb相应的参考点 + /// @note vecY是物性参数计算结果列 + /// vecX则比较特殊,可能是压力数值,也可能是温度数值,目前 + /// 目前,泡点压力Pb、水黏度Miuw 为温度,其它为压力 + bool getPvtRstOf(PvtFluidType pft, QString sPara, \ + VecDouble& vecX, VecDouble& vecY, \ + QPointF* ptrPtResult = nullptr, \ + QPointF* ptrPtReferPb = nullptr); + + /// @brief 获取 Pvt页面中,参数的值,比如Zg、Bg等,即选用的参数数值 + /// @param listParas,参数列表,通常以英文标识为准 + /// @param map 返回结果 + /// @note 这些参数值通常存于Pvt:Header之中 + bool getPvtParaValues(QStringList listParas, QMap& map); + + /// @brief 获取 Diffusion页面中,某个参数的具体数值 + /// @param dso,参数,代表是相渗还是压敏还是吸附 + /// @param sPara,参数,英文标识而且大小写敏感 + /// @param d,返回的结果 + /// @note 主要是左侧属性页上的各项的数据,参照xml定义进行读取 + bool getDiffusionParaOf(DiffusionSubOption dso, QString sPara, double& d); + + /// @brief 获取 Diffusion页面中,计算结果,基本上就是右侧对应表格的数据 + /// @param dso,参数,代表是相渗还是压敏还是吸附 + /// @param vvec,返回数据,即计算结果,与右侧表格对应 + bool getDiffusionRstOf(DiffusionSubOption dso, VVecDouble& vvec); + + /// @brief 获取 拟压力页面中,拟压力结果表 + /// @param vvec,返回数据,长度为4,分别为压力P/拟压力Ps/偏差因子Zg/黏度Miug + /// 压力,单位 Mpa + /// 拟压力,单位 Pa/sec + /// 偏差因子,单位 Pa/sec + /// 黏度,单位 Pa/sec + bool getPseuRstOf(VVecDouble& vvec); + +public: + + // 线程管理,被MainFrmWindow调用 + // 当前窗体内部的线程,如Fitting里面的算法线程 + // 增加参数QThread* p的目的为了后续扩展多个线程管理使用 + virtual bool pauseSubThread(zxAlgThread* p = nullptr); + virtual bool continueSubThread(zxAlgThread* p = nullptr); + virtual bool quitSubThread(zxAlgThread* p = nullptr); + virtual zxAlgThread* getSubThread(zxAlgThread* p); + +signals: + + /// @brief 触发信号,获取当前的井位图井点信息 + /// @return vecWms.count()>1时有效 + /// @note 仅仅返回正确有效的井点,其中中心井默认放在第一个 + /// 如果vecWms.count()<=1,则认为不考虑井位图 + void sigGetWmInfos(QVector& vecWms); + + + /// @brief 触发信号,获取当前的干扰井井点信息 + /// @return vecWms.count()>1时有效 + /// @note 仅仅返回正确有效的井点,其中中心井默认放在第一个 + /// 如果vecWms.count()<=1,则认为不考虑井位图 + void sigGetInfInfos(QVector& vecWms); + +protected: + + // 分别为 Basic、Fluid、(GasConst)、PF、ModelOption、ModelParameter; + //QVector m_vecWxDatas; + // 分别为 Basic、Pvt、Diff、Pseu、ModelOption、ModelParameter; + QVector m_vecWxDatas; + + // 输入参数部分,为了统一,此处用Wizard把iWxBase包裹 + // 每个WiZard包括四个,但是只显示一个 + QVector m_vecWxAnalWizards; + + // 常规拟合算法类 + // 由于Fitting和AnalDn都用到,故放在该类 + iAlgModelBase* m_pAlgModel; + iParaManager* m_pParaManager; + + // 是否序列化,由子类确定 + QPointF m_ptFlowFirst; + +#ifdef QT_DEBUG + bool m_bXcmBrother; +#endif + +}; diff --git a/Include/mGui/mSubWndAna/iSubWndFitting.h b/Include/mGui/mSubWndAna/iSubWndFitting.h index 35b776e..2a62492 100644 --- a/Include/mGui/mSubWndAna/iSubWndFitting.h +++ b/Include/mGui/mSubWndAna/iSubWndFitting.h @@ -77,6 +77,13 @@ public: QVector& vecF); void calDerivCurves(bool bFitModelAfterAuto = false); + //刷新图 + void calDerivCurvesEx(bool bFitModelAfterAuto = false, iAlgDerivCurveCal* pAlg = nullptr); + //把上面这个函数拆下 + bool creatAlgModel(bool bFitModelAfterAuto = false); + //创建压力导数的 + bool creatAlgDerivCurve(iAlgDerivCurveCal* pAlg); + // 添加特殊的图 void appendSpecialCharts(QString sType); @@ -592,6 +599,8 @@ private: //返回所有的跟模型相关的参数(参与拟合的参数) virtual bool getFitParaAbouts(QMap& mapValues, \ QMap& mapUnits); + virtual bool getFitParaAbouts(QVector*& pVecPtr); + //模型测试调用所有的模型ZXF20241127 void calAllModel(); @@ -716,8 +725,6 @@ private: ZxObjSketch* m_pObjSketch; QString m_sImgPath;//不涉及序列化 - iModelCurveDesc* m_pModelCurveDesc; - AlgCalMode m_oLastCalMode; bool m_bSwapMode; //是否应用Swap模式,TODO,20220322 是否涉及序列化 ZxSegmentInfo* m_pSegInfoAll;//备份,非裁剪 diff --git a/Include/mGui/mSubWndAna/iSubWndFitting.h.bak b/Include/mGui/mSubWndAna/iSubWndFitting.h.bak new file mode 100644 index 0000000..5972003 --- /dev/null +++ b/Include/mGui/mSubWndAna/iSubWndFitting.h.bak @@ -0,0 +1,746 @@ +#pragma once + +#include "iSubWndBaseFit.h" +#include "iModelCurveDesc.h" +#include "mSubWndAna_global.h" + +class iSpeciPt; +class iSpeciFun; +class zxAlgThread; + +class iPlotCurveWxT; +class iGuiPlot; +class iDlgBase; +class iWxModelOption; +class iWxModelParameter; + +class ZxObjBase; +class ZxObjLine; +class ZxObjPointSlr; + +class iCurveDesc; +class iWxAutoFit; +class iWxPlateFit; +class iWxResult; +class iModelOption; +class iSpeciLine; +class iSpeciCrossLine; +class ZxObjCurveBase; +class ZxObjCurve; +class iWxCharact; +class iWxTime; +class ZxRstCurveData; +class iInterfereWell; +class iAxisTickInfo; +class ZxObjSketch; +class ZxMdiArea; +class iWxSketchSaveAs; + +class iAlgModelBase; +class iAlgFitBase; +class cmAlgFitBase; +class cmAlgModelBase; + +class zxDataOtherItem; +class ZxObjLineSlr; +class ZxObjLineSpecial; +class iWxRunOption; +class iWxRunOptionStd; +class iAxisTickInfo; + +class iWxDeConv; +class iWxModelClassify; + +class iDynSkinInfo; + +class M_SUB_WND_ANA_EXPORT iSubWndFitting : public iSubWndBaseFit +{ + Q_OBJECT + +public: + + explicit iSubWndFitting(QWidget *parent = 0, QString sExt = ""); + ~iSubWndFitting(); + + // 初始化入口 + virtual void initUI(); + + // 配置窗体 + virtual void configWnd(QString sPrevInfo); + virtual void setAnalRun(iAnalRun* pAnalRun, bool bFuzzyPit = false); + + // 设置两条线的数据点 + bool setDataPF(QVector& vecP, //Pressure Data + QVector& vecF); + // 返回数据点 + bool getDataPF(QVector& vecP, //Pressure Data + QVector& vecF); + + void calDerivCurves(bool bFitModelAfterAuto = false); + + // 添加特殊的图 + void appendSpecialCharts(QString sType); + + // 根据标签获取Plot,对于历史曲线增加为上下,bEx为true则是下 + iGuiPlot* getPlotByTag(QString sTag, bool bEx = false); + + // 试井设计模式 + virtual void copyModelOptionDn(iModelOption* p); + virtual void setDnMode(bool b); + + // 把部分解释结果保存到试井之星的Access + void saveParaToAccess(); + + // 解释成果导出Excel + void saveParaToExcel(); + + // 数据模式切换及备份 + void backupSwapDataPF(QVector& vecP, \ + QVector& vecF, \ + bool bAllMode); + + // 右键弹窗,然后激活Fitting窗口 + virtual bool firstRunByDataPF(iWxRunOption *pWxRunOption, \ + ZxSegmentInfo* pSegInfo); + + // 创建完毕之后的尾处理 + virtual void finalDeals(); + + // 构建算法载体 + virtual bool buildAlgModel(iModelOption* pModelOption, \ + bool bReset = true, \ + bool bSetParas = true); + // 具体的创建算法载体 + virtual void createAlgModel(ModelSeriesType o, AlgModelSrc ams, \ + iModelOption* pModelOption); + + /// @brief 收集多层相关的一些乱七八糟的信息,包括模型选项、边界类型、每条边的定压还是封闭等等。 + /// @param map 收集的结果 + /// @param bClearOlds 是否清空 + /// @note 对于通用的,直接用标识,对于层内的添加层标识 + bool collectFuzzyMLs(QMap& map, \ + bool bClearOlds = false); + // 当前窗体激活时被调用 + virtual void onActivated(); + +protected: + + // 整体的双对数图等 + void initMultiPlots(); //Mdi + + // 初始化双对数半对数等图 + iGuiPlot* initDoubleLogPlot(bool bExtMode = false); //是否第二个双对数图(反褶积) + iGuiPlot* initSemiLogPlot(); + QWidget* initHistCurvePlot(); + + //特殊的图(t ,Sqrt(t) , 1/4Sqrt(t) -1/2Sqrt(t)) + iGuiPlot* initCoordPlot(QString sTag); + + // 初始化结果窗体 + QWidget* initWxResult(); + + //ZXF202409 敏感性分析图 + iGuiPlot* initSensitivityPlot(); + + // 初始化UI + virtual void initUiDockWxs(); + +protected: + + virtual void showEvent(QShowEvent *event); + virtual void resizeEvent(QResizeEvent *); + virtual void closeEvent(QCloseEvent *); + +public: + + // 序列化 + virtual void onSerialize(ZxSerializer* ser); + virtual void onDeserialize(ZxSerializer* ser); + virtual void onDeserialized(); + + // 保存加载 + virtual bool loadRsts(); + virtual bool saveRsts(); + virtual bool prepareSavePureResult(ZxRstCurveData*& pResult); + virtual bool loadRstWithSwapMode(bool bOldVersion); + + // 20260518 权宜之计,各个窗体提供,各自前置的需保存的信息 + // 比如:SubFitting中的 使用 分析 的ID + // 该信息在加载时,非常关键,在创建窗体时,就需要知晓 + virtual QString _getPrevInfos4Save(); + +protected: + + // loadRsts/saveRsts具体实现相关 + + // 分析相关 + virtual bool saveRstAnalInfos(ZxRstWnd* pRstWnd); + virtual bool loadRstAnalInfos(ZxRstWnd* pRstWnd); + + // 流动段相关 + virtual bool saveRstSegInfos(ZxRstWnd* pRstWnd); + virtual bool loadRstSegInfos(ZxRstWnd* pRstWnd); + + // 图件相关 + virtual bool saveRstPlotInfos(ZxRstWnd* pRstWnd); + virtual bool loadRstPlotInfos(ZxRstWnd* pRstWnd); + +public: + + // 模型和参数窗口 + virtual void showOrHideModels(); + virtual void showOrHideParameters(); + + // 布局 + virtual void layoutSubWnds(WndLayoutMode oWlm); + + // 获取当前的双对数曲线(原始和拟合结果) + bool getDbLogCurves(QVector& vecRaws, \ + QVector& vecFittings); + + + // 执行命令:通常来自Ribbon + virtual bool runCmdBy(QString sName, QString sID); + + /// @brief 命令是否Enabled的状态判断,通常来自Ribbon + /// @param b (out),true:Enabled false:disabled + /// @param sName (in),Cmd Name + /// @param nID (in),Cmd ID + /// @param bLicensed (in),当前是否有授权 + /// @return 本窗体是否已经进行状态判断(即属于本窗体可执行的命令) + virtual bool checkCmdEnable(bool &b, \ + QString sName, int nID, \ + bool bLicensed); + // 当前是否启用混合黏度 + bool canMixVis(); + + // 时间/流量变表皮 + bool canToS(bool bFromTime); + + // 暂不启用 + //bool calAndGetDataS(VecDouble& vecX, VecDouble& vecY, bool bFromTime); + + // 状态 TODO 暂时不起作用 + virtual void saveUiStates(); + virtual void restoreUiStates(); + + + // 返回所有参数,Key为英文ID + virtual bool getAllParaValues(QMap& map, + bool bOnlyFitted); + //返回所有的模型参数 + virtual bool getAllParaValuesUnit(QMap& map, + bool bOnlyFitted); + +protected: + + // 权宜之计的临时接口,主要是对m_vvecAllDataP/m_vvecAllDataF的临时处理 + QVector dataToVecPts(bool bAll, bool bP); + bool vecPtsToData(QVector& vec, bool bAll, bool bP); + VVecDouble* _checkDataVVecPtr(bool bAll, bool bP); + QVector _dataToVecPts(VVecDouble* pVvec); + bool _vecPtsToData(VVecDouble* pVvec, QVector& vec); + + // 设置流动段模型参数信息 + void configFitInfos(bool bFittedOnly = false); + void objWms2InterfereWells(QVector vecWms, \ + QVector& vecWells); + + void calOtherInfos(); + void calOtherInfoKoKg(); + void freshKH();//处理地层系数 + double calKH(QMap* pMap); + + // bActivatedByUi 是否由于人机交互触发,比如拖动特征线、拖动理论线等 + // listParaChangeds 当前已经改了哪些参数 + void setParamByCal(bool bActivatedByUi, \ + QStringList listParaChangeds = QStringList()); + void getSpeciPtByPointSlr(QVector vecPoint, \ + QStringList listType, \ + QVector& vecPt); + void getFunFindPt(QMap mapParamFunName, \ + QMap mapFunPt, \ + QVector vecPt, QVector< QVector >&vvecFun, \ + QStringList& listParas); + + // 重新调整工具栏 + virtual void reAdjustToolbar(QToolBar*); + + void calParaByFunName(QVector vecFun, QString sPara); + + // 对于坐标轴范围等属性的处理 + QStringList getPlotTagsOf(int nIndex); + void cachePlotAxisRanges(int nIndex); + void resetPlotAxisRanges(int nIndex); + + // 根据实际时间查找时间范围 + bool getTimeSteps(double& dMin, double& dMax); + + // 备份或其他刷新(当前FitModel所用的Option) + void dealwithCurFitOption(); + + // Fitmodel后刷新布局 + void dealwithLayouts(); + + // 对于MdiArea中的窗体进行重新布局 + void _layoutSubWnds(); + + // 算法类关联信号 + virtual void buildAlgSignals(); + + // 是否正确支持的模型 + virtual bool isModelSupported(iModelOption* p); + + // 重置FitBase载体 + bool resetFitObj(Fit_Type o, \ + iModelOption* pModelOption, \ + Fit_Method m = FM_Unknown); + // 设置变表皮 + void configDynSkin(AlgCalMode oAcm); + + // 线程结束 + virtual void dealThreadFinished_m(); //FitModel + virtual void dealThreadFinished_a(); //FitAuto + virtual void dealThreadFinished_p(); //FitPlate + + // 对特征曲线进行更新 + void freshSpecCurves(bool bDeserMode = false); + + // 移除特征线/特征点等,TODO 暂未启用 + //void removeSpecCurves(); + + // 双对数特征线 + bool getSpecCurves(QMap& mapLines, \ + bool bCreateIfNotExists, \ + QMap* pMapCreateds = nullptr); + bool resetSpecCurves(QMap& mapLines, \ + QMap* pMapCreateds = nullptr); + + // ZXF20240625对组合0和1特征线更新 + void freshSpecialCurves(bool bDeserMode = false); + + // ZXF20240625双对数特征线 + ZxObjLineSpecial* getSpecialCurve(bool bCreateIfNotExists, bool& bCreateds); + bool resetSpecialCurve(ZxObjLineSpecial* pSpecialLine, bool& bCreateds); + + // 初始添加两条特征线(一条为斜率为0一条为斜率为1分别计算k和c) + void addSpeciCurves(); + bool getSourceCurvePt(QPointF& pt, bool bLast = false); + bool getDerivCurvePt(QPointF& pt); //初始情况下,水平线的Y + void setSpeciCurve(QPointF pt, double dRatio); + + // ZXF2024特性线优化(pt1是斜率为1的点,pt0是斜率为0的点,通过这两点构造新的线) + // xMin,xMax分别是图元的最小X值和最大X值 + void setSpecialCurve(QPointF pt1, QPointF pt0); + + // 根据斜率找特征线 + ZxObjLineSlr* findObjLineSlrBySlope(iGuiPlot* pPlot, double dSlope); + + // 从特征线中收集信息 + void getInfoFromSpeciLine(ZxObjBase* pObj, \ + QVector &vecLine); + void getInfoFromSpeciCrossLine(QVector vecObj, QStringList listType, \ + QVector& vecCrossLine); + + + // 在拟合前检测是否线程仍在执行 + bool canNewFitThread(); + +public: + // 解析解、数值解的切换 + + // 显示与隐藏:解析解、数值解的切换 + // bToNm: true 切换为数值模式,false 切换为解析模式 + void swapAnaNmDocks(bool bToNm); + + // 创建 + void createNmDockWxs(); + + // 返回数值涉及到的Docks + // nIndex: 0:第一个(m_pWxDockNm1) 1:第二个(m_pWxDockNm2) + iDockBaseWx* getNmDockWx(int nIndex); + + // 从 数值或解析 获取参数内容以便更新至 解析或数值 + // bFromNm: true 获取数值相关的参数,false 获取解析相关的参数 + void getBrotherDockParas(QMap& mapParas, bool bFromNm); + +public slots: + + // 拟合线程结束,统一调用 + virtual void slotThreadFinished(); + + // 对应流动段参数改变,如移动水平线,刷新结果视图 + virtual void slotSegmentParamsChanged(ZxSegmentInfo& o); + + // 拟合 + void slotFitModel(AlgCalMode o = ACM_UNKNOWN);//常规 + void slotFitAuto(); //自动 + void slotFitPlate(); //图版 + void refitModelAfterAuto();//这是在自动拟合之后,再一次调用FitModel对结果进行处理 + //void slotFitModelNm();//数值解入口函数 + + //////////////////////////////////////// + // 特征点或特征线方面的响应 + void slotObjSlrAdded(ZxObjBase*); //线或点Added + void slotLineSlrChanged(); //线发生改变 + void slotPointSlrChanged(); //点发生改变 + void slotPointSlrDbClicked(QPointF pt);//点双击 + void slotLineSlrDbClicked(QPointF pt); //线双击 + + // 特征点和需要两条线计算的模型(这些函数并非slots,放在此处只是为了方便对照代码) + void runCalByCurSlr(eCharactType eType, ZxObjBase* pObj); + void calBySlrLine(QVector vecObj, + QStringList listType); + void calBySlrPoint(QVector vecObj, \ + QStringList listType, \ + QMap mapParamFunName, \ + QMap mapFunPt); + //////////////////////////////////////// + + + //模型时间划分 + void slotTimeScales(); + + //计算混合黏度 + void slotCalMixViscosity(); + + // 表皮 + void slotToS(bool bFromTime); + + // 运行对半对数图工具栏进行调整 + void slotToolbarSemi(QToolBar* pToolBar); + + // 理论曲线变化,对KSC等参数进行重新计算 + void slotChangedTheoryCurve(QVector& vecOlds, \ + QVector& vecNews); + + //绑定图元信号断开与连接 + void slotBindObjChangedStart(); + void slotBindObjChangedEnd(); + + // 小信号是否显示多一条线接口 + void slotUseSsCbxChanged(bool bChecked); + +#ifdef _SCAN_OLD_CODES_ + // 聚合物和直井切换 + void slotUsePfCbxChanged(bool IsCheck); +#endif + +#ifdef _SCAN_OLD_CODES_ + // 左侧模型变化后,刷新双对数图形中的示意图(暂未启用) + void slotFreshSketchImg(QMap&, int); +#endif + + // (刷新绘图)拟合过程中信号处理 + void slotFreshCharts(); + void slotFreshChartsP(QStringList, int); //图版拟合比较特殊 + //刷新自动拟合过程中曲线 + void slotFreshChartsA(); + + // (刷新结果)拟合后拟合误差及拟合次数展示 + void slotFreshResults_t(QStringList listInfo); + void slotFreshResults_m(); + + // 基础参数对话框流体类型发生改变 + virtual void slotFluidTypeChanged(QString s); + + // 左侧模型参数发生改变 + virtual void slotOptionParasChanged(iModelOption* pOption); + + // 当前窗体所有信息的保存,比如关闭时提问的保存 + virtual bool slotSaveAll(); + + // 在布局前对窗体顺序进行调整 + void slotAdjustMdiAreaWnds(QList& listSubWnds); + + // 双对数曲线框选改变的响应信号 + void slotOpRectChanged(const QRectF& rtBoundV, \ + PlotOperationMode o); + + // 鼠标移动,探测半径以Tip显示,仅限于双对数 + void slotGetTipsExOfPos(QString& sTip, double dX, double dY); + + // 关闭某个字窗体的Confirm + virtual void slotConfirmCloseSubWxs(bool& bClosable); + + // 关闭某个子窗体后触发的响应,刷新布局 + virtual void slotSubWxClosed(); + +protected slots: + + // 成果上传至GX6 + void slotUploadRstParas(); + +/////////////////////////////////////////////////////// +// 右键调整后的菜单响应 + +protected slots: + + // 调整右键,比如优化坐标轴、去除末端效应等 + // 通常是插入,默认是在 Redo/Undo 与保存图片 之间 + void slotAdjustSubContextMenu(QMenu* pMenu); + + // 双对数曲线末端效应 + virtual void slotOptDbLogTailer(); + + // 优化坐标轴 + virtual void slotOptAxisXY(); + virtual void slotOptAxisX(); + virtual void slotOptAxisY(); + +protected: + + virtual void optMainAxisScale(bool bX); + + virtual void optDbLogTailer(); + bool getDeriveCurveData(VecDouble& vecDtm, \ + VecDouble& vecDpwm, \ + VecDouble& vecDtmNoOv, \ + VecDouble& vecDpwmNoOv); + bool dealEndEffect(const VecDouble& vecX, \ + const VecDouble& vecY, \ + VecDouble& vecNewY); + bool updateDeriveCurves(VecDouble& vecDtm, \ + VecDouble& vecDpwm, \ + VecDouble& vecDtmNoOv, \ + VecDouble& vecDpwmNoOv); + +// end 右键调整后的菜单响应 +/////////////////////////////////////////////////////// + +public: + + virtual zxAlgThread* getSubThread(zxAlgThread* p); + + //ZXF202409 获得窗口已经新建过的窗口名称 + bool getAllSubWndNames(QStringList& listSubWnds, QVector& vecShows); + //设置子窗口的状态 + void setSubWndState(QString sWndName); + //设置窗口显示ZXF202409 + void setSubWndShow(QString sWndName); + // 根据图形标识,复制坐标轴相关信息(比如敏感性分析图与双对数一致)ZXF202409 + // 注:sTagFrom通常是双对数图,如果是其他,请咨询wangzg/ZXF进行慎重调用 + void copyPlotAxisRanges(QString sTagFrom, QString sTagTo); + //设置敏感性分析数据 + void setSensitivityPlotData(QStringList listTagCurve, QStringList& listFitCurve, QVector& vecData); + +private: + + // VecDouble + void reOrgaCurData(VecDouble& vecValueF, VecDouble& vecTimeF, \ + VecDouble& vecTimeP, VecDouble& vecValueP); + + // 得到曲线的数据 + void setCurveDataBySerialize(); + bool getCurveData(QString sPlot, QString sCurveName, VecDouble& vecX, VecDouble& vecY); + bool getCurveData(QString sPlot, QString sCurveName, QVector& vecPts); + + // 计算出结果后,设置数据显示,设置结果dock + void setExistCurveDesc(QString s, QString sTagPlot); + void setPlateData(QStringList listFitCurve, int nNdex, QVector &vecData);//ZXF202409 + + + //这里绑定曲线增加参数(敏感性分析不需要信号ZXF202409) + void bindCurve(QStringList list, QString sTagPlot, bool bChanged = true); + bool getDataOfTag(QString sTag, VVecDouble& vvec); + + // 设置特殊(根号,1/4根号)图的数据 + void setSpeciPlot(QString sTag); //特殊的图 + void setDistributePlot(QString sTag);//分布图 + + // 添加数据到图上 + void getSubPlotsDataOf(QStringList list, QString sPlotTag, QVector &vecData); + void setSubPlotsOf(QStringList list, QString sTagPlot, bool IsAdd = false); + void updateSubPlotsOf(QString sPlotTag, QVector vecData, bool isAdd = false); + void _updatePlotEx(QString sPlotTag, \ + QVector vecDescs, \ + bool isAdd = false); + //自动拟合后根据图名和曲线名获得曲线数据体(是否断开信号(因为双对数图中理论线移动会修改参数)) + void updateSubPlotCurve(QStringList list, QString sTagPlot, bool isDis = false); + + // ZXF2024增加空白页面参数展示 + void updateResultParam(); + void finalDealHist(QString sTagPlot); + void changeCurveAttributes(iGuiPlot* pWxPlot, QString sTag); + +#ifdef _SCAN_OLD_CODES_ + void freshSketchImg(iGuiPlot* pWxPlot, QString sTag); + VecPointF getSketchBound(iGuiPlot* pWxPlot); +#endif + + VVecDouble getAutoFitPt(); + + // 把设计结果存为示意图 + void saveAsModelSketch(); + + // 根据试井之星参数对比对需要保存的参数赋值 + bool setDataOtherItem(zxDataOtherItem* pItem); + + // 确认算法模式 + bool makesureSwapAbouts(AlgCalMode acm, bool bForceAll); + void swapDataToMode(bool bAllMode); + + // 准备干扰相关 + bool prepareInterferes(); + + // 准备边界相关 + bool prepareBdys(); + + // 为西安等准备PVT相关(需要添加则添加,不需要,则清除) + bool fuzzyCmParaAbouts(QMap& mapParas/*, bool bAppend*/); + + //返回所有的跟模型相关的参数(参与拟合的参数) + virtual bool getFitParaAbouts(QMap& mapValues, \ + QMap& mapUnits); + virtual bool getFitParaAbouts(QVector*& pVecPtr); + + + //模型测试调用所有的模型ZXF20241127 + void calAllModel(); + // + +public: //20250121 为外部(如数值试井)增加接口 + + /// @brief 允许外部(比如数值试井)对当前子窗口Plot进行曲线添加/更改 + /// @param o 具体哪一个,此处应该为 FSRT_DoubleLog、FSRT_SemiLog、FSRT_Hist 三者之一 + /// @param vecDescs 具体曲线,定义参见iCurveDesc + /// @param bOverwrite 如果已有,是否覆盖 + /// @param ptrError 错误描述之指针 + /// @note 曲线名称,请参见 mAlgDefines.h文件中的定义进行,比如 s_Souce_Curve ,不能随便填写 + virtual bool adjustFitSubPlotBy(FitSubRstTag o, \ + QVector& vecDescs, \ + bool bOverwrite = true, + QString* ptrError = nullptr); + + /// @brief 允许外部(比如数值试井)对当前结果子窗口进行填写 + /// @param o 具体哪一个,此处通常 应该为 FSRT_NmRst + /// @param vecResults 具体结果,定义参见iResultInfo + /// @param bOverwrite 如果已有,是否覆盖 + /// @param ptrError 错误描述之指针 + /// @note 具体调用时,请与wzg协商 + virtual bool adjustFitSubRstBy(FitSubRstTag o, \ + QVector& vecResults, \ + bool bOverwrite = true, + QString* ptrError = nullptr); + + /// @brief 获取当前分析SunbWnd的子窗口 + /// @param o 具体哪一个 + /// @param bCreateIfNotExists 如果不存在,是否强制创建,为true 创建/否则不创建 + /// @param ptrError 错误描述之指针 + /// @note 具体返回的窗体实体类型,请参见FitSubRstTag定义中的说明 + virtual QWidget* getFitSubRstWxOf(FitSubRstTag o, \ + bool bCreateIfNotExists = false, + QString* ptrError = nullptr); + +public: + + // 反褶积相关部分 + bool runDeconvolv(); + bool setDeconvInfos(); + + // 根据反褶积要求调整双对数的个数,并重新布局 + bool relayoutDblPlotAbouts(bool bOneDblLog); + +protected slots: + + // 反褶积结果部分 + void slotDeconvRsts(QMap& mapRsts, bool bOneDblLog); + +public: + + // 智能试井相关部分 + bool runAiModelClassify(); + bool setModelClassifyInfos(); + +protected slots: + + // 智能试井结果部分 + void slotAiModelRsts(QString sModelCodes, QMap& mapParas); + +protected: + + // 根据类型检索Plot窗口标识 + QString _getSubPlotTagOf(FitSubRstTag o, QString& sError); + + // 更改图形 + bool _changeFitSubPlotOf(iGuiPlot* pWxPlot, \ + QVector& vecDescs, \ + bool bOverwrite, \ + QString& sError); + +private: + + ZxMdiArea* m_pMdiArea; //MDI + iWxResult* m_pWxResult; //结果显示载体 + + QVector m_vecSubPlots; //子绘图窗体 + + QStringList m_listTags; //图标签 + QStringList m_listCoord; //特殊图的标签(T,根号T,1/4根号T) + + VVecDouble m_vvecDataF; //流量数据 + VVecDouble m_vvecDataP; //压力数据 + + // 备份原始,方便调用,当然也可以用到结果中,比如流量变表皮 + VVecDouble m_vvecAllDataF; //流量数据 + VVecDouble m_vvecAllDataP; //压力数据 + VVecDouble m_vvecTrimDataF; //流量数据 + VVecDouble m_vvecTrimDataP; //压力数据 + + // 新加 + iDockBaseWx* m_pWxDockModelOption; //模型选择 + iDockBaseWx* m_pWxDockModelParameter; //模型参数 + iWxModelOption* m_pWxModelOption; // + iWxModelParameter* m_pWxModelParameter; + + // 数值解涉及到的Dock,由于不知道具体内容,暂时以1,2命名 + iDockBaseWx* m_pWxDockNm1; + iDockBaseWx* m_pWxDockNm2; + + iWxCharact* m_pWxChartPt; + iWxTime* m_pWxTimeScales; + + // 拟合处理类 + iAlgFitBase* m_pFit; + // cmAlgFitBase* m_pFitCm; + Fit_Type m_oFitType; //大的拟合类 + + iModelOption* m_pModelOption; + double m_dQ;//初始流量值 + + // 试井设计选用的Option + iModelOption* m_pModelOptionDn; + bool m_bDnMode; + + iWxSketchSaveAs* m_pWxSketchSaveAs; + + // 示意图,不涉及序列化 + ZxObjSketch* m_pObjSketch; + QString m_sImgPath;//不涉及序列化 + + AlgCalMode m_oLastCalMode; + bool m_bSwapMode; //是否应用Swap模式,TODO,20220322 是否涉及序列化 + ZxSegmentInfo* m_pSegInfoAll;//备份,非裁剪 + ZxSegmentInfo* m_pSegInfoTrim;//备份,裁剪 + + iAxisTickInfo* m_pAtiLogX; //双对数的属性 + iAxisTickInfo* m_pAtiLogY; + + iWxDeConv* m_pWxDeconv; //反褶积相关,涉及序列化 + iWxModelClassify* m_pWxModelClassify; //智能试井,模型分类 + + VVecDouble m_vvecTempFitP; //反序列化获取的P拟合,临时 + QString m_sTempAnalRunID; //反序列化获取的AnalRunID,临时 + + iDynSkinInfo* m_pDynSkinInfo;//需要序列化 + + // 3图+1结果窗体,是否改用新的布局 + bool m_bNewLayoutMode; //临时,不涉及序列化 + + bool m_bAutoReverse;//临时,不涉及序列化 + + + // TODO 20250228 对于多个流动段分析成果情况下,加载成果,右侧空白,权益之际的处理 + bool m_bRelayouted;//临时,不涉及序列化 + +}; diff --git a/Include/mTool/mToolPvt/iWxPvtBase.h b/Include/mTool/mToolPvt/iWxPvtBase.h index 6924797..ac20749 100644 --- a/Include/mTool/mToolPvt/iWxPvtBase.h +++ b/Include/mTool/mToolPvt/iWxPvtBase.h @@ -41,10 +41,15 @@ protected: // 默认值 virtual void initDefault(); - // 绑定参数 + /// @brief 绑定界面上某个参数数值/单位下拉组件与具体的参数 + /// @param sPara 参数,英文标识,比如 K + /// @param pWxValue 输入数值框,通常为QLineEdit + /// @param pWxUnit 单位下拉框架,通常为QComboBox + /// @param dDefault 默认值,如果不传入,则取系统配置 + /// @param sCurUnit 当前单位,如果不传入,则取系统配置 void appendParaInfos(QString sPara, - QWidget* pValue, - QWidget* pUnit, + QWidget* pWxValue, + QWidget* pWxUnit, double dDefault = SYS_VALUE_INVALID, QString sCurUnit = ""); diff --git a/Include/mTool/mToolPvt/iWxPvtHCN.h b/Include/mTool/mToolPvt/iWxPvtHCN.h new file mode 100644 index 0000000..e411373 --- /dev/null +++ b/Include/mTool/mToolPvt/iWxPvtHCN.h @@ -0,0 +1,71 @@ +#pragma once + +#include "iWxPvtBase.h" + +namespace Ui { +class iWxPvtHCN; +} + +class iWxPvtComposition; +class M_TOOL_PVT_EXPORT iWxPvtHCN : public iWxPvtBase +{ + Q_OBJECT + +public: + + explicit iWxPvtHCN(QWidget *parent = 0); + ~iWxPvtHCN(); + + void setMapParas(QMap& map); + virtual QString getFilePvtTag(); + + // 初始化 + virtual void initUI(); + + // 返回数据 + virtual bool getParaValue(QString sPara, + double &dValue, + QString sUnitDest = ""); + +protected: + + // 默认值 + virtual void initDefault(); + void _initDefaultOf(QString sPara, QLineEdit* pTbx); + + // 刷新摩尔 + void refreshMole(); + + // 计算临界值 + void calAndFreshTcPc(QWidget *pSender = nullptr); + + // 判断数值是否正确 + bool checkInputOfHCN(QWidget *pSender = nullptr); + + virtual void onSerialize(ZxSerializer* ser); + virtual void onDeserialize(ZxSerializer* ser); + +private slots: + + // H2S/CO2/N2的摩尔模式 + void on_radioFraction_clicked(); + void on_radioPercent_clicked(); + + // H2S/CO2/N2的摩尔数值验证 + void on_tbxH2S_textChanged(const QString &arg1); + void on_tbxCO2_textChanged(const QString &arg1); + void on_tbxN2_textChanged(const QString &arg1); + + void on_btnApply_clicked(); + void on_btnClose_clicked(); + +signals: + + void sigHcnSubChanged(QMap& ); + +private: + + Ui::iWxPvtHCN *ui; + + QMap m_mapHCNs; //范围:0-100 +}; diff --git a/Include/mTool/mToolPvt/iWxPvtSubPhaseGas.h b/Include/mTool/mToolPvt/iWxPvtSubPhaseGas.h index 34ec678..05f2fe9 100644 --- a/Include/mTool/mToolPvt/iWxPvtSubPhaseGas.h +++ b/Include/mTool/mToolPvt/iWxPvtSubPhaseGas.h @@ -88,6 +88,7 @@ public slots: void on_btnComposition_clicked(); void slotCompSubChanged(QMap& map); + void slotHcnSubChanged(QMap& map); // 自行调整,绘图视图下侧的内容显示 virtual void slotAdjustPlotBottomLayout(QString sPara, QHBoxLayout*& pLayoutH); @@ -109,7 +110,7 @@ private: Ui::iWxPvtSubPhaseGas *ui; QMap m_mapComps;//百分数,比如20,30等,不是小数如0.2,0.3等 - int m_nCustomIndex; + int m_nCompItemIndex; // match 功能,20210718 QPushButton* m_pBtnZgMatchPrepare;