#pragma once #include "iDlgBase.h" #include "mGuiDataLoad_global.h" #include "iWxPressError.h" namespace Ui { class iWxDataLoad; } class ZxTableView; class ZxTableModel; class ZxTableHeaderView; class ZxPlot; class iGuiPlot; class ZxDataObject; class ZxDataGaugeBase; class M_GUI_DATA_LOAD_EXPORT iWxDataLoad : public iDlgBase { Q_OBJECT public: // 当前数据对应的类型 enum DataLoadType { dtPressure = 0, //压力数据 dtFluid, //流量 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, QWidget *parent = 0); ~iWxDataLoad(); private: // 初始化 void initTitle(); // void initUI(); // 初始化各个子布局 void initUI_SubAreas(); QWidget* initUI_Tags(); QWidget* initUI_Grids(); QWidget* initUI_Charts(); void intUiBtns(); void initWells(); void initUnits(); void initDataTag(); QString getDefaultTag(bool bF); private: // 加载解析 bool loadFromFile(QString sFile, QString& sLog); //bool loadFromClipboard(QString& sLog); // 配置目标标题 void initTargetTitles(); // 调用默认,配置表头 void initDefaultTableTitles(); // 如果既有日期、又有时间列,则自动判断调整日期格式 void checkDateTimeSeparated(); // s是文件中解析出来的,查找其模糊匹配的目标title的中索引 int findMuzzIndex(QString s, QStringList &listKeys); // 位置索引 int indexOfStrList(QString s, const QStringList& list); // 获取表格第一行的第n列的数据 QStringList getFirstRowCellOf(QVector listIndexes); bool checkStartDt(); bool checkDataTag(bool bF); // 检测时间格式,并根据当前数据进行细微调整 bool fuzzyFormatDT(QString& sFormatDT, \ QString& sFormatD, QString& sFormatT, \ int nIndexT1, int nIndexT2); VecInt splitDtValue(QString s); // 获取当前的两列数据 QByteArray sumCurData(VVecVariant& vvec, int nSample, \ int nIndexT1, int nIndexT2, 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 vecTableRowState, VecDouble& vecX, VecDouble& vecY); void correctlgNew(QVector vecTableRowState, VVecVariant& vvec); void correctlgOld(QVector vecTableRowState, VVecVariant& vvec); void correctJump(QVector vecTableRowState, VVecVariant& vvec); // 当表格数据改变后刷新 void freshByTableChanged(); // 根据当前表头进行绘图 bool refreshCharts(); // 处理起始时间、单位等等 void dealWithStartTime(); void dealWithUnits(VecDouble& vecX, VecDouble& vecY); 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); // 获取表头位置索引 bool getTitleIndexes(int& nIndexD, int& nIndexT1, int& nIndexT2); // 获取绘图时的XY轴标题 bool getTitleOfAxisXY(QString& sNameX, QString& sNameY, QString& sUnitX, QString& sUnitY); void freshFromTos(); // 当前表格数据存入数据库 bool saveData(); // 执行与实现 void runLoad(); void fillExcelSheets(); void runByTableColSelection(const int, const QString); 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_cbxFormat_currentIndexChanged(const QString &arg1); // 其它消息 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 slotParseContents(const QString& s, VVecVariant& vvec); 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: Ui::iWxDataLoad *ui; // 布局载体 QTextEdit* m_pTbxDataDesc; ZxTableView* m_pTableView; ZxTableHeaderView* m_pTableHeaderView; // 图形数据 ZxPlot* m_pPlot; iGuiPlot* m_pWxPlot; // 加载数据后解析解出来 QString m_sHeaders; //顶部文件说明信息 QStringList m_listTitles; //顶部单位和标题 QStringList m_listUnits; VVecVariant m_vvecData; //数据原始 // 表格数据 QStringList m_listTableTitles; //表上显示的标题,可以为空 QStringList m_listTargetTitles; QStringList m_listKeyTitles; // 数据类,压力或流量 DataLoadType m_oType; // 数据类的时间格式 DateTimeMode m_oDtm; // 当前拖拽为正确的格式 bool m_bDraging; // 空标志 QString m_sTagNull; // LastError QString m_sLastError; // 限制井名 bool m_bFixWellName; // 空白表格数据 VVecVariant m_vvecDefaults; QDateTime m_dtInitStart; };