#ifndef MYGRAPHICSSCENE_H #define MYGRAPHICSSCENE_H #include #include #include #include #include #include #include #include #include #include #include #include #include "mygraphicsgriditem.h" #include "machine/comm/datadef.h" #include "datafile/dataoperat.h" #include "main.h" #define DRAWMARGINS 200.0 //item在场景中绘制时的边距(留边) #define TYPE_DRAG -1 //拖拽 #define TYPE_LINE 0 //直线 #define TYPE_ARC 1 //三点圆 struct GLineItem { u16 order;//顺序 WORD type; QGraphicsPolygonItem* item; QList points; }; struct GPathItem { u16 order;//顺序 WORD type; QGraphicsPathItem* item; QList points; }; struct SelectPoint { int type;//选中点类型 0:起点 1:终点 2:中间点 int idx;//图元索引 }; /// /// \brief The MyGraphicsScene class ///场景层 记录实际数据 /// class MyGraphicsScene: public QGraphicsScene { Q_OBJECT public: MyGraphicsScene(); ~MyGraphicsScene(); protected: void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent *event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); // void drawBackground(QPainter *painter, const QRectF &rect); private: QByteArray m_dispDat; MyGraphicsGridItem *m_grid; qreal m_radius = 0.5; QBrush m_selectedBrush; QBrush m_defaultBrush; QList m_ellipseItemList; //顶点圆圈的元素 QList m_lineItemList; //直线元素 QList m_pathItemList; //路径元素 QPointF m_dragOffset; //拖拽点的坐标 QGraphicsEllipseItem *m_draggingPoint; //拖拽点的元素 int m_ArcCount = 0; //圆弧记录坐标个数 个数在0-2之间 int m_shapeType = TYPE_DRAG; bool m_isAdsorption = true; int m_maxSegmentLength = 20; int m_addOrder;//绘制图元时的绘制顺序 private: // 计算两点之间的中点 QPointF midpoint(const QPointF &p1, const QPointF &p2); // 计算两点之间连线的斜率 double slope(const QPointF &p1, const QPointF &p2); // 计算圆心 bool findCircleCenter(const QPointF &p1, const QPointF &p2, const QPointF &p3, QPointF ¢er, double &radius); // 计算半径 double findRadius(const QPointF ¢er, const QPointF &point); // 计算两点之间的距离平方 double distanceSquared(QPointF p1, QPointF p2); public: QList getPointList(); QList getLineItemList(); QList getPathItemList(); void addItemToScene(QByteArray ary); void addItemListToScene(QList list); void addGrid(double gridSpacing,QRectF rect); void cleanScene(); bool getCurSelectState(); bool initAPoint(); void forwardAndBackward(int idx); void insertPoint(int dir); void removeSelectPoint(); void setShapeType(int type); void setAdsorption(bool adsorption); void setLastPointSelected(); void setMaxSegmentLength(int value); int getMaxSegmentLength(); int getArcItem(QList points, QGraphicsPathItem* item, double threex[], double threey[]); int getGLineItem(QGraphicsEllipseItem* p,QPointF p1); int getGPathItem(QGraphicsEllipseItem*p,QPointF p1); void setXYMove(double valX,double valY); void revokeLastItem();//撤销最后一个图元 signals: void siCurrentIndex(int idx); public slots: }; #endif // MYGRAPHICSSCENE_H