PunchHMI/datafile/embdata.h

191 lines
7.7 KiB
C
Raw Normal View History

2024-02-06 06:58:57 +00:00
#ifndef EMBDATA_H
#define EMBDATA_H
#include <QList>
#include <QByteArray>
#include <QApplication>
#include <QDir>
#include <QImage>
#include <qmath.h>
#include <QDebug>
#include <QFile>
#include <QFileInfo>
#include <QPainter>
#include <QObject>
#include <QRgb>
#include "machine/comm/datadef.h"
#include "machine/comm/crc16.h"
#define TOTAL_NEEDLE_NUM 49//总的针杆数,绣花32个(1-32),冲孔16个(33-48),缝纫1个(49)
#define EMB_NEEDLE_NUM 32//绣花32个针杆
#define PUNCH_NEEDLE_NUM 16//冲孔16个针杆
#define SEW_NEEDLE_NUM 1 //缝纫1个针杆
#define PREVIEW_SIDE (32) // 留边大小
#define TENTHOUSANDNEEDLE 100000
#define SHOWDIRX (-1) // X向显示坐标和数据坐标的差异
#define SHOWDIRY (1) // Y向显示坐标和数据坐标的差异
#define COLOR_GREY 186 //纯灰色的rgb
#define PREVIEW_SIDE (32) // 留边大小
#define PI10000 31416
#define PI20000 62832
class EmbData: public QObject
{
Q_OBJECT
public:
EmbData();
~EmbData();
public:
void clear();
void initColor(int cnum = 0, QRgb * pColor = NULL);//初始化颜色
QByteArray & getDsDat();//得到转换后的ds16数据
inline DataDs16FileHead * getDsDatHead(){return m_pDs16Head;}//得到转换后的ds16数据的文件头
void setDsDatHeadFileID(u32 fileid);//设置数据区文件头的fileid
void appendAbsFile(QString filePath,QByteArray array,int mirror = 0);//附加一个绝对坐标的花样文件
void getAbsDatRangeXY();//得到绝对坐标的maxXY和minXY
int addLockStitchs(int locktimes, int locksteps, int lockstepsize);//加锁针
int addContinuousRunCompensate(int value, int idx = -1);//连续动框补偿
public:
inline QString getFileName(){return m_pDs16Head->fileName;}//得到花版名称
inline int getStitchNums(){return m_pDs16Head->itemNums;}//得到数据的针数
inline u32 getColorNums(){return m_pDs16Head->colorNumber;}//得到数据的色数
inline int getDatWidth(){return m_pDs16Head->maxX - m_pDs16Head->minX;}//得到数据的图形宽度
inline int getDatHeight(){return m_pDs16Head->maxY - m_pDs16Head->minY;}//得到数据的图形高度
inline int getMaxX(){return m_pDs16Head->maxX;}//得到数据最大X+
inline int getMinX(){return m_pDs16Head->minX;}//得到数据最小X-
inline int getMaxY(){return m_pDs16Head->maxY;}//得到数据最大Y+
inline int getMinY(){return m_pDs16Head->minY;}//得到数据最小Y-
inline int getBeginX(){return m_pDs16Head->beginX;}//得到数据起始点
inline int getBeginY(){return m_pDs16Head->beginY;}//得到数据起始点
inline int getAnchorX(){return m_pDs16Head->anchorX;}//得到数据定位点
inline int getAnchorY(){return m_pDs16Head->anchorY;}//得到数据定位点
inline int getPunchNum(){return m_pDs16Head->punchNum;}//得到总的冲孔个数
public:
QByteArray getColorTable();//得到数据的色序表
void setAbsDat(QByteArray & dat);
QByteArray & getAbsDat(void);
void setDs16ColorOfTable(u8* table); //改变色序颜色
int getPosInfoFromNeedleIdx(int stitchIdx, int & posx, int & posy, int & posr, int & colorIdx);
int getPosInfoFromColorIdx(int & stitchIdx, int & posx, int & posy, int & posr, int colorIdx);
int getNeedleIdxFromColorIdx(int & needleIdx, int colorIdx, u8 & stepCtrl);
void setNeedleColorTable(int colorIdx, int colorvalue); //针杆颜色
void setStartPosition(int x, int y);//设置起始点
void setAnchorPosition(int x, int y);//设置定位点
void setSplitStitchLength(int length = 0);
public:
int setDatSizeChange(int dsx, int dsy, int idx = -1);//设置尺寸变化
int setMirror(int mirror, int idx = -1);//设置镜像
int setFLip(int mirror, int idx = -1);//设置垂直翻转
int setNeedleTipCompensation(s16 correct = 0); // 旋转机头针尖补偿
int setRotate(int dr, int idx = -1);//设置旋转
int setToMiddle(int idx = -1);//设置居中
int setDatMove(int dx, int dy, int idx = -1);//设置数据移动
private:
//此函数转换传入的绝对坐标值,是否取镜像及反复时数据之间的间距
void convertAbsDat(QByteArray & dat,int mirror = 0);
int createDs16FromAbs();//生成DS16数据
int reCalcDataChecksum();//重新计算文件CRC
QByteArray intTo2ByteArray(s16 value);//短整型转换为byte
void drawNeedleIdxPen(int x, int y, QPainter &painter);//绘制针数索引的跟踪笔
void eraseNeedleIdxPen(QPainter &painter);//擦除针数索引的跟踪笔
public:
int m_editedflag;//数据被编辑的标志
int m_spaceX;//横向间隙
int m_spaceY;//纵向移动距离
int m_stitchSplitLength;
double m_minX;
double m_maxX;
double m_minY;
double m_maxY;
double m_factor;//绘制数据与实际数据的缩放率
int m_tabelColorNum;//颜色数
QRgb * m_pColor;//颜色rgb
s16 m_needleColorTable[TOTAL_NEEDLE_NUM];//针杆颜色索引
QByteArray m_colortab;//发给下位机的数据(需要转换)
private:
QByteArray m_absData; // 转换后的绝对坐标数据
QList <QByteArray> m_dataAbsList;//文件绝对位置列表
QByteArray m_ds16Data;//发给下位机的ds16数据需要转换
int m_totalJumpNeedle;//总跳针数
DataDs16FileHead * m_pDs16Head;//ds16 文件头 //数据转换用的都是DataDs16FileHead
u8 m_startSerrPos;//起针锯齿位置
int m_showColorBeg;
int m_showColorEnd;
int m_greyColorBeg;
int m_greyColorEnd;
//图形预览、刷新
public:
//显示所有线迹(原色显示)
//显示所有线迹(有效区域内的显示原色,其余显示灰色)
//显示所有线迹(执行过的显示原色,其余显示灰色)
//刷新部分线迹(缝纫中进度显示)
enum DISP_MODE {DISP_ALL_NORMAL = 0, DISP_ALL_AREA, DISP_ALL_EXEC, DISP_EXECING};
enum DRAW_MODE {DRAW_VIEW = 0, DRAW_PREVIEW};//绘制模式(非预览模式、预览模式)
public:
int setViewInfo(int width, int height);//设置视图尺寸(透明背景)
void setViewInfo(QPixmap pix);//设置视图(带背景图片背景)
//重新重置ds16数据(换色点击取消后数据会变为单个图元的原数据,
//若图形经过变换数据会不对换色界面保存了最后的数据和XY范围
//若点击换色并取消后恢复为换色界面最后保存的数据即可)
void reSetEmbData(QByteArray ary);
void reSetEmbDataRange(int maxX,int minX,int maxY,int minY);
void setEmbData(int redraw = 0);//重置数据
//是否重绘 //是否为渐变
void setDispMode(DISP_MODE dispmode = DISP_ALL_NORMAL, int redraw = 0);//设置预览模式
void setDrawMode(DRAW_MODE drawmode = DRAW_VIEW);//设置绘制模式
void setGreyAreaRange(int begin, int end);//设置灰色区域显示
void setDispAreaRange(int begin, int end, int redraw = 0);//设置区域显示参数
void setExecIndex(int index);//设置进度显示数据
void reDraw();//重新绘图
public:
inline QPixmap getPreviewImage(){return m_canvas;}//返回预览图片
private:
int createDispFromDs16Dat(QByteArray & ds16dat);//创建显示用的数据(为了快速显示)
int drawImageByDispFile();//用显示数据画图
private:
int m_penX, m_penY;//执行过程中绘制跟踪笔的坐标索引
QPixmap m_canvas;
QPixmap m_penPix;//跟踪笔绘制的临时区域
int m_viewWidth;
int m_viewHight;
QString m_filePath;//文件路径
private:
QByteArray m_dispDat;//绘制图形的绝对数据(进行缩放的)
int m_stitchIndex;
int m_dispIndex;
DISP_MODE m_dispMode;
DRAW_MODE m_drawMode;
signals:
void siDrawNeedleIdx(int idx);
};
#endif // EMBDATA_H