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

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