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.
nmWTAI-Platform/Include/iPlot/iPlotCurveT/Objects/ZxObjCurveBase.h

234 lines
7.7 KiB
C

#pragma once
#include "ZxObjBase.h"
class ZxObjRect;
class I_PLOTCURVE_T_EXPORT ZxObjCurveBase : public ZxObjBase
{
Q_OBJECT
ZX_DECLARE_DYNAMIC
public:
ZxObjCurveBase();
ZxObjCurveBase(const QString& sName,
ZxSubAxisX* pAxisX,
ZxSubAxisY* pAxisY);
~ZxObjCurveBase(void);
virtual void init(const QString& sName,
ZxSubAxisX* pAxisX,
ZxSubAxisY* pAxisY);
// 击中
virtual bool hitTest(const QPointF& pt);
// 具体击中实现的函数,单纯击中,不做选项的改变
// nOption用int是因为Rect类的击中选项不一致
// nOption为负值表示未击中此时返回false
virtual bool _runHitTest(const QPointF& pt, int& nOption, int& nSubIndex);
// 击中后ButtonUp后的处理
// pt1:鼠标Down点pt2鼠标Up点
virtual bool runMove(const QPointF& pt1, const QPointF& pt2);
// 通过设置ZxObjRect配置点的状态
bool changeOrAppendRect(ZxObjRect* p);
void removeRect(ZxObjRect* p);
QVector<ZxObjBase*> getAllRectBounds();
void dealwithRects(ZxObjRect* p, bool bDelOrAppendRect); //ZxObjRect被删除的恢复撤销处理
// 删除
bool removePtsInRects(QVector<ZxObjBase*> vec);
// 删除点
bool delPtsWithinRect(QRectF rtPos);
public slots:
// 刷新点的状态
void slotFreshPtStates();
public:
// 设置数据
virtual void setAllPos(QVector<QPointF> vecPoss, QVector<int>* pVecIndexes = nullptr);
virtual void setAllValues(QVector<QPointF> vecValues);
virtual void resetBounds();
// 取得鼠标移动时的tip信息
virtual QString getTipOf(const QPointF& point);
virtual QVector<QPointF> fuzzyAllPos(QVector<QPointF> vec,
double dZoom = 1.0,
int nMax = 20000,
QVector<QPointF>* pVecSelecteds = nullptr,
QVector<int>* pVecIndexes = nullptr) const;
protected:
// 设置图元对象的属性标志
virtual void initFlags();
public:
virtual bool canMovePoint();
virtual bool canMoveBound();
virtual bool canMoveWhole();
public:
///////////////////////////////////////////////////////////////
// 绘制相关
/// @brief 主入口函数
virtual void paintBack(QPainter* painter, const ZxPaintParam& param);
/// @brief 连线
/// @param painter
/// @param vecPtPoss 屏幕坐标
/// @param vecPtValues 实际数据,实际坐标
virtual void drawCurveLine(QPainter* painter, \
QVector<QPointF>& vecPtPoss, \
QVector<QPointF>& vecPtValues);
/// @brief 画点
/// @param painter
/// @param arrPoints 点数组,屏幕坐标
/// @param nCount 点数
/// @param dot 样式
virtual void drawPoint(QPainter* painter, QPointF arrPoints[], \
int nCount, ZxDot& dot);
/// @brief 移动时的联动绘制
/// @param painter
/// @param param
/// @param ptOld 移动起点
/// @param ptNew 移动当前点
/// @param nCount 点数
/// @param op 对象的HitTest模式
virtual void paintWhenMoving(QPainter* painter, \
const ZxPaintParam& param, \
QPointF& ptOld, \
QPointF& ptNew, \
ObjHitOption op);
///////////////////////////////////////////////////////////////
public:
// 序列化
virtual void onSerialize(ZxSerializer* ser);
virtual void onDeserialize(ZxSerializer* ser);
// 模版
virtual void onLoadTempl(ZxSerializer* ser);
virtual void onSaveTempl(ZxSerializer* ser);
// 属性填充
virtual void fillPtyPano(IxPtyPano* sheet);
public:
// 说明:
// 对于压力/流量曲线显示样式,涉及两种:
// 1. 线本身,是否连线,包括是否显示,显示样式
// 其中是否显示通过m_bLineVisible 来控制
// 显示样式,是通过画笔 m_oPen 来控制
// 比如通过setPen(QPen o)接口传递 QPen(QBrush(QColor(255, 0, 0)), 1.0f, Qt::SolidLine);
// 2. 曲线上具体的点,也包括是否显示,显示样式
// 其中,是否显示,通过 m_bPointVisible 来控制也可以通过setDot(ZxDot o)中类型为 DTS_NONE 来控制
// 显示样式,是通过点属性 m_oDot 来控制
// 比如通过setDot(ZxDot o)接口传递 ZxDot(DTS_Circle, QColor(255, 0, 0), 1.0f, true);
// 曲线是否连线
bool getLineVisible(void) const;
void setLineVisible(bool bVisible = true);
// 曲线点是否显示
bool getPointVisible(void) const;
void setPointVisible(bool bVisible = true);
// 统一设置,为了速度
//void setCurvePty(QPen o1, ZxDot o2);
void setCurvePty(QPen o1, ZxDot o2, bool bLineVisible, bool bPointVisible);
// 画笔,只针对线有效,等同于 m_oPen.setColor(clr);
// 该函数只是为了保持父类接口兼容性
virtual void setColor(QColor clr);
public:
// 点数
int getPtCount();
public:
///////////////////////////////////////////////////////////////
// 点状态相关
// 点状态
void changPointState(int nIndex,
PointState psNew);
void startNewRectSelection();
PointState getPointState(int nIndex);
bool hasPointOfState(PointState ps);
bool reversePointOfState(PointState psOld, PointState psNew);
void setPtStates(const PointState pPtStates[],
int cnt);
PointState* getPtStates();
// 获取本曲线ps状态下的所有的点
QVector<QPointF> getPointValuesOfState(PointState ps);
/// @brief 这是拟合后,对曲线的状态进行复原
/// @param bSelectConsidered:选择状态的点是否参与复原
/// @param bExcludeConsidered:剔除状态的点是否参与复原
/// @param bEraseConsidered:删除状态的点是否参与复原
void restorePtStates(bool bSelectConsidered, \
bool bExcludeConsidered = false, \
bool bEraseConsidered = false);
///////////////////////////////////////////////////////////////
signals:
void sigNameChanged(QString sName);
void sigColorChanged(QColor clr);
// 点模式状态发生改变
void sigPointStateChanged(int nIndex, PointState psOld, PointState psNew);
void sigPointStatesRestored();
// 在开始一个新的框选之前触发
void sigNewRectSelection();
// 可以画一些辅助的信息
void sigGetBrotherObj(ZxObjBase*&);
protected:
// 说明:
// 对于压力/流量曲线显示样式,涉及两种:
// 1. 线本身,是否连线,包括是否显示,显示样式
// 其中是否显示通过m_bLineVisible 来控制
// 显示样式,是通过画笔 m_oPen 来控制
// 比如通过setPen(QPen o)接口传递 QPen(QBrush(QColor(255, 0, 0)), 1.0f, Qt::SolidLine);
// 2. 曲线上具体的点,也包括是否显示,显示样式
// 其中,是否显示,通过 m_bPointVisible 来控制也可以通过setDot(ZxDot o)中类型为 DTS_NONE 来控制
// 显示样式,是通过点属性 m_oDot 来控制
// 比如通过setDot(ZxDot o)接口传递 ZxDot(DTS_Circle, QColor(255, 0, 0), 1.0f, true);
bool m_bLineVisible;
bool m_bPointVisible;//added 20210823
// 点状态
QVector<PointState> m_vecPointStates;
// 临时变量,只为点的状态
QVector<ZxObjRect*> m_vecBands;
};