PlotterHMI/datafile/hpgl/marker.h

422 lines
11 KiB
C
Raw Normal View History

2024-02-06 06:19:53 +00:00
#ifndef MARKER_H
#define MARKER_H
#include <QObject>
#include <QPoint>
#include <QRect>
#include <QBitmap>
#include <QDebug>
#include <qmath.h>
#include <QList>
#include <QVector>
#define CONST_PI 3.14159265359
#pragma pack(1) //设定为1字节对齐
2024-02-06 06:19:53 +00:00
struct LineType
{
//具体参照HPGL英文版手册216页 当LT没有设置值时,线型为实线
bool bDefault;//LT是否设置值
int nLinetype;//线型 取值为-8~8 99 =0 实线 =1 虚线
int nPatternLength;//图案长度 缺省为P1、P2距离的4%
int nMode;//0相对模式 缺省值 解释为P1、P2距离的百分比 1绝对模式以毫米解释图案长度
};
class CBitmapInfo
{
public:
//原始读取的的坐标
QPoint m_ptPostLU; //位图的左上角在整个图中的XY位置
QPoint m_ptPostLD; //位图的左下角在整个图中的XY位置
QPoint m_ptPostRU; //位图的右上角在整个图中的XY位置
QPoint m_ptPostRD; //位图的右下角在整个图中的XY位置
//换算后的坐标
QPoint m_ptAbPostLU; //位图的左上角在整个图中的XY位置
QPoint m_ptAbPostLD; //位图的左下角在整个图中的XY位置
QPoint m_ptAbPostRU; //位图的右上角在整个图中的XY位置
QPoint m_ptAbPostRD; //位图的右下角在整个图中的XY位置
int m_iTransparent;//为1时则为透明显示; 为0则为非透明显示
int m_iBKColor;//背景颜色(在透明显示时背景颜色的点将不被显示)
int m_iWidth;// GDI+中BitmapData的Width,单位:像素
int m_iHeight;//GDI+中BitmapData的Height,单位:像素
int m_iStride;//GDI+中BitmapData的Stride(每行的字节数)
int m_iPixelFormat;//GDI+中BitmapData的PixelFormat
int m_iBytes;//int压缩后位图数据大小(字节数)
QBitmap m_pBitmap;//位图数据(压缩后的位图数据)
CBitmapInfo()
{
m_ptPostLU = QPoint(0,0);
m_ptPostLD = QPoint(0,0);
m_ptPostRU = QPoint(0,0);
m_ptPostRD = QPoint(0,0);
m_ptAbPostLU = QPoint(0,0);
m_ptAbPostLD = QPoint(0,0);
m_ptAbPostRU = QPoint(0,0);
m_ptAbPostRD = QPoint(0,0);
m_iTransparent = 0;
m_iBKColor = 0;
m_iWidth = 0;
m_iHeight = 0;
m_iStride = 0;
m_iPixelFormat = 1;
m_iBytes = 0;
//m_pBitmap = NULL;
}
~CBitmapInfo() {}
CBitmapInfo operator=(const CBitmapInfo &a)
{
m_ptPostLU = a.m_ptPostLU;
m_ptPostLD = a.m_ptPostLD;
m_ptPostRU = a.m_ptPostRU;
m_ptPostRD = a.m_ptPostRD;
m_ptAbPostLU = a.m_ptAbPostLU;
m_ptAbPostLD = a.m_ptAbPostLD;
m_ptAbPostRU = a.m_ptAbPostRU;
m_ptAbPostRD = a.m_ptAbPostRD;
m_iTransparent = a.m_iTransparent;
m_iBKColor = a.m_iBKColor;
m_iWidth = a.m_iWidth;
m_iHeight = a.m_iHeight;
m_iStride = a.m_iStride;
m_iPixelFormat = a.m_iPixelFormat;
m_iBytes = a.m_iBytes;
m_pBitmap = a.m_pBitmap;
return *this;
}
};
class CRPArc
{
public:
QPoint m_ptCenter;
int m_nRadius;
bool m_bCircle;//是圆还是圆弧1圆 0 :圆弧
QPoint m_ptStart;//圆弧起始点
QPoint m_ptEnd;//圆弧结束点
CRPArc()
{
m_bCircle = true;
}
~CRPArc() {}
CRPArc(CRPArc &a)
{
m_ptCenter = a.m_ptCenter;
m_nRadius = a.m_nRadius;
m_bCircle = a.m_bCircle;
m_ptStart = a.m_ptStart;
m_ptEnd = a.m_ptEnd;
}
CRPArc operator=(const CRPArc &a)
{
m_ptCenter = a.m_ptCenter;
m_nRadius = a.m_nRadius;
m_bCircle = a.m_bCircle;
m_ptStart = a.m_ptStart;
m_ptEnd = a.m_ptEnd;
return *this;
}
};
class CRPText
{
public:
QString m_strText;//字符串
QString m_strFontName;//字体名称
QPoint m_ptTextPos;//文字起点坐标
double m_dTextAngle;//文字角度
int m_nHeight;//文字高度
int m_nWidth;//文字宽度
int m_nWeight;//加粗
bool m_bItalic;//斜体
//文字坐标
QPoint m_ptPostLU; //文字的左上角在整个图中的XY位置
QPoint m_ptPostLD; //文字的左下角在整个图中的XY位置
QPoint m_ptPostRU; //文字的右上角在整个图中的XY位置
QPoint m_ptPostRD; //文字的右下角在整个图中的XY位置
CRPText()
{
m_strText = "";
m_strFontName = "";
m_ptTextPos = QPoint(0,0);
m_dTextAngle = 0;
m_nHeight = 0;
m_nWidth = 0;
m_nWeight = 0;
m_bItalic = false;
m_ptPostLU = QPoint(0,0);
m_ptPostLD = QPoint(0,0);
m_ptPostRU = QPoint(0,0);
m_ptPostRD = QPoint(0,0);
}
~CRPText() {}
CRPText(CRPText &a)
{
m_strText = a.m_strText;
m_strFontName = a.m_strFontName;
m_ptTextPos = a.m_ptTextPos;
m_dTextAngle = a.m_dTextAngle;
m_nHeight = a.m_nHeight;
m_nWidth = a.m_nWidth;
m_nWeight = a.m_nWeight;
m_bItalic = a.m_bItalic;
m_ptPostLU = a.m_ptPostLU;
m_ptPostLD = a.m_ptPostLD;
m_ptPostRU = a.m_ptPostRU;
m_ptPostRD = a.m_ptPostRD;
}
CRPText operator=( const CRPText &a)
{
m_strText = a.m_strText;
m_strFontName = a.m_strFontName;
m_ptTextPos = a.m_ptTextPos;
m_dTextAngle = a.m_dTextAngle;
m_nHeight = a.m_nHeight;
m_nWidth = a.m_nWidth;
m_nWeight = a.m_nWeight;
m_bItalic = a.m_bItalic;
m_ptPostLU = a.m_ptPostLU;
m_ptPostLD = a.m_ptPostLD;
m_ptPostRU = a.m_ptPostRU;
m_ptPostRD = a.m_ptPostRD;
return *this;
}
};
class CCode
{
public:
int m_nLX;//左上角X位置
int m_nLY;//左上角Y位置
int m_nSizeX;//X方向大小
int m_nSizeY;//Y方向大小
int m_nAngle;//角度(逆时针方向为正),单位0.01度
int m_nType;//类型(0条形码1二维码)
int m_nCount;//字符串个数(字符串的字节数)
QString m_strCode;//字符串
QBitmap *m_pBitmap;//生成的位图数据
CCode()
{
m_nLX = 0;
m_nLY = 0;
m_nSizeX = 0;
m_nSizeY = 0;
m_nAngle = 0;
m_nType = 0;
m_nCount = 0;
m_strCode = "";
}
~CCode() {}
CCode(CCode &a)
{
m_nLX = a.m_nLX;
m_nLY = a.m_nLY;
m_nSizeX = a.m_nSizeX;
m_nSizeY = a.m_nSizeY;
m_nAngle = a.m_nAngle;
m_nType = a.m_nType;
m_nCount = a.m_nCount;
m_strCode = a.m_strCode;
m_pBitmap = a.m_pBitmap;
}
CCode operator=(const CCode &a)
{
m_nLX = a.m_nLX;
m_nLY = a.m_nLY;
m_nSizeX = a.m_nSizeX;
m_nSizeY = a.m_nSizeY;
m_nAngle = a.m_nAngle;
m_nType = a.m_nType;
m_nCount = a.m_nCount;
m_strCode = a.m_strCode;
m_pBitmap = a.m_pBitmap;
return *this;
}
};
class CNotch
{
public:
QPoint m_ptStart;//剪口起点
QPoint m_ptEnd;//剪口终点
int m_nWidth;//剪口宽度
int m_nNotchType;//剪口类型
QPoint m_ptCorrect;//通过根据刀的X、Y偏移计算得出的实际落刀位置
int m_nAngle;//根据交口起点和终点计算得出的角度(逆时针方向为正),单位0.01度
double angle_2(int startx,int starty,int endx,int endy);
CNotch()
{
m_ptStart = QPoint(0,0);
m_ptEnd = QPoint(0,0);
m_nWidth = 0;;
m_nNotchType = 0;
m_ptCorrect = QPoint(0,0);
m_nAngle = 0;
}
~CNotch() {}
CNotch(CNotch &a)
{
m_ptStart = a.m_ptStart;
m_ptEnd = a.m_ptEnd;
m_nWidth = a.m_nWidth;
m_nNotchType = a.m_nNotchType;
m_ptCorrect = a.m_ptCorrect;
m_nAngle = a.m_nAngle;
}
CNotch operator=(const CNotch &a)
{
m_ptStart = a.m_ptStart;
m_ptEnd = a.m_ptEnd;
m_nWidth = a.m_nWidth;
m_nNotchType = a.m_nNotchType;
m_ptCorrect = a.m_ptCorrect;
m_nAngle = a.m_nAngle;
return *this;
}
void CovertToOutputByOffset(int nOffSetX,int nOffsetY);
int IntOfLineCircle(double a,double b,double c,int xc,int yc,int nR,QPoint &lpptIntersection1,QPoint &lpptIntersection2);
};
class CDrill
{
public:
2024-03-22 07:58:53 +00:00
QPointF m_pt;//冲孔的位置
2024-02-06 06:19:53 +00:00
int m_nDrillType;//冲孔类型
int m_nAngle;//冲孔的角度(逆时针方向为正),单位0.01度
CDrill()
{
m_pt = QPoint(0,0);
m_nDrillType = 0;;
m_nAngle = 0;
}
~CDrill() {}
CDrill(CDrill &a)
{
m_pt = a.m_pt;
m_nDrillType = a.m_nDrillType;
m_nAngle = a.m_nAngle;
}
CDrill operator=(const CDrill &a)
{
m_pt = a.m_pt;
m_nDrillType = a.m_nDrillType;
m_nAngle = a.m_nAngle;
return *this;
}
};
class CRPPolyline
{
public:
int m_nDrawingType;//0:直线 1:位图 2:圆 3:文字 4:条形码、二维码 5:钻孔 6:剪口
int m_nID;//标识切割线切割顺序 从0开始
int m_nPenNo;
bool m_bSelect;//是否处于选中状态true选中状态 false未选中状态
bool m_bPgEnd;//标识该切割线是该页的最后一条线
int m_nComType;//补偿类型 0 无补偿 1向右补偿 2向左补偿
CBitmapInfo m_bitmapInfo;
CRPArc m_circle;
CRPText m_text;
CCode m_code;
CDrill m_drill;
CNotch m_notch;
LineType m_lineType;
2024-03-22 07:58:53 +00:00
QList<QPointF> m_listPoint;
2024-02-06 06:19:53 +00:00
CRPPolyline()
{
m_nDrawingType = 0;
m_nID = 0;
m_nPenNo = 0;
m_bSelect = false;
m_bPgEnd = false;
m_lineType.bDefault = true;
m_listPoint.clear();
m_nComType = 0;
}
~CRPPolyline() {}
CRPPolyline(const CRPPolyline &a)
{
m_nDrawingType = a.m_nDrawingType;
m_nID = a.m_nID;
m_nPenNo = a.m_nPenNo;
m_bSelect = a.m_bSelect;
m_bPgEnd = a.m_bPgEnd;
m_lineType = a.m_lineType;
m_listPoint.clear();
m_listPoint.append(a.m_listPoint);
m_text = a.m_text;
m_nComType = a.m_nComType;
m_circle = a.m_circle;
m_text = a.m_text;
m_code = a.m_code;
m_notch = a.m_notch;
m_drill = a.m_drill;
m_bitmapInfo = a.m_bitmapInfo;
}
CRPPolyline operator=( const CRPPolyline &a)
{
m_nDrawingType = a.m_nDrawingType;
m_nID = a.m_nID;
m_nPenNo = a.m_nPenNo;
m_bSelect = a.m_bSelect;
m_bPgEnd = a.m_bPgEnd;
m_lineType = a.m_lineType;
m_listPoint.clear();
m_listPoint.append(a.m_listPoint);
m_text = a.m_text;
m_nComType = a.m_nComType;
m_circle = a.m_circle;
m_text = a.m_text;
m_code = a.m_code;
m_notch = a.m_notch;
m_drill = a.m_drill;
m_bitmapInfo = a.m_bitmapInfo;
return *this;
}
};
class Marker : public QObject
{
Q_OBJECT
public:
explicit Marker(QObject *parent = 0);
virtual ~Marker();
Marker(const Marker &a);
Marker operator=(const Marker &a);
void Initialize();
2024-03-22 07:58:53 +00:00
QRectF GetRect();
QRectF RectofPolyline(const QList <QPointF> &listPoint);
2024-02-06 06:19:53 +00:00
double m_iDPMM; //长度数据单位:m_iDPMM(每毫米点)
QList <CRPPolyline> m_listPolyline; //切割的点链,单位:1/m_iDPMM mm, X向右为正Y向上为正
int m_nProducts;
int m_nActualMatchRegions;
int m_nMatchRegions;
QString m_strProductCode;//产品型号
signals:
public slots:
};
#endif // MARKER_H