388 lines
7.5 KiB
C++
388 lines
7.5 KiB
C++
#pragma once
|
|
|
|
#include <QObject>
|
|
#include "ControlItem.h"
|
|
#include <QList>
|
|
|
|
//矩形
|
|
struct MRectangle
|
|
{
|
|
MRectangle()
|
|
{
|
|
}
|
|
|
|
MRectangle(float x, float y, float Width, float Height)
|
|
{
|
|
row = y;
|
|
col = x;
|
|
width = Width;
|
|
height = Height;
|
|
}
|
|
float row;
|
|
float col;
|
|
float width;
|
|
float height;
|
|
};
|
|
|
|
//旋转矩形
|
|
struct MRotatedRect
|
|
{
|
|
MRotatedRect()
|
|
{
|
|
}
|
|
|
|
MRotatedRect(float x, float y, float Phi, float Lenth1, float Lenth2)
|
|
{
|
|
row = y;
|
|
col = x;
|
|
phi = Phi;
|
|
lenth1 = Lenth1;
|
|
lenth2 = Lenth2;
|
|
}
|
|
float row;
|
|
float col;
|
|
float phi;
|
|
float lenth1;
|
|
float lenth2;
|
|
};
|
|
|
|
//圆
|
|
struct MCircle
|
|
{
|
|
MCircle()
|
|
{
|
|
}
|
|
|
|
MCircle(float x, float y, float Radius)
|
|
{
|
|
row = y;
|
|
col = x;
|
|
radius = Radius;
|
|
}
|
|
float row;
|
|
float col;
|
|
float radius;
|
|
};
|
|
|
|
//多边形
|
|
struct MPolygon
|
|
{
|
|
MPolygon()
|
|
{
|
|
}
|
|
|
|
MPolygon(QList<QPointF> Points, QList<QPointF> List_P, QList<QList<QPointF>> List_Ps)
|
|
{
|
|
points = Points;
|
|
list_p = List_P;
|
|
list_ps = List_Ps;
|
|
}
|
|
QList<QPointF> points;
|
|
QList<QPointF> list_p;
|
|
QList<QList<QPointF>> list_ps;
|
|
};
|
|
|
|
//同心圆
|
|
struct CCircle
|
|
{
|
|
CCircle()
|
|
{
|
|
}
|
|
|
|
CCircle(float x, float y, float RadiusMin, float RadiusMax)
|
|
{
|
|
row = y;
|
|
col = x;
|
|
small_radius = RadiusMin;
|
|
big_radius = RadiusMax;
|
|
}
|
|
float row;
|
|
float col;
|
|
float small_radius;
|
|
float big_radius;
|
|
};
|
|
|
|
//卡尺
|
|
struct CaliperP
|
|
{
|
|
CaliperP()
|
|
{
|
|
}
|
|
|
|
CaliperP(float x, float y, float Len1, float Len2, float Angle, qreal X1, qreal Y1, qreal X2, qreal Y2, qreal Height, QPointF PP1, QPointF PP2)
|
|
{
|
|
row = y;
|
|
col = x;
|
|
len1 = Len1;
|
|
len2 = Len2;
|
|
angle = Angle;
|
|
x1 = X1;
|
|
y1 = Y1;
|
|
x2 = X2;
|
|
y2 = Y2;
|
|
height = Height;
|
|
pp1 = PP1;
|
|
pp2 = PP2;
|
|
}
|
|
float row;
|
|
float col;
|
|
float len1;
|
|
float len2;
|
|
float angle;
|
|
qreal x1;
|
|
qreal y1;
|
|
qreal x2;
|
|
qreal y2;
|
|
qreal height;
|
|
QPointF pp1;
|
|
QPointF pp2;
|
|
};
|
|
|
|
//******基类******
|
|
class BaseItem : public QObject, public QGraphicsItemGroup
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
enum ItemType
|
|
{
|
|
AutoItem = 0, // 自定义类型
|
|
Circle, // 圆
|
|
Ellipse, // 椭圆
|
|
Concentric_Circle, // 同心圆
|
|
Rectangle, // 矩形
|
|
RectangleR, // 旋转矩形
|
|
Square, // 正方形
|
|
Polygon, // 多边形
|
|
LineObj // 直线
|
|
};
|
|
|
|
void SetIndex(int num);
|
|
virtual bool UpDate(int index) = NULL;
|
|
static void SetScale(double value);
|
|
QList<ControlItem* > ControlList;
|
|
qreal* scale;
|
|
qreal scaler;
|
|
static qreal ContrSize;
|
|
void paint(QPainter* painter,
|
|
const QStyleOptionGraphicsItem* option,
|
|
QWidget* widget) override;
|
|
|
|
protected:
|
|
BaseItem(QPointF center, ItemType type);
|
|
virtual void focusInEvent(QFocusEvent* event) override;
|
|
virtual void focusOutEvent(QFocusEvent* event) override;
|
|
|
|
protected:
|
|
QPointF center;
|
|
ItemType types;
|
|
QPen isSelected;
|
|
QPen noSelected;
|
|
QColor fillColor;
|
|
QPen thisPen;
|
|
qreal LineWidth = 2; //控制点初始尺寸
|
|
QString ItemDiscrib = QString::fromLocal8Bit("");
|
|
};
|
|
|
|
//******绘制结果数据******
|
|
class DrawItem : public BaseItem
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
DrawItem();
|
|
void AddLine(QVector<QPointF>& Plist) { LineList.push_back(Plist); };
|
|
void AddRegion(QVector<QPointF>& Plist) { ROIList.push_back(Plist); };
|
|
void ClearAll() { LineList.clear(); ROIList.clear(); };
|
|
void Refresh();
|
|
void SetDispROI(QRectF& Rec) { returnRec = Rec; };
|
|
|
|
protected:
|
|
int type() const override { return 100; };
|
|
bool UpDate(int index) { return true; };
|
|
virtual QRectF boundingRect() const override;
|
|
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget);
|
|
|
|
private:
|
|
QPen DrawPen;
|
|
QRectF returnRec;
|
|
QVector<QVector<QPointF>> LineList;
|
|
QVector<QVector<QPointF>> ROIList;
|
|
};
|
|
|
|
//******矩形******
|
|
class RectangleItem : public BaseItem
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
RectangleItem(qreal x, qreal y, qreal width, qreal height);
|
|
void SetRect(MRectangle MRect);
|
|
void GetRect(MRectangle& MRect);
|
|
bool rect_init_state = false;
|
|
|
|
protected:
|
|
virtual QRectF boundingRect() const override;
|
|
bool UpDate(int index) override;
|
|
virtual void paint(QPainter* painter,
|
|
const QStyleOptionGraphicsItem* option,
|
|
QWidget* widget) override;
|
|
};
|
|
|
|
//******旋转矩形******
|
|
class RectangleRItem : public BaseItem
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
RectangleRItem(qreal x, qreal y, qreal Lenth1, qreal Lenth2, qreal Pi);
|
|
void GetRotatedRect(MRotatedRect& MRRect);
|
|
bool rrect_init_state = false;
|
|
|
|
protected:
|
|
virtual QRectF boundingRect() const override;
|
|
bool UpDate(int index) override;
|
|
virtual void paint(QPainter* painter,
|
|
const QStyleOptionGraphicsItem* option,
|
|
QWidget* widget) override;
|
|
|
|
protected:
|
|
qreal angle = 0;
|
|
qreal lenth1 = 0;
|
|
qreal lenth2 = 0;
|
|
QPointF Pa1;
|
|
QPointF Pa2;
|
|
QPointF Pa3;
|
|
QPointF Pa4;
|
|
QPointF PArrow;
|
|
};
|
|
|
|
//******多边形******
|
|
class PolygonItem :public BaseItem
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
PolygonItem();
|
|
QPointF getCentroid(QList<QPointF> list);
|
|
void getMaxLength();
|
|
void GetPolygon(MPolygon& mpolygon);
|
|
bool polygon_init_state = false;
|
|
|
|
public slots:
|
|
void pushPoint(QPointF p, QList<QPointF> list, bool isCenter);
|
|
|
|
protected:
|
|
virtual QRectF boundingRect() const override;
|
|
bool UpDate(int index) override;
|
|
virtual void paint(QPainter* painter,
|
|
const QStyleOptionGraphicsItem* option,
|
|
QWidget* widget) override;
|
|
|
|
protected:
|
|
qreal Radius;
|
|
bool Finished;
|
|
QList<QPointF> init_points;
|
|
QList<QList<QPointF>> list_ps;
|
|
};
|
|
|
|
//******椭圆******
|
|
class EllipseItem : public RectangleRItem
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
EllipseItem(qreal x, qreal y, qreal Lenth1, qreal Lenth2, qreal Pi);
|
|
|
|
protected:
|
|
virtual void paint(QPainter* painter,
|
|
const QStyleOptionGraphicsItem* option,
|
|
QWidget* widget) override;
|
|
};
|
|
|
|
//******圆******
|
|
class CircleItem :public BaseItem
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
CircleItem(qreal x, qreal y, qreal R);
|
|
void GetCircle(MCircle& Cir);
|
|
bool circle_init_state = false;
|
|
|
|
protected:
|
|
virtual QRectF boundingRect() const override;
|
|
bool UpDate(int index) override;
|
|
virtual void paint(QPainter* painter,
|
|
const QStyleOptionGraphicsItem* option,
|
|
QWidget* widget) override;
|
|
qreal Radius;
|
|
};
|
|
|
|
//******同心圆******
|
|
class ConcentricCircleItem :public BaseItem
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
ConcentricCircleItem(qreal x, qreal y, qreal RadiusMin, qreal RadiusMax);
|
|
void GetConcentricCircle(CCircle& CCir);
|
|
bool concentric_circle_init_state = false;
|
|
int segment_line_num = 0;
|
|
std::vector<QPointF> ring_small_points = std::vector<QPointF>(1000);
|
|
std::vector<QPointF> ring_big_points = std::vector<QPointF>(1000);
|
|
|
|
protected:
|
|
virtual QRectF boundingRect() const override;
|
|
bool UpDate(int index) override;
|
|
virtual void paint(QPainter* painter,
|
|
const QStyleOptionGraphicsItem* option,
|
|
QWidget* widget) override;
|
|
qreal RadiusMin;
|
|
qreal RadiusMax;
|
|
};
|
|
|
|
//******直线******
|
|
class LineItem :public BaseItem
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
LineItem(qreal x1, qreal y1, qreal x2, qreal y2);
|
|
|
|
protected:
|
|
bool UpDate(int index) override;
|
|
virtual void paint(QPainter* painter,
|
|
const QStyleOptionGraphicsItem* option,
|
|
QWidget* widget) override;
|
|
QPointF P1;
|
|
QPointF P2;
|
|
};
|
|
|
|
//******卡尺******
|
|
class Caliper :public BaseItem
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
Caliper(qreal x1, qreal y1, qreal x2, qreal y2, qreal height);
|
|
void SetCaliper(QPointF p1, QPointF p2);
|
|
void GetCaliper(CaliperP& CP);
|
|
bool caliper_init_state = false;
|
|
int segment_line_num = 0;
|
|
std::vector<QPointF> line_small_points = std::vector<QPointF>(1000);
|
|
std::vector<QPointF> line_big_points = std::vector<QPointF>(1000);
|
|
|
|
protected:
|
|
virtual QRectF boundingRect() const override;
|
|
bool UpDate(int index) override;
|
|
virtual void paint(QPainter* painter,
|
|
const QStyleOptionGraphicsItem* option,
|
|
QWidget* widget) override;
|
|
QPointF P1;
|
|
QPointF P2;
|
|
qreal Height;
|
|
qreal angle;
|
|
qreal Lenth;
|
|
};
|