#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 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& mapCols, \ VecDouble& vecX, \ QMap& 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 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& 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& map); bool getDtIndexFrom(const QMap& map, int& nIndexT1, int& nIndexT2); bool getValueIndexFrom(const QMap& map, QMap& mapColVs); // 获取最小的,必须设置的列,以便继续保存 QStringList getMustDataTags(); bool isMustDataTag(QString s); // 获取绘图时的XY轴标题 bool getTitleOfAxisXY(QString& sNameX, QString& sNameY, QString& sUnitX, QString& sUnitY); 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& vecX, QVector& vecY, double dInvalid = SYS_VALUE_INVALID); // 按钮部分,记录每个Card的按钮 struct obInfoExts { QString sWellCode; QString sGaugeTime; QString sCreator; QString sCreatedTime; QString sGaugeName; }; void collectInfoExts(obInfoExts& ext); bool saveObjsAsMerge(const VecDouble& vecX, \ const QMap& mapYs, \ const int& nIndexD, \ const obInfoExts ext); bool saveObjsAsSole(const VecDouble& vecX, \ const QMap& mapYs, \ const int& nIndexD, \ const obInfoExts ext); void saveOneObj(VecDouble& vecX1, VecDouble& vecY1, \ const int nIndex, const obInfoExts exta); void saveOneObj(const QByteArray& ba1, const QByteArray& ba2, \ const int nIndex, const obInfoExts ext); private: Ui::iWxDataLoad *ui; // 数据类,压力或流量 DataLoadType m_oType; //////////////////////////////////////// // 布局载体 // 表格 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 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; };