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++

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 "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;
};