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.
nmWATI/Include/mGui/mGuiPlot/iGuiPlotPF.h

217 lines
6.6 KiB
C

#pragma once
#include "iGuiPlot.h"
#include "iDlgBase.h"
#include "ZxSegmentInfo.h"
class ZxTableView;
class ZxTableModel;
class ZxObjCurveBase;
class ZxObjCurveFlow;
class ZxObjCurvePressure;
class ZxObjCurve;
class ZxObjBase;
class iGuiPlotPFCmdHelper;
/// @brief 针对PF上下显示的需求特创建本类
/// @note 本类基于 iGuiPlotEx 的部分功能
class M_GUI_PLOT_EXPORT iGuiPlotPF : public iDlgBase
{
Q_OBJECT
public:
explicit iGuiPlotPF(QString sExt, QWidget *parent = 0);
~iGuiPlotPF();
// 初始化UI
virtual void initUI(QString sTitle, \
QSize szDefault = QSize(265, 203));
// 辅助表格设置
void setTableHelperVisible(bool b);
bool isTableHelperVisible();
int getPosMode();
/// @brief 设置位置信息只在显示table时有效
/// @param n 0:表左图右 1表右图左 2:表上图下 3表下图上
void setPosMode(int n);
// 为确保一致性updatePlots中调用updateBrotherTables
virtual void runUpdate();
void reBindTwo();
bool freshDataOfPF(QVector<ZxDataGaugeBase*>& vecObjs);
// 设置图上数据、线的类型(点或者线)
// 这是一次性设置数据需要外界显示调用runUpdate刷新
void setCurveData(QVector<iCurveDesc> vecCurveDesc);
void changeCurveData(QString sKey, iCurveDesc o);
// 分配
void allocateData();
// 获取两条线的数据点(绘图对象)
bool getChartDataXYOfPF(QVector<QPointF>& vec, bool bPressure, \
QString* pStrCodeF = NULL);
// 获取两条线的绘图对象
bool getChartDataObjOfPF(ZxObjCurveBase*& p, bool bPressure);
// 获取两条线的数据对象
bool getDataObjOfPF(ZxDataGaugeBase*& p, bool bPressure);
// 模拟右键双击
bool runClickBySimulation();
// 信号关联
void bindTwoPlots();
// 建议流动段上下对比调整过程时,随时保存入库
// 建议采取折中方案,每次流动段弹窗前保存一下
// 20211216 Added 数据 编辑 也用该函数
void runPossibleSave();
bool isPossibleModified();
private:
// 选定的流动段在当前压力曲线
// 数据的位置索引第几个点从0开始
bool prepareSegInfo(ZxSegmentInfo* p);
bool checkCurrentPF(ZxObjCurvePressure*& pCurveP, \
ZxObjCurveFlow*& pCurveF);
private:
// 初始化
void initUI_MainLayout();
void initUI_P(QString sTitle, QSize sz);
void initUI_F(QString sTitle, QSize sz);
void initUI_SplitterPF();
void initUI_Table();
void initUI_ToolBar();
void initUI_SumUp();
// 基础Signal
void buildBaseSignals(bool bP);
// Table改变时刷新曲线
void refreshCurveBy(ZxTableModel* p, bool bRightColOnly = false);
QVector<QPointF> getVecPtFrom(VVecVariant& vvecData);
ZxObjCurve* checkObjCurveFrom(ZxTableModel* pTableModel, \
QString& sTag);
iGuiPlot* checkPlotWxFrom(ZxTableModel* pTableModel, \
QString& sTag);
protected:
virtual void paintEvent(QPaintEvent *);
virtual void updateBrotherTables();
// 信号关联
void bindPlotWithTable(ZxPlot *pPlot, ZxObjCurveBase* pCurve, ZxTableView* pTableView);
// 获取当前显示的视图中的曲线
bool getAllVisibleCurves(QVector<ZxObjCurveBase*>& vec);
bool getAllVisibleCurvesOf(iGuiPlot* p, QVector<ZxObjCurveBase*>& vec);
bool getCurveDescByName(QString s, iCurveDesc& o);
public slots:
// 表格
void slotTableCellChanged(const QModelIndex& Index, const QModelIndex& nIndex);
void slotTableRowChanged(QModelIndexList listOlds, QModelIndexList listNews, QModelIndex index);
// 表格选中
void slotSubTableSelChanged();
// Curve
void slotCurveSelChanged(bool bSelect);
void slotCurvePtsChanged();
// 压力数据PointState改变
void slotPressPsChanged(int nIndex, PointState psOld, PointState psNew);
void slotNewRectSelection();
// flow
void slotFlowVerPtsChanged(int nIndex, double fOld, double fNew);
void slotFlowSegCurIndexChanged();
// plot
void slotObjDeleted(ZxObjBase* p);
// 水平滚动条的同步
void slotHSrollBarValueChanged(int);
// splitter的响应
void slotSplitterMoved(int pos, int index);
// 双击处理(弹出右键流动段,或者 属性页)
void slotLeftDoubleClicked(const QPointF& pt);
// 重新调整ToolBar此处只是接口传递一下
void slotToolbarBuilt(QToolBar*);
// 为了统一把流动段方面的绘制提取出来了而没有放在CurveFlow的类里
void slotGetBrotherObj(ZxObjBase*&);
void slotUpdateWhenFlowChanged();
// 在iGuiPlotTableHelper保存时通过该信号获取对应的DataObj
void slotGetDataObjOfView(ZxTableView* pView, ZxDataGaugeBase*& p);
// 是否允许拖拽的响应处理
void slotCheckDropCurve(ZxDataGaugeBase* pObj, bool& bEnabled);
// 拖拽曲线的处理
void slotDealwithDropCurve(ZxDataGaugeBase* pObj, bool& b);
signals:
// 一旦压力或流量保存之后,则触发其他窗口的刷新
void sigDataSavedPF(QString sCode);
// 当前选泽的流动段改变
void sigSegmentChanged(ZxSegmentInfo& o, bool bShowOptionWx);
// 当前流动段的参数改变,如移动水平线,此时仅仅刷新相应的结果视图
void sigSegmentParamsChanged(ZxSegmentInfo& o);
// 当GuiPlot的toolbar建立后触发调用方可以做调整
// 如增加一些按钮或控件
void sigToolbarBuilt(QToolBar*);
// 对整体布局允许用户进行调整
void sigAdjustUis(QSplitter* pSplitter);
// 弹出属性页(如果当前未显示)
void sigSetPtyVisible(bool);
// 仅仅触发双击事件
void sigDoubleClicked(ZxPlot* pPlotHit, \
bool bShowOptionWx, bool& bProcessed);
public:
// 布局
QVBoxLayout* m_pMainLayout;
QSplitter* m_pSplitter;
QWidget* m_pWxChartM;
// 图形
iGuiPlot* m_pWxPlotP;
iGuiPlot* m_pWxPlotF;
// 曲线对应的描述信息map
QVector<iCurveDesc> m_vecCurveDesc;
// 辅助表格
iGuiPlotTableHelper* m_pTableHelper;
bool m_bShowTableHelper; //是否显示
int m_nPosMode; //在显示辅助表格时,表图的位置关系
//0:表左图右 1表右图左
//2:表上图下 3表下图上
// 图形统一的工具栏
iGuiPlotPFCmdHelper* m_pCmdHelper;
QWidget* m_pWxToolBar;
// 辅助信息 区分是 压力编辑、流量编辑还是 压力流量流动段选择
QString m_sExt;
};