|
|
#pragma once
|
|
|
|
|
|
#include "iDlgBase.h"
|
|
|
|
|
|
#include "iFileEngine.h"
|
|
|
#include "mGuiDataLoad_global.h"
|
|
|
#include "iWxPressError.h"
|
|
|
|
|
|
namespace Ui {
|
|
|
class iWxDataLoad;
|
|
|
}
|
|
|
|
|
|
class ZxTableView;
|
|
|
class ZxTableModel;
|
|
|
class tTableHeaderViewUnit;
|
|
|
class ZxPlot;
|
|
|
class iGuiPlot;
|
|
|
class ZxDataWell;
|
|
|
class ZxDataObject;
|
|
|
class ZxDataGaugeBase;
|
|
|
|
|
|
class M_GUI_DATA_LOAD_EXPORT iWxDataLoad : public iDlgBase
|
|
|
{
|
|
|
Q_OBJECT
|
|
|
|
|
|
public:
|
|
|
|
|
|
// 当前数据对应的类型
|
|
|
enum DataLoadType
|
|
|
{
|
|
|
dtPressure = 0, //压力数据
|
|
|
dtFluid, //流量
|
|
|
dtPresAndTemp, //温度+压力
|
|
|
dtTemp, //温度
|
|
|
dtOGW, //油气水,多相
|
|
|
dtAuto, //自动判断
|
|
|
dtUnkown //
|
|
|
};
|
|
|
|
|
|
// 加载数据时时间格式
|
|
|
enum DateTimeMode
|
|
|
{
|
|
|
DTM_Value_FromStart = 0,//相对时间,从0开始一直持续时间
|
|
|
DTM_Value_Duration, //相对时间,每一段持续时间,如流量
|
|
|
DTM_Real_Time, //真实时间格式
|
|
|
DTM_Real_DateTime, //日期时间格式
|
|
|
DTM_Real_Date, //日期 几乎不常用
|
|
|
DTM_Unknown
|
|
|
};
|
|
|
|
|
|
|
|
|
public:
|
|
|
explicit iWxDataLoad(DataLoadType oType, \
|
|
|
bool bFixWellName = false, \
|
|
|
ZxDataWell* pTargetDataWell = nullptr,
|
|
|
QWidget *parent = 0);
|
|
|
~iWxDataLoad();
|
|
|
|
|
|
private:
|
|
|
|
|
|
// 初始化
|
|
|
void initTitle(); //
|
|
|
QString getTagOfTitle();
|
|
|
|
|
|
void initUI();
|
|
|
|
|
|
// 初始化各个子布局
|
|
|
void initUI_SubAreas();
|
|
|
QWidget* initUI_Tags();
|
|
|
QWidget* initUI_Grids();
|
|
|
QWidget* initUI_Charts();
|
|
|
void intUiBtns();
|
|
|
void initWells();
|
|
|
void initDataTag();
|
|
|
|
|
|
// 0,1,2分别对应压力、温度、流量
|
|
|
QString getDefaultTag(int n = 0);
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
// 加载解析
|
|
|
bool loadFromFile(QString sFile, QString& sLog);
|
|
|
//bool loadFromClipboard(QString& sLog);
|
|
|
|
|
|
// 配置目标标题
|
|
|
void initTargetTitles();
|
|
|
|
|
|
// 调用默认,配置表头
|
|
|
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();
|
|
|
|
|
|
// s是文件中解析出来的,查找其模糊匹配的目标title的中索引
|
|
|
int findMuzzIndex(QString s, QStringList &listKeys);
|
|
|
|
|
|
// 位置索引
|
|
|
int indexOfStrList(QString s, const QStringList& list);
|
|
|
|
|
|
// 获取表格第一行的第n列的数据
|
|
|
QStringList getFirstRowCellOf(QVector<int> listIndexes);
|
|
|
|
|
|
bool checkStartDt();
|
|
|
bool checkDataTag();
|
|
|
|
|
|
// 检测时间格式,并根据当前数据进行细微调整
|
|
|
bool fuzzyFormatDT(QString& sFormatDT, \
|
|
|
QString& sFormatD, QString& sFormatT, \
|
|
|
int nIndexT1, int nIndexT2);
|
|
|
VecInt splitDtValue(QString s);
|
|
|
|
|
|
|
|
|
// 获取当前的两列数据
|
|
|
#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);
|
|
|
|
|
|
bool writeDataLog(VVecVariant& vvec, int index,
|
|
|
int& nIndexD, int& nIndexT1, int& nIndexT2);
|
|
|
|
|
|
// s11,s12===TopRow, s21,s22====CurrentRow
|
|
|
QDateTime parseValueDtX(QString s1, QString s2, \
|
|
|
QString sFormatDT, \
|
|
|
QString sFormatD, QString sFormatT);
|
|
|
|
|
|
// 起始终止行数
|
|
|
void filterByFromTos(VVecVariant& vvec);
|
|
|
|
|
|
//压力数据时间矫正
|
|
|
void correctPressTime(ePressError eType,
|
|
|
QVector<TableRowState> vecTableRowState,
|
|
|
VecDouble& vecX,
|
|
|
VecDouble& vecY);
|
|
|
void correctlgNew(QVector<TableRowState> vecTableRowState, VVecVariant& vvec);
|
|
|
void correctlgOld(QVector<TableRowState> vecTableRowState, VVecVariant& vvec);
|
|
|
void correctJump(QVector<TableRowState> vecTableRowState, VVecVariant& vvec);
|
|
|
|
|
|
// 当表格数据改变后刷新
|
|
|
void freshByTableChanged();
|
|
|
|
|
|
// 根据当前表头进行绘图
|
|
|
bool refreshCharts();
|
|
|
|
|
|
// 处理起始时间、单位等等
|
|
|
void dealWithStartTime();
|
|
|
void dealWithUnits(VecDouble& vec, int nColIndex, bool bX);
|
|
|
void convertValueByUnit(QString sOld, QString sNew, VecDouble &vec);
|
|
|
|
|
|
void adjustFlowRates(VecDouble& vecX, VecDouble& vecY);
|
|
|
|
|
|
// 如果当前的已经被选中,则清除原先选中
|
|
|
void dealPrevSameColAuto(int n, QString s);
|
|
|
// 如果当前还有一个没有选择,则自动选择
|
|
|
void dealLastColAuto(int n, QString s);
|
|
|
|
|
|
// 即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);
|
|
|
|
|
|
ZxDataWell* getTargetWell();
|
|
|
|
|
|
void freshFromTos(bool bIgnoreFrom, int nFrom = 1);
|
|
|
|
|
|
// 执行与实现
|
|
|
void runLoad();
|
|
|
void fillExcelSheets();
|
|
|
bool checkData(VecDouble& vecX, VecDouble& vecY);
|
|
|
|
|
|
private slots:
|
|
|
|
|
|
// 各个按钮
|
|
|
void on_btnRun_clicked();
|
|
|
|
|
|
void on_btnFile_clicked();
|
|
|
void on_btnDatabase_clicked();
|
|
|
|
|
|
void on_btnOK_clicked();
|
|
|
void on_btnApply_clicked();
|
|
|
void on_btnCancel_clicked();
|
|
|
|
|
|
private slots:
|
|
|
|
|
|
// 来源模式改变
|
|
|
void slotRadioGroupSrcClicked(int index);
|
|
|
|
|
|
// 选择改变时响应
|
|
|
void slotSelChanged(const int, const QString);
|
|
|
|
|
|
// 点击下拉表头前,刷新下拉项的状态
|
|
|
void slotOnGetColumnItems(int nIndex);
|
|
|
|
|
|
// 日期模式
|
|
|
void on_cbxDtFormat_currentIndexChanged(const QString &arg1);
|
|
|
void on_cbxDateTimeSeparated_clicked();
|
|
|
|
|
|
|
|
|
// 其它消息
|
|
|
void on_tbxFile_textChanged(const QString &arg1);
|
|
|
void on_cbxExcelSheets_currentIndexChanged(const QString &arg1);
|
|
|
void on_cbxTimeUnit_currentIndexChanged(const QString &arg1);
|
|
|
void on_cbxValueUnit_currentIndexChanged(const QString &arg1);
|
|
|
|
|
|
// 拖拽支持
|
|
|
void dragEnterEvent(QDragEnterEvent *event);
|
|
|
void dropEvent(QDropEvent* event);
|
|
|
|
|
|
// 重载函数
|
|
|
void keyPressEvent(QKeyEvent* e);
|
|
|
|
|
|
void on_cbxUseCodec_clicked();
|
|
|
|
|
|
// 表格改变
|
|
|
void slotTableCellChanged(const QModelIndex&, const QModelIndex&);
|
|
|
void slotTableRowChanged(QModelIndexList listOlds, QModelIndexList listNews, QModelIndex index);
|
|
|
|
|
|
// 起始行终止行
|
|
|
void on_sbxRowFrom_valueChanged(int arg1);
|
|
|
void on_sbxRowTo_valueChanged(int arg1);
|
|
|
|
|
|
// 这是增加新的自定义菜单项,可以控制起始行终止行
|
|
|
void slotTableMenuRequested(QMenu* pMenu, int r, int c);
|
|
|
void slotSetAsRowStart();
|
|
|
void slotSetAsRowEnd();
|
|
|
|
|
|
// 这是允许外界对粘贴板内容进行解析,解析为二维表格数据
|
|
|
void slotParseContents(const QString& s, VVecVariant& vvec, \
|
|
|
const int& left, const int& top);
|
|
|
|
|
|
void on_cbxAutoThinning_clicked();
|
|
|
|
|
|
void slotCellDbClicked(QModelIndex index);
|
|
|
|
|
|
void slotColInserted(int nFrom, int nCount);
|
|
|
void slotColRemoved(int nFrom, int nCount);
|
|
|
|
|
|
void on_radioStepForward_clicked();
|
|
|
|
|
|
void on_radioStepPost_clicked();
|
|
|
|
|
|
signals:
|
|
|
|
|
|
// PF数据保存成功后,触发
|
|
|
// 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;
|
|
|
|
|
|
////////////////////////////////////////
|
|
|
// 布局载体
|
|
|
|
|
|
// 表格
|
|
|
ZxTableView* m_pTableView;
|
|
|
tTableHeaderViewUnit* m_pTableHeaderView;
|
|
|
|
|
|
// 图形数据
|
|
|
ZxPlot* m_pPlot;
|
|
|
iGuiPlot* m_pWxPlot;
|
|
|
|
|
|
// 说明
|
|
|
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;
|
|
|
|
|
|
// 数据类的时间格式
|
|
|
DateTimeMode m_oDtm;
|
|
|
|
|
|
// 空标志
|
|
|
QString m_sTagNull;
|
|
|
|
|
|
// 记录一下软件操作的起始时间,只是为了保存进行时间的粗略验证
|
|
|
QDateTime m_dtInitStart;
|
|
|
|
|
|
// 初始传入,存到哪口井,不涉及序列化
|
|
|
ZxDataWell* m_pTargetDataWell;
|
|
|
|
|
|
// 限制井名,即是否不允许下拉选择井,
|
|
|
// 而只限于保存至当前井或者用户一开始指定的井
|
|
|
bool m_bFixWellName;
|
|
|
|
|
|
// 当前拖拽为正确的格式(Obsoleted)
|
|
|
//bool m_bDraging;
|
|
|
|
|
|
// LastError
|
|
|
QString m_sLastError;
|
|
|
|
|
|
|
|
|
};
|