#pragma once #include "iSubWndBaseFit.h" class ZxDataGaugeBase; class ZxDataObject; class iGuiPlotPF; class ZxObjBase; class ZxObjPoint; class ZxObjCurve; class iWxRateInsert; class iWxOptionSmooth; class iWxOptionThinning; class iWxPointSelPreview; class iWxSwapPF; class ZxObjPointEx; //class iSubWndBaseFit; class iCurveDesc; class iWxRunOptionStd; class iWxRunOption; class M_SUB_WND_EXPORT iSubWndAnal : public iSubWndBaseFit { Q_OBJECT public: explicit iSubWndAnal(QWidget *parent = 0, QString sExt = ""); ~iSubWndAnal(); // 配置窗体 virtual void configWnd(); virtual void loadData(QString sWell = ""); //加载数据 virtual void runUpdate(); //刷新 // 序列化 virtual void onSerialize(ZxSerializer* ser); virtual void onDeserialize(ZxSerializer* ser); virtual void onDeserialized(); // 保存加载 virtual bool loadRss(); virtual bool saveRss(); /// @brief 命令是否Enabled的状态判断,通常来自Ribbon /// @param b (out),true:Enabled false:disabled /// @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); // 对于缓存已经保存的压力流量进行刷新处理 virtual void freshByTempSavedPFs(); // 对于流动段,在此处考虑模拟选中最后一个流动段 // 有判断条件的情况下,TODO 20240819 virtual void simuHitLastSeg(); //模拟点击最后一个流动段 public: // 拖拽实现,目前暂未起作用 void resetOneCurveByDrag(ZxDataGaugeBase* p); // 获取两条线的数据点,从图形上取,然后传递给SubWndFitting // 20220324 TODO 修改逻辑:保留流量的第一个点,后续需要验证其他地方是否需要相应修改 bool getPlotCurveDataPF(QVector& vecP, \ QVector& vecF, \ QString* pStrCodeF = NULL); void removeDupDataP(QVector& vecP, ZxSegmentInfo* pSegInfo = NULL); //压力数据去重 bool adjustMultiPhaseDataF(QVector& vecF, \ VVecDouble& vvecMp, \ ZxSegmentInfo* pSeg, \ iJobRun* pJobRun); // 触发WndFitting virtual bool runActionOf_ActivateFit(int nID); // 取值 iGuiPlotPF* getPlotPF(); //自适应调整(X轴压力数据不会占满显示范围) void autoZoomView(); signals: // 申请主窗口创建一个新的窗体 void sigCreateNextSubWnd(iSubWndBaseAF*& p); void sigActivateSubWnd(iSubWnd*& p); // 一旦压力或流量保存之后,则触发其他窗口的刷新 void sigDataSavedPF(QString sCode); protected: // 加载获取到默认两条数据 virtual void loadDefaultCurves(QVector& vecCurveData, QString sWell = ""); // 对压力和流量进行标准零点校正 virtual void baseAdjustCurves(QVector* pVec); // 初始化UI virtual QWidget* initUiMainWx(); virtual void initUiDockWxs(); virtual void initPlotPF(); // 执行命令:通常来自图形右侧/左侧的工具栏 virtual bool runActionOf(QString sAction); bool runActionOf_EditPF(QString sAction); // 刷新 virtual void updatePlots(); // 重新调整工具栏 virtual void reAdjustToolbar(QToolBar*); // 由子窗体创建RunOption virtual iWxRunOptionStd* buildWxRunOption(); // 在弹出对话框后判断是否试井设计,并进行相应处理 virtual void adjustByPossibleDn(iSubWndBaseFit* pWndFitting); public slots: // 调整主体布局 virtual void slotAdjustPlotPFUis(QSplitter* p); // 双击弹出属性页 virtual void slotSetPtyVisible(bool b); // 流动段改变 virtual void slotSegmentChanged(ZxSegmentInfo& o, bool bShowOptionWx); // iWxRunOptionStd对话框OK后触发 // iJobRun当前的JobRun // iSubWnd待应用的SubWnd // bool如果为空,则自动新建 // sNewWndName 新的窗体名称 virtual void slotJobOptionFinished(iJobRun* pJobRun, iSubWnd* pSubWndAim, bool bNewIfNull, bool bJobRunAlreadyCurrent, QString sNewWndName); // 数据加载信号相应 virtual void slotPfObjSaved(ZxDataGaugeBase* p); // Rate加点 void slotRateInsertPt(ZxObjBase* p); // 当前窗体所有信息的保存,比如关闭时提问的保存 virtual bool slotSaveAll(); protected: //////////////////////////////////////////////// // 增加拟合点的处理 // 获取另一个Plot ZxPlot* getBrotherPlot(ZxPlot* pPlot); // 查询x方向的点,并存入Map virtual bool findHitPoints(ZxPlot* pPlot, double& x, \ QMap& mapHits, \ bool bP, bool bConsiderBrother); // 从map中的曲线获取屏幕坐标点x的范围 virtual void checkCurveXBounds(double& min, double& max, \ QMap& mapHits); virtual void checkOneCurveXBound(ZxObjCurve* p, double& min, double& max); // 添加到点 virtual QVector addHitPoints(double& min, double& max, \ QMap& mapHits); //////////////////////////////////////////////// protected: // 绘图相关 iGuiPlotPF* m_pWxPlotPF; //轴标题(表头)、单位 // QStringList m_listTags; // QStringList m_listUnits; // 临时 //ZxObjPoint* m_pRateInsertPt; iWxOptionSmooth* m_pWxSmooth; iWxOptionThinning* m_pWxThinning; iWxPointSelPreview* m_pWxPsPreview; iWxRateInsert* m_pWxRateInsert; iWxSwapPF* m_pWxSwapPF; // 临时,不需序列化,为了区分ANal和AnalDn bool m_bTableVisible; };