feat:更新框架头文件

feature/Merge-Framework-20260721
lh 1 month ago
parent 1f0c44e270
commit 129e7251fc

@ -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);

@ -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

@ -0,0 +1,70 @@
#pragma once
#include <QComboBox>
#include <QListView>
#include <QApplication>
#include <QDesktopWidget>
#include <QShowEvent>
#include <QFontMetrics>
#include <QStyleOptionComboBox>
#include <QPainter>
#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; // 缓存的计算宽度
};

@ -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 1请在Widget全部设置setCellWidget完毕后调用本函数
/// 2如果某方向不需设置则传入VecInt为空即可
void setSpStrenchSizes(QList<int>& vecHs, QList<int>& vecVs);
void setSpStrenchSizes(const QList<int>& vecHs, const QList<int>& vecVs);
/// @brief 设定主分割器(垂直布局)大小比例因子(整数)
/// @param vecSizes
/// @note 请在Widget全部设置setCellWidget完毕后调用本函数
void setSpMainSizes(const QList<int>& vecSizes);
/// @brief 设定主分割器(垂直布局)大小比例因子(整数)
/// @param vecSizes
/// @note 请在Widget全部设置setCellWidget完毕后调用本函数
void setSpSubSizes(int r, const QList<int>& 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<int>& vecSizes);
public:
// 清理 QSplitter 的子部件
@ -80,6 +101,7 @@ private:
ZxSplitter* m_pSplitterMain;
int m_nSpacing; //不涉及序列化
bool m_bSyncDragging; //竖直方向拖动是否同步拖动默认为true
bool m_bUnableSP;
};

@ -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;
};

@ -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;
};

@ -0,0 +1,49 @@
#pragma once
#include <QComboBox>
#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;
};

@ -0,0 +1,85 @@
#pragma once
#include <QCheckBox>
#include <QComboBox>
#include <QListWidget>
#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<bool> m_listChecked;
// QList<QVariant> m_listItemData;
// QList<QCheckBox*> m_listCheckBoxes;
// bool m_bAllConsider;
// bool m_bByAll;
QMap<QCheckBox*, bool> m_mapRawStates;
// QList<QRadioButton*> 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:
};

@ -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<QString, iUnitGroup*> m_mapUnitGroups;
bool m_bUnableSP;
};

@ -4,6 +4,8 @@
#include <QAbstractTableModel>
#include <QAbstractItemModel>
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<int, QPair <iUnitItem* , iUnitItem* > > m_mapColUnitPairs;
};

@ -1,7 +1,10 @@
#pragma once
#include <QTableView>
#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:

@ -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<int, QStringList> m_mapAllFields;
QMap<int, QStringList> m_mapFilterFields;
ZxTableHeaderViewFilter* m_pHeaderView; //false:单选Radio
bool m_bEnableSP;
};

@ -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;
};

@ -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();

@ -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

@ -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

@ -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);

@ -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:

@ -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; //存错误信息
};

@ -5,6 +5,7 @@
class iUnitItem;
class iUnitGroup;
// 为单位系统而额外增加的接口以方便快捷调用
class I_SYSUTILS_EXPORT iUnitHelper
{
public:

@ -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;

@ -0,0 +1,60 @@
#pragma once
#include "iModelInfoBase.h"
/*-- 20260626针对干扰模型新增以方便后期更好地维护
1.
2.FlagflagInterfere = 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<QString, QString> m_mapSubItems; //配置的类似nf之类的子项其中value为;逗号分割的QString
};

@ -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

@ -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
};

@ -36,9 +36,10 @@ protected:
public:
// xml解析的数据项,填写项的英文Name
QStringList m_listSubItemNames; //控制的项,如产液段数 控制 三项:产液段位置;产液段长度;产液段产量
QStringList m_listSubItemNames; //控制的项,如产量段数 控制 三项:产量段位置;产量段长度;产量段产量
QStringList m_listSubItemAliass;//别称
//QMap<QString, iParameter*> m_mapSubParas; //控制的项对应的基础参数个数与m_listSubTags对应
//QStringList m_listSubItemNamesBk; //m_listSubItemNames的备份
QStringList m_listSubItemNamesBk; //m_listSubItemNames的备份
QString m_sSubGroupTag; //显示的子项分组的名称,如压裂段#、产量段#
};

@ -31,9 +31,8 @@ protected:
public:
// // xml解析的数据项,填写项的英文Name
// QStringList m_listSubItemNames; //控制的项,如产液段数 控制 三项:产液段位置;产液段长度;产液段产量
// QStringList m_listSubItemNames; //控制的项,如产量段数 控制 三项:产量段位置;产量段长度;产量段产量
// QStringList m_listSubItemAliass;//别称
// //QMap<QString, iParameter*> m_mapSubParas; //控制的项对应的基础参数个数与m_listSubTags对应
// QStringList m_listSubItemNamesBk; //m_listSubItemNames的备份
};

@ -20,6 +20,7 @@ public:
vecModelInfoBasesPtr* pVecWel,
vecModelInfoBasesPtr* pVecRes,
vecModelInfoBasesPtr* pVecBdy,
vecModelInfoBasesPtr* pVecExtInterfere,
vecModelDescGroupsPtr*& pVecGroups,
QString sFile);

@ -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<QString, double>& map,
// bool bClearMap = true);
// virtual bool getAllUnitBinderParaUnits(QMap<QString, QString>& 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;
};

@ -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<int> 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<int> m_vecStreches;//如果启用strench采用的数值
iUnitWxBinder* m_pUnitBinder;
QString m_sParaSrcTag;
};

@ -0,0 +1,163 @@
#pragma once
#include <QObject>
#include <QLineEdit>
#include <QComboBox>
#include <QMap>
#include <QPointer>
#include <QList>
#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<QLineEdit*> listTbxValues, \
QComboBox* pCbxUnit, \
iUnitGroup* pUnitGroup, \
const QString& sBaseUnit, \
QList<double> listValueInits = QList<double>(), \
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<zxBindWxPair*> m_listPairs;
// 参数来源标识,默认情况下,为 s_Sys_Para_Default
// 不涉及序列化
QString m_sParaSrcTag;
// Error
QString m_sError;
};

@ -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<QPointer<QLineEdit> > listTbxValues;
QPointer<QComboBox> pCbxUnit;
iUnitGroup* pUnitGroup;
QString sBaseUnit;
QList<double> listBaseValues;
bool isUpdating;
int nCurDigit;
iParameter* pParameter;
QString sPara;
};

@ -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); //中间分隔

@ -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;
};

@ -30,6 +30,7 @@ public:
int getChildCount(); //孩子数目
int getChildVisibleCount(); //可见的孩子数目
iGridRowItem* getChildAt(int n); //获取
int indexOf(iGridRowItem* pChild);
void removeAllChildren(); //Clear
bool getAllItems(QVector<iGridRowItem*>& vec);//不考虑层级
int getItemLevel(); //获取层次级别
@ -53,6 +54,7 @@ public:
virtual void configEditor();
virtual QString getEditorCss(bool bValid);
virtual QWidget* getMainEditor();
virtual void getAllEditors(QVector<QWidget*>& 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;
};

@ -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();

@ -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);

@ -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;
};

@ -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);

@ -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();

@ -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);

@ -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;
};

@ -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;
};

@ -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<iResultInfo>& 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<QString, double> > m_vvecSubParas;
};

@ -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;
};

@ -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<iGridRowItem *>& vec, \
bool bDnMode, \
QWidget* pWxDlg);
// 对外暴露接口
// 允许在外部创建Item然后传递进来
// 该方式用的比较少
virtual void buildRowUtilsEx(QVector<iGridRowItem *>& 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<iGridRowItem*> 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<iGridRowItem*> 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<iGridRowItem*>& vec); //不考虑层级
// 指针
//const QVector<iGridRowItem*>& getGridItems() const; ////不考虑层级
QVector<iGridRowItem*>* getVecGridItemPtrs();
QVector<iGridRowItem*>* 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<iGridRowItem*>& vec); //不考虑层级
// 范围及布局
virtual void setSplitPos(double d);
virtual void updateLayout();
virtual void doLayout();
protected:
// 右键拷贝数据
virtual void copyDataBy(CopyDataMode o);
virtual bool collectsDataBy(CopyDataMode o, QVector<iGridRowItem*>& 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:
// 从各个Wxm_vecWxDatas中遍历查找
virtual bool setParaValue(QString sPara, QVariant o);
virtual bool getParaValue(QString sPara, QVariant& o);
// 返回所有参数Key为英文ID
virtual bool getAllParaValues(QMap<QString, QVariant>& map,
bool bOnlyFitted = false,
@ -324,12 +397,15 @@ public:
virtual bool getBdyInfos(QMap<QString, int>& 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;
};

@ -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();

@ -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, \

@ -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<ZxSubAxisBase*> getVisibleAxisOf(AxisPos oPos);
// 坐标数值转换(屏幕坐标与实际坐标)
// 注意Value表示实际坐标、Pos表示屏幕坐标
// getValueForPos: 已知屏幕坐标,求实际坐标
// getPosForValue: 已知实际坐标,求屏幕坐标
virtual QPointF getValueForPos(QPointF& pt) const;
virtual QPointF getPosForValue(QPointF& pt) const;
virtual QVector<QPointF> getValueForPos(QVector<QPointF>& vecPts) const;
virtual QVector<QPointF> getPosForValue(QVector<QPointF>& 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<ZxSubAxisBase*, QPointF>& 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;
};

@ -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 *);

@ -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;
};

@ -70,6 +70,9 @@ protected:
// 处理Resize主要是正方形网格
bool changeToSize(QSize sz, bool bResizeMode);
//ZXF20260629增加一个函数 设置 坐标轴的最大最小(这里不设置导致 图无法恢复到原来状态)
void setResetAxisValue();
public slots:
virtual void slotChangeSizeWithChangedXY();

@ -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;
};

@ -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);

@ -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"

@ -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
/////////////////////////////////////////

@ -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"

@ -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;
};

@ -53,6 +53,7 @@ public:
virtual bool createChildrenLayer();
virtual bool createChildrenGuageP();
virtual bool createChildrenGuageF();
virtual bool createChildrenGuageT();
virtual bool createChildrenGas();
virtual bool createChildrenWellBore();

@ -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<wdtDefineAnal*> vecWdtAnalDefinesPtr;

@ -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;
};

@ -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<wdtAlgItemGroup*>* getWdtAlgGroupPtrs();
wdtAlgItemGroup* getWdtAlgGroup(QString sNameOrId);

@ -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<int> 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<QString, int>& mapCols, \
VecDouble& vecX, \
QMap<int, VecDouble>& 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<QString, int>& map);
bool getDtIndexFrom(const QMap<QString, int>& map, int& nIndexT1, int& nIndexT2);
bool getValueIndexFrom(const QMap<QString, int>& map, QMap<int, QString>& 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<double>& vecX, QVector<double>& 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<int, VecDouble>& mapYs, \
const int& nIndexD, \
const obInfoExts ext);
bool saveObjsAsSole(const VecDouble& vecX, \
const QMap<int, VecDouble>& 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<QString, QString> 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;
};

@ -0,0 +1,97 @@
#pragma once
#include <QComboBox>
#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<QString, iUnitGroup*> m_mapUnitGroups;
bool m_bUnableSP;
};

Binary file not shown.

@ -317,6 +317,13 @@ public:
// 是否层内节点(不考虑层内本身的层级)
virtual bool isUpperLayerInnerOf(iGridRowItem* pItem);
public:
// 获取当前所在的父级层的标识,可能为空
static tGridRowGroupLayer* upperLayerOf(iGridRowItem* pItem);
// 获取当前所在的父级层的标识,可能为空
static QString upperLayerTagOf(iGridRowItem* pItem);
protected:
// 是否多层模型其实就是true该类就是针对多层模型设计非多层不调用本类

@ -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;

@ -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:
// 模型选择

@ -64,6 +64,7 @@ public:
virtual bool getAllParaUnits(QMap<QString, QString>& map,
bool bOnlyFitted = false,
bool bClearMap = true);
virtual bool getVecAllItemPtrs(QVector<iGridRowItem*>*& 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<QString, QVariant>& map);
// 根据多相单相对右侧参数进行调整
void setToMpMode(bool bMultiPhase, PvtFluidType pft);
// 需要特别注意:本函数增加了对于空白项的处理
void freshToMpMode(bool bMultiPhase, PvtFluidType pft);
void freshParasByMap(QMap<QString, QVariant>& mapOldValues);
void freshParasByValue(QString sPara, QVariant o);
@ -122,6 +124,9 @@ public:
public slots:
// 当前面窗体参数改变时,本窗体响应,暂未启用
virtual void slotParasObtained(QMap<QString, QVariant>& 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<para_input_info>& vec);
protected:
void showItems(bool bMainItems);
@ -248,10 +268,6 @@ protected:
protected:
// 参数来源标识,默认情况下,为 s_Sys_Para_Default
// 不涉及序列化
QString m_sParaSrcTag;
// 临时,是否线性流,目前只考虑了 常规,其它如多层等均未考虑
// 该函数是基于WelID根据后台ini文件进行判断
// 目的是决定,边界是否特殊定制

@ -35,6 +35,13 @@ public:
double getBtWidth();
double getBtHight();
/// @brief 是否折叠模式,
/// @note 如果当前根本就没有UseMode=3的参数
/// 也就是说,所有参数都是正常显示的,这时候是不显示折叠按钮的
/// 同样,也无需弹出右键进行显示/隐藏等操作
bool isFoldMode();
/// @brief 在折叠模式为true的前提之下当前折叠的状态
bool isFolded();
void setFolded(bool b);

@ -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:

@ -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);

@ -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);

@ -41,7 +41,7 @@ public:
void setToolBarVisible(bool );
// 返回所有View
QMap<QString, ZxTableView*>* getMapTableViews();
QMap<ZxObjCurveBase*, ZxTableView*>* 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<QString, ZxTableView*> m_mapTableViews;
QMap<ZxObjCurveBase*, ZxTableView*> m_mapTableViews;
// 临时变量当前右键针对的View所绑定的Curve
ZxObjCurveBase* m_pCurTargetCurve;
};

@ -58,7 +58,7 @@ signals:
void sigAdjustToolBar(QToolBar*&);
// 在保存时通过该信号获取对应的DataObj
void sigGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p);
//void sigGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p);
// 数据发生了改变
void sigTableDataChanged(VVecDouble&);

@ -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;

@ -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;

@ -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<QString, iSubWnd*>& 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

@ -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:
// 下拉流体类型

@ -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<QPointF>& vecP, \
QVector<QPointF>& 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<QPointF>& vecF);
protected:
Ui::iWxRunOptionStd *ui;
// 流动段载体
ZxSegmentInfo* m_pSegInfo;
// 多相数据竖向排列size为4//注意:[0]时间,[1]油,[2]气,[3]水
VVecDouble m_vvecMpData;
QString m_sFlowDataCode;
bool m_bIniting;
QVector<QPointF> m_vecBackupF;
// 当前选择的 数据(如果截取)
QVector<QPointF> m_vecPtsCurveP;
QVector<QPointF> m_vecPtsCurveF;
// 为了方便应用
QComboBox* m_pCbxStepUpDown;
QCheckBox* m_pCbxShowRawCurves;
QLabel* m_pLblPtCounts1;
// QLabel* m_pLblPtCounts2;
//算法
iAlgModelBase* m_pAlgModel;
// 临时,不涉及序列化
QString m_sPtsInit;
};

@ -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<iCurveDesc> m_vecCurveDesc;
QMap<QString, QStringList> m_mapCdConfigs;
};
#define _curveHelper iModelCurveDesc::getInstance()

@ -38,6 +38,9 @@ class ZxRstWnd;
// IPRIPR准备和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);

@ -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; //当前是否正开启弹窗
};

@ -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<QString, double>& mapValues, \
QMap<QString, QString>& mapUnits);
virtual bool getFitParaAbouts(QVector<iGridRowItem*>*& pVecPtr);
bool getFitParaValues(QMap<QString, double>& map);
bool getFitParaUnits(QMap<QString, QString>& map);
@ -104,6 +108,9 @@ public:
// 配置算法载体
bool configAlgModel();
//ZXF20260618设置算法的压力导数曲线计算算法对象
void setAlgDerivCurveCalPtr(iAlgDerivCurveCal *pPtr);
protected:
// 重新调整工具栏

@ -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)trueEnabled falsedisabled
/// @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);
// 从各个Wxm_vecWxDatas中遍历查找
bool setParaValue(QString sPara, double d);
bool getParaValue(QString sPara, double& d);
// 返回所有参数Key为英文ID
virtual bool getAllParaValues(QMap<QString, double>& map,
bool bOnlyFitted);
//返回所有的模型参数
virtual bool getAllParaValuesUnit(QMap<QString, QString>& map,
bool bOnlyFitted);
//返回所有的跟模型相关的参数(参与拟合的参数)
virtual bool getFitParaAbouts(QMap<QString, double>& mapValues, \
QMap<QString, QString>& mapUnits);
virtual bool getFitParaAbouts(QVector<iGridRowItem*>*& pVecPtr);
bool getFitParaValues(QMap<QString, double>& map);
bool getFitParaUnits(QMap<QString, QString>& map);
// 返回所有的跟模型相关的边界参数的类型,不渗透或定压
// 不渗透0
// 定压1
bool getBdyInfos(QMap<QString, int>& 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<iWxBase*>* 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<iCurveDesc>& 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<iResultInfo>& 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 这些参数值通常存于PvtHeader之中
bool getPvtParaValues(QStringList listParas, QMap<QString, double>& 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<ZxObjWmPoint*>& vecWms);
/// @brief 触发信号,获取当前的干扰井井点信息
/// @return vecWms.count()>1时有效
/// @note 仅仅返回正确有效的井点,其中中心井默认放在第一个
/// 如果vecWms.count()<=1,则认为不考虑井位图
void sigGetInfInfos(QVector<ZxObjInfPoint*>& vecWms);
protected:
// 分别为 Basic、Fluid、GasConst、PF、ModelOption、ModelParameter;
//QVector<iWxBase*> m_vecWxDatas;
// 分别为 Basic、Pvt、Diff、Pseu、ModelOption、ModelParameter;
QVector<iWxBase*> m_vecWxDatas;
// 输入参数部分为了统一此处用Wizard把iWxBase包裹
// 每个WiZard包括四个但是只显示一个
QVector<iWxAnalWizard*> m_vecWxAnalWizards;
// 常规拟合算法类
// 由于Fitting和AnalDn都用到故放在该类
iAlgModelBase* m_pAlgModel;
iParaManager* m_pParaManager;
// 是否序列化,由子类确定
QPointF m_ptFlowFirst;
#ifdef QT_DEBUG
bool m_bXcmBrother;
#endif
};

@ -77,6 +77,13 @@ public:
QVector<QPointF>& 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<QString, double>& mapValues, \
QMap<QString, QString>& mapUnits);
virtual bool getFitParaAbouts(QVector<iGridRowItem*>*& 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模式TODO20220322 是否涉及序列化
ZxSegmentInfo* m_pSegInfoAll;//备份,非裁剪

@ -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<QPointF>& vecP, //Pressure Data
QVector<QPointF>& vecF);
// 返回数据点
bool getDataPF(QVector<QPointF>& vecP, //Pressure Data
QVector<QPointF>& 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<QPointF>& vecP, \
QVector<QPointF>& 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<QString, QVariant>& 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<ZxObjCurve*>& vecRaws, \
QVector<ZxObjCurve*>& vecFittings);
// 执行命令通常来自Ribbon
virtual bool runCmdBy(QString sName, QString sID);
/// @brief 命令是否Enabled的状态判断通常来自Ribbon
/// @param b (out)trueEnabled falsedisabled
/// @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<QString, double>& map,
bool bOnlyFitted);
//返回所有的模型参数
virtual bool getAllParaValuesUnit(QMap<QString, QString>& map,
bool bOnlyFitted);
protected:
// 权宜之计的临时接口主要是对m_vvecAllDataP/m_vvecAllDataF的临时处理
QVector<QPointF> dataToVecPts(bool bAll, bool bP);
bool vecPtsToData(QVector<QPointF>& vec, bool bAll, bool bP);
VVecDouble* _checkDataVVecPtr(bool bAll, bool bP);
QVector<QPointF> _dataToVecPts(VVecDouble* pVvec);
bool _vecPtsToData(VVecDouble* pVvec, QVector<QPointF>& vec);
// 设置流动段模型参数信息
void configFitInfos(bool bFittedOnly = false);
void objWms2InterfereWells(QVector<ZxObjInfPoint*> vecWms, \
QVector<iInterfereWell*>& vecWells);
void calOtherInfos();
void calOtherInfoKoKg();
void freshKH();//处理地层系数
double calKH(QMap<QString, double>* pMap);
// bActivatedByUi 是否由于人机交互触发,比如拖动特征线、拖动理论线等
// listParaChangeds 当前已经改了哪些参数
void setParamByCal(bool bActivatedByUi, \
QStringList listParaChangeds = QStringList());
void getSpeciPtByPointSlr(QVector<ZxObjBase*> vecPoint, \
QStringList listType, \
QVector<iSpeciPt*>& vecPt);
void getFunFindPt(QMap<QString, QString> mapParamFunName, \
QMap<QString, QStringList> mapFunPt, \
QVector<iSpeciPt*> vecPt, QVector< QVector<iSpeciFun*> >&vvecFun, \
QStringList& listParas);
// 重新调整工具栏
virtual void reAdjustToolbar(QToolBar*);
void calParaByFunName(QVector<iSpeciFun*> 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<ZxObjLineSlr*, double>& mapLines, \
bool bCreateIfNotExists, \
QMap<double, bool>* pMapCreateds = nullptr);
bool resetSpecCurves(QMap<ZxObjLineSlr*, double>& mapLines, \
QMap<double, bool>* 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<iSpeciLine*> &vecLine);
void getInfoFromSpeciCrossLine(QVector<ZxObjBase*> vecObj, QStringList listType, \
QVector<iSpeciCrossLine*>& 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<QString, QVariant>& 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<ZxObjBase*> vecObj,
QStringList listType);
void calBySlrPoint(QVector<ZxObjBase*> vecObj, \
QStringList listType, \
QMap<QString, QString> mapParamFunName, \
QMap<QString, QStringList> mapFunPt);
////////////////////////////////////////
//模型时间划分
void slotTimeScales();
//计算混合黏度
void slotCalMixViscosity();
// 表皮
void slotToS(bool bFromTime);
// 运行对半对数图工具栏进行调整
void slotToolbarSemi(QToolBar* pToolBar);
// 理论曲线变化对KSC等参数进行重新计算
void slotChangedTheoryCurve(QVector<QPointF>& vecOlds, \
QVector<QPointF>& 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<QString,QVariant>&, 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<QMdiSubWindow*>& 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<bool>& 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<iCurveDesc>& 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<QPointF>& vecPts);
// 计算出结果后设置数据显示设置结果dock
void setExistCurveDesc(QString s, QString sTagPlot);
void setPlateData(QStringList listFitCurve, int nNdex, QVector<iCurveDesc> &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<iCurveDesc> &vecData);
void setSubPlotsOf(QStringList list, QString sTagPlot, bool IsAdd = false);
void updateSubPlotsOf(QString sPlotTag, QVector<iCurveDesc> vecData, bool isAdd = false);
void _updatePlotEx(QString sPlotTag, \
QVector<iCurveDesc> 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<QString, double>& mapParas/*, bool bAppend*/);
//返回所有的跟模型相关的参数(参与拟合的参数)
virtual bool getFitParaAbouts(QMap<QString, double>& mapValues, \
QMap<QString, QString>& mapUnits);
virtual bool getFitParaAbouts(QVector<iGridRowItem*>*& 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<iCurveDesc>& 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<iResultInfo>& 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<QString,VecDouble>& mapRsts, bool bOneDblLog);
public:
// 智能试井相关部分
bool runAiModelClassify();
bool setModelClassifyInfos();
protected slots:
// 智能试井结果部分
void slotAiModelRsts(QString sModelCodes, QMap<QString, double>& mapParas);
protected:
// 根据类型检索Plot窗口标识
QString _getSubPlotTagOf(FitSubRstTag o, QString& sError);
// 更改图形
bool _changeFitSubPlotOf(iGuiPlot* pWxPlot, \
QVector<iCurveDesc>& vecDescs, \
bool bOverwrite, \
QString& sError);
private:
ZxMdiArea* m_pMdiArea; //MDI
iWxResult* m_pWxResult; //结果显示载体
QVector<QWidget*> m_vecSubPlots; //子绘图窗体
QStringList m_listTags; //图标签
QStringList m_listCoord; //特殊图的标签T根号T1/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模式TODO20220322 是否涉及序列化
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;//临时,不涉及序列化
};

@ -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 = "");

@ -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<QString, double>& 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<QString, double>& );
private:
Ui::iWxPvtHCN *ui;
QMap<QString, double> m_mapHCNs; //范围0-100
};

@ -88,6 +88,7 @@ public slots:
void on_btnComposition_clicked();
void slotCompSubChanged(QMap<QString, double>& map);
void slotHcnSubChanged(QMap<QString, double>& map);
// 自行调整,绘图视图下侧的内容显示
virtual void slotAdjustPlotBottomLayout(QString sPara, QHBoxLayout*& pLayoutH);
@ -109,7 +110,7 @@ private:
Ui::iWxPvtSubPhaseGas *ui;
QMap<QString, double> m_mapComps;//百分数比如20,30等不是小数如0.2,0.3等
int m_nCustomIndex;
int m_nCompItemIndex;
// match 功能20210718
QPushButton* m_pBtnZgMatchPrepare;

Loading…
Cancel
Save