PunchHMI/datafile/embdata.h
2024-02-06 14:58:57 +08:00

191 lines
7.7 KiB
C++
Raw 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 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