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/iPlot/iPlotCurveT/ZxPlotBase.h

360 lines
10 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 <QColor>
#include "Defines.h"
#include "ZxRenderItem.h"
#include "ZxDrawHelper.h"
#include "iPlotCurveT_global.h"
class ZxSubAxisX;
class ZxSubAxisY;
class ZxSubAxisBase;
class ZxSubTitle;
class ZxSubNaviBar;
class ZxObjCurveBase;
class ZxSubLegend;
class IxPtyItem;
class ZxCmdTool;
class ZxObjBase;
class ZxSimpleTool;
// 绘图载体
class I_PLOTCURVE_T_EXPORT ZxPlotBase : public ZxRenderItem
{
Q_OBJECT
ZX_DECLARE_DYNAMIC
public:
ZxPlotBase();
ZxPlotBase(ZxRenderView* pView);
~ZxPlotBase();
// 初始化及Tool管理
virtual void init(ZxRenderView* pView);
virtual void initTools();
void removeTools(ZxSimpleTool *pSubTool = NULL);
void appendTools(ZxSimpleTool *pSubTool = NULL);
void resetTools(ZxRenderView* pView);
public:
// 响应从ZxCmdTool过来的鼠标处理
virtual bool runCmdSelect(PlotOperationMode o, \
const QPointF& ptStart, \
const QPointF& ptEnd);
virtual bool runCmdHitPoint(PlotOperationMode o, \
const QPointF& pt);
// 整体移动20190222
virtual bool runWholeMove(const QPointF& ptStart,
const QPointF& ptEnd);
protected:
virtual void release();
public:
static const int AXISHEIGHT = 12;
static const int AXISWIDTH = 12;
static const int TITLEHEIGHT = 13;
static const int NAVIBARHEIGHT = 5;
public:
virtual void paintBack(QPainter* painter,
const ZxPaintParam& param);
virtual void paintBackground(QPainter* painter);
virtual void paintGrid(QPainter* painter);
// 属性填充
virtual void fillPtyPano(IxPtyPano* sheet);
// 序列化
virtual void onSerialize(ZxSerializer* ser);
virtual void onDeserialize(ZxSerializer* ser);
virtual void onDeserialized();
// 序列化之后重新进行一下成员变量的遍历(遍历以及绑定)
virtual void reparseMembers();
virtual void rebindObjs();
virtual void rebindObjOf(ZxObjBase*& p);
virtual void rebindLegend();
// 模版序列化
virtual void onLoadTempl(ZxSerializer* ser);
virtual void onSaveTempl(ZxSerializer* ser);
// 布局
// 刷新激活(重新布局的开关)
void setNeedLayout(bool b);
bool isNeedLayout();
virtual void onLayout();
// 是否发生更改的状态标识
virtual void setModified(bool b);
virtual bool isModified();
public:
// 鼠标
virtual bool onLeftDown(const QPointF& pt);
virtual bool onLeftUp(const QPointF& pt);
virtual bool onMouseMove(const QPointF& pt);
virtual void onLeftDoubleClick(const QPointF& pt);
// Tips
virtual void onShowTips(const QPointF &point);
// 删除这是响应键盘Delete键
virtual void onDeleteItem();
virtual void deleteCurvePtsWithin(QRectF rt);
public:
// 操作类型
int getOpType(void) const;
void setOpType(int nOpType);
// 图元对象相关
int getObjCount(void);
ZxObjBase* getObjByIndex(int nIndex);
ZxObjBase* getObjByName(QString sName);
virtual void removeObjByIndex(int nIndex);
virtual void removeObjByName(QString sName);
virtual void removeAllObjects(bool bTestMode = false);
// 内部绘图区域,不包括标题区,坐标轴
virtual QRectF getInnerRectF();
// 恢复撤销
virtual void runCmdUndo();
virtual void runCmdRedo();
virtual bool canRedo();
virtual bool canUndo();
virtual void clearUndoStack();
// 动态创建添加坐标轴该函数暂未启用在应用时应该已经设定了pAxis的位置
virtual void appendAxis(ZxSubAxisBase* pAxis);
// 对坐标轴进行配置及绑定(主要是一些信号关联)
virtual void configAxis(ZxSubAxisBase* pAxis);
// 关联各个子项
virtual void bindSubMembers(ZxRenderView* pView);
public:
// 坐标轴、标题、图例
ZxSubTitle* getTitle();
virtual void setTitle(ZxSubTitle* pTitle);
ZxSubLegend* getLegend();
// 获取当前起作用的主坐标轴,比如画网格线时需要的
virtual ZxSubAxisX* getMainAxisX();
virtual ZxSubAxisY* getMainAxisY();
void setMainAxisX(ZxSubAxisX* pAxis);
void setMainAxisY(ZxSubAxisY* pAxis);
// 坐标轴
ZxSubAxisX* getSysAxisX(AxisPos o);
ZxSubAxisY* getSysAxisY(AxisPos o);
ZxSubAxisBase* getSysAxisOf(AxisPos o);
// 坐标轴显示隐藏
void setAxisVisibleByObjName(QString sAxisObjectName, bool bVisible);
void setAxisVisibleByPos(AxisPos o, bool bVisible);
void setAxisVisibleByPtr(ZxSubAxisBase* pAxis, bool bVisible);
// 坐标轴最小化
void setMinimizeAxisX(bool b);
void setMinimizeAxisY(bool b);
// 导航,暂时没用到
ZxSubNaviBar* getNaviBar();
void setNaviBar(ZxSubNaviBar* p);
///////////////////////////////////////////////////////
// 通用成员变量的处理
// 背景渐变色
QColor getBKColor(void);
virtual void setBKColor(QColor color);
QColor getBKColorEx(void);
virtual void setBKColorEx(QColor color);
// 外边框颜色
QColor getFrameColor(void);
virtual void setFrameColor(QColor color);
// Margin
float getMargin();
virtual void setMargin(float fMargin);
// 是否显示图标题
virtual void setTitleVisible(bool bVisible);
bool isTitleVisible();
// 是否显示导航(暂未启用)
virtual void setNaviBarVisible(bool bVisible);
bool isNaviBarVisible();
// 是否显示图例
virtual void setLegendVisible(bool bVisible);
bool isLegendVisible();
virtual void setLegendGroups(QStringList list);
// 是否显示tip
bool isBkTipVisible(void) const;
virtual void setBkTipVisible(bool bVisible);
// 是否显示边框
bool isFrameVisible(void) const;
virtual void setFrameVisible(bool bVisible);
// 标题位置0顶部和1底部
int getTitlePos(void) const;
virtual void setTitlePos(int nShowPos);
// 是否显示网格线
bool isScaleBigXVisible();
virtual void setScaleBigXVisible(bool b);
bool isScaleBigYVisible();
virtual void setScaleBigYVisible(bool b);
bool isScaleSmallXVisible();
virtual void setScaleSmallXVisible(bool b);
bool isScaleSmallYVisible();
virtual void setScaleSmallYVisible(bool b);
bool _isScaleXYVisible(bool bX, bool bBigScale);
void _setScaleXYVisible(bool bX, bool bBigScale, bool b);
///////////////////////////////////////////////////////
// x/y轴每一个的Span这是统一设定每个坐标轴还可以单独设定
// 请在plot的init时候调用该函数
float getPerAxisSpanX();
void setPerAxisSpanX(float f);
float getPerAxisSpanY();
void setPerAxisSpanY(float f);
// 设置四个方向各自总的Span然后每个坐标轴按比例拆分
void setSumAxisSpan(AxisPos o, float f);
float getSumAxisSpan(AxisPos o);
// 主要为了触发对象创建完成
virtual void objCompleted(ZxObjBase* p);
public slots:
virtual void slotAxisScaleCountChanged(int);
// 获取(发送者)坐标轴上对应数据中的最小的正值
virtual void slotGetLeastPositive(float& f);
// 响应信号 鼠标交互式选择点后允许Plot自行创建Object
virtual void slotTakeMousePts(QVector<QPointF>& vecPts, \
int nMode, bool& b);
// 由于刻度显示与Plot相互关联所以此处进行额外处理
virtual void slotScaleVisibleChanged(bool bBigScale, bool bVisible);
public:
// 背景图像
void setBkImgFile(QString s);
// 旋转(倾斜度校正)
// 顺时针旋转的角度,不需弧度转换, fAngle:0-360
bool rotateImg(float fAngle);
QSize getBkImgSize();
QImage* getBkImg();
static bool loadImg(QImage& oImg, QString sFile);
signals:
void sigOpTypeChanged(int nOpType);//鼠标操作模式发生改变
void sigObjAdding(ZxObjBase*); //新对象添加前触发
void sigObjAdded(ZxObjBase*); //新对象添加后触发,此时对象没有数据
void sigObjCompleted(ZxObjBase*);//新对象添加后触发,已经可以正常使用
void sigObjDeleting(ZxObjBase*); //对象删除前触发
void sigObjDeleted(ZxObjBase*); //对象删除后触发
// void sigPlotModified(bool); //该信号废弃
/// @brief 工具框选时推送信号,告知主窗体进行相关处理
/// @param rtBoundV这是框选的窗体是实际数值坐标非屏幕坐标
/// @param oPom当前的操作模态
void sigOpRectChanged(const QRectF& rtBoundV, \
PlotOperationMode oPom);
protected:
// 图元
ZxSubTitle* m_pTitle;
ZxSubNaviBar* m_pNaviBar;
ZxSubLegend* m_pLegend;
// 本身有次序和主次,靠前者为主
// 另外,就是先左后右、先下后上
QVector<ZxSubAxisBase*> m_vecAxises;
// x/y轴每一个的Span这是统一设定每个坐标轴还可以单独设定
// 请在plot的init时候进行设置
float m_fPerAxisSpanX;
float m_fPerAxisSpanY;
// 设置四个方向各自总的Span然后每个坐标轴按比例拆分
//0:Left,1:top,2right,3 bottom与AxisPos定义相同
VecFloat m_vecSumSpans;
// 内在图元
QVector<ZxObjBase*> m_vecAllObjs;
// Tool
ZxCmdTool* m_pCmdTool;
// View
ZxRenderView* m_pView;
// 操作类型
int m_nOpType;
// 范围、位置
QRectF m_rcInner;
float m_fMargin;
int m_nTitlePos; //标题位置
// 颜色
QColor m_clrBKColor;
QColor m_clrBKColorEx;
QColor m_clrFrameColor;
// 显示
// 对绘图区的网格线与坐标轴的网格线分开控制
bool m_bScaleBigXVisible;
bool m_bScaleBigYVisible;
bool m_bScaleSmallXVisible;
bool m_bScaleSmallYVisible;
// 显示辅助
bool m_bBkTipVisible;
bool m_bFrameVisible;
// 临时变量
bool m_bModified;
bool m_bNeedLayout;
QString m_sBkImgFile;
QImage m_oBkImg;
};