#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 getAllRectBounds(); void dealwithRects(ZxObjRect* p, bool bDelOrAppendRect); //ZxObjRect被删除的恢复撤销处理 // 删除 bool removePtsInRects(QVector vec); // 删除点 bool delPtsWithinRect(QRectF rtPos); public slots: // 刷新点的状态 void slotFreshPtStates(); public: // 设置数据 virtual void setAllPos(QVector vecPoss, QVector* pVecIndexes = nullptr); virtual void setAllValues(QVector vecValues); virtual void resetBounds(); // 取得鼠标移动时的tip信息 virtual QString getTipOf(const QPointF& point); virtual QVector fuzzyAllPos(QVector vec, double dZoom = 1.0, int nMax = 20000, QVector* pVecSelecteds = nullptr, QVector* 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& vecPtPoss, \ QVector& 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 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 m_vecPointStates; // 临时变量,只为点的状态 QVector m_vecBands; };