You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/mGui/mGuiDataLoad/iWxDataLoad.h

388 lines
12 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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