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/Objects/ZxObjCurveFlow.h

173 lines
5.5 KiB
C

#pragma once
#include <QCursor>
#include "ZxObjCurve.h"
class ZxObjCurveFlowTool;
class I_PLOTCURVE_T_EXPORT ZxObjCurveFlow : public ZxObjCurve
{
Q_OBJECT
ZX_DECLARE_DYNAMIC
public:
ZxObjCurveFlow();
ZxObjCurveFlow(const QString& sName,
ZxSubAxisX* pAxisX,
ZxSubAxisY* pAxisY);
~ZxObjCurveFlow(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);
// 新增接口20210918 为了流量和压力对齐,只支持右移动
// dOffsetX > 0,且是Value而不是Pos
// 20210919 更改支持:左右移动,压力
virtual bool runMoveByV(const double dOffsetX);
// 考虑同步压力计问题
virtual bool dealwithPosP(const QPointF& pt1,
const QPointF& pt2,
double& fX);
// 是否击中流动段矩形
virtual bool hitTestOthers(const QPointF& pt, bool& bZeroSeg);
// 封装
virtual void initTools();
virtual void resetBounds();
virtual QRectF getBounds4Update();
// 根据鼠标位置xPos获取在线上的位置点
virtual bool getPointByX(double& xPos, QPointF& ptPos);
// 选择from to
virtual bool selectRowRanges(int nFrom, int nTo);
/// @brief 流量数据体的转换
// duraToAccu:true 从持续到累积 false 从累积到持续
static bool convertFlowData(VecDouble& vecX, VecDouble& vecY, bool duraToAccu);
static bool convertFlowData(VecPointF& vecPts, bool duraToAccu);
/// @brief 在某点对流量段进行批分
/// @param ptValue是数值点Value非坐标点Pos
/// @nIndex 是针对的第几段,如果不传入,则通过 getSegIndexOf 自动计算
/// x值<最左为0然后 1,2,3..nx值>最右侧n+1
/// @param bUpdateView一旦批分成功是否刷新视图
bool splitSegAt(QPointF ptValue, int nIndex = -1, bool bUpdateView = false);
int getSegIndexOf(QPointF ptValue);
protected:
// 设置图元对象的属性标志
virtual void initFlags();
public:
virtual bool canMovePoint();
virtual bool canMoveBound();
virtual bool canMoveWhole();
private:
bool _isNearLineEx(QPointF pt, QPointF pt2, QPointF pt3);
public:
virtual void paintBack(QPainter* painter, const ZxPaintParam& param);
virtual void drawLines(QPainter* painter);
virtual void drawPoint(QPainter* painter, QPointF arrPoints[], int nCount, ZxDot& dot);
void drawFlowSegmentSel(QPainter* painter, QRectF rt);
void drawFlowSegments(QPainter* painter);
virtual void paintWithBrotherMode(QPainter* painter,
QPointF ptOld,
QPointF ptNew);
void _drawLinesOf(QPainter* painter, QVector<QPointF>& vecPts);
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);
// 取得鼠标移动时的tip信息
virtual QString getTipOf(const QPointF& point);
//virtual void onLeftDoubleClick(const QPointF& pt);
// 重载做转换
virtual QVector<QPointF> getAllPos(bool bFuzzyMode = false,
double fZoom = 1.f,
int nMax = 20000,
QVector<QPointF>* pVecSelecteds = NULL,
QVector<int>* pVecIndexes = NULL) const;
virtual QVector<QPointF> fuzzyAllPos(QVector<QPointF> vec,
double fZoom = 1.f,
int nMax = 20000,
QVector<QPointF>* pVecSelecteds = NULL,
QVector<int>* pVecIndexes = NULL) const;
virtual int fuzzyPosTimes(double fZoom, int nPtCount) const;
virtual void setAllPos(QVector<QPointF> vecPoss, QVector<int>* pVecIndexes = NULL);
public:
void setFlowLineVisible(bool b);
bool isFlowLineVisible() const;
void setFlowSegmentVisible(bool b);
bool isFlowSegmentVisible() const;
void setFlowLineClr(QColor clr);
QColor getFlowLineClr() const;
void setFlowSegmentClr(QColor clr);
QColor getFlowSegmentClr() const;
void setCurSegPtIndex(int n);
int getCurSegPtIndex() const;
signals:
// 当前选泽的流动段改变
void sigSegCurIndexChanged();
// 竖线、x方向的左右改变
void sigSegVerChanged(int nIndex, double fOld, double fNew);
public:
// 临时变量,是否选中的竖线
bool m_bVertical;
// 是否画流动线
bool m_bFlowLineVisible;
bool m_bFlowSegmentVisible;
QColor m_clrFlowLine;
QColor m_clrFlowSegment;
// 当前选中的seg的起始点所在index
int m_nCurSegPtIndex;
// 临时变量,绑定的
//ZxObjCurve* m_pBrotherP;
// double m_fFirstSpan;
};