PlotterHMI/datafile/hpgl/vectorsqrt.h
2024-02-06 14:19:53 +08:00

136 lines
4.1 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef VECTORSQRT_H
#define VECTORSQRT_H
#include <QObject>
#include <QFile>
#include "config/config.h"
#include "comm/datadef.h"
class VSqrtItem : public QObject
{
Q_OBJECT
public:
explicit VSqrtItem(QObject *parent = NULL);
VSqrtItem(const VSqrtItem & item);
public:
VSqrtItem& operator=(const VSqrtItem & item);
private:
void CopyData(const VSqrtItem & item);
public:
void InitVSItem();
public:
int m_sqrttype; // 图形类型, 1, 直线, 2, 圆弧; 3, 三次贝塞尔
double m_begx;
double m_begy; // 起点
double m_midx;
double m_midy; // 中间点1
double m_midx2;
double m_midy2; // 中间点2
double m_endx;
double m_endy; // 终点
public:
u32 m_code; // 数据类型
public:
int m_ownsteplock; // 专有步长和回针标志, != 0, 使用一下的步长和锁针参数. 否则,使用公共的参数
u32 m_stepSize; // 步长
u32 m_blockNum; // 起始锁针针数
u32 m_blockTimes; // 起始锁针次数
u32 m_blockjumps; // 起始跳过针数
u32 m_elockNum; // 结束锁针针数
u32 m_elockTimes; // 结束锁针次数
u32 m_elockjumps; // 结束跳过针数
};
class VectorSqrt : public QObject
{
Q_OBJECT
public:
DataFileHead m_fileHead; // 数据文件头描述
explicit VectorSqrt(QObject *parent = NULL);
~VectorSqrt();
VectorSqrt(const VectorSqrt & item);
public:
VectorSqrt& operator=(const VectorSqrt & item);
private:
void CopyData(const VectorSqrt & item);
public:
void InitVSqrt(QString name = QString());
public:
QString m_filename; // 名称
int m_anchorSel; // 定位点选择; 0, 和起点重合; 1图形的左下角; 2, 图形的右下角; 3, 图形的右上角; 4, 图形的左上角; 5, 图形的中心
public:
QList<VSqrtItem> m_vSqitItemList; // 图形列表
public:
// 针步和回针参数
u32 m_para_stepSize ; // 步长
u32 m_para_blockNum ; // 起始锁针针数
u32 m_para_blockTimes ; // 起始锁针次数
u32 m_para_blockjumps ; // 起始跳过针数
u32 m_para_elockNum ; // 结束锁针针数
u32 m_para_elockTimes ; // 结束锁针次数
u32 m_para_elockjumps ; // 结束跳过针数
public:
//这个过程应该放在不同的文件实现中而不是放在 VectorSqrt 这里生成数据中应该分离开
int CreateDs16FromSqrt(QByteArray & ds16Ary);
int CreateDs8FromDs16(const QByteArray & ds16Ary, QByteArray & ds8Ary);
int CreateDs4FromSqrt(QByteArray & ds4Ary);
int CreateDs2FromDs4(const QByteArray & ds4Ary, QByteArray & ds2Ary);
public:
void SetAnchor(int nX,int nY);
void SetBegin(int nX,int nY);
private:
int m_anchorX;//定位点X
int m_anchorY;//定位点Y
int m_beginX;//数据起点坐标X
int m_beginY;//数据起点坐标Y
signals:
public slots:
};
int GetDataMinMax(DataItem * pData, int nums, s32 & minx, s32 & miny, s32 & maxx, s32 & maxy);
// 图形算法
// 直线
int CalcLine(double x0, double y0, double x1, double y1, int * pactx, int * pacty, int stepSize, DataItem * pData, u8 type, s16 dr);
// 三点圆弧
int CalcCurve(double threex[], double threey[], int * pactx, int * pacty, int * pActAng, int stepSize, DataItem * pData, u8 type);
void Rotatec(double xin, double yin, double * px, double * py, double angle);
int ArcDir(const double x[], const double y[]);
int IsThreePointOnALine(const double threex[], const double threey[]);
int GetArcCenter(const double x[], const double y[], double * pxc, double * pyc, double * pr);
int GetArcRectAndAngle(const double x[], const double y[], double * minx, double * maxx, double * miny, double * maxy, double * startangle, double * endangle);
int GetArcMinMax(const double x[], const double y[], double * pminx, double * pmaxx, double * pminy, double * pmaxy);
s16 GetAngle(const double bx, const double by, const double ex, const double ey, int * pActAng);
// 三次贝塞尔
int GetBezierMinMax(const double x[], const double y[], double * pminx, double * pmaxx, double * pminy, double * pmaxy);
#endif // VECTORSQRT_H