203 lines
8.4 KiB
C
203 lines
8.4 KiB
C
|
#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 <QRgb>
|
|||
|
#include <QObject>
|
|||
|
#include "machine/comm/datadef.h"
|
|||
|
#include "machine/comm/crc16.h"
|
|||
|
#include <QVector>
|
|||
|
#include "datafile/datafiledsr.h"
|
|||
|
|
|||
|
#define ZERO 1e-6
|
|||
|
|
|||
|
#define MAX_EMB_STEP 121//四字节针步最大针步限制
|
|||
|
#define DEFAULT_JUMP 70//默认针步大小
|
|||
|
#define SEW_NEEDLE_NUM 2 //缝纫2个针杆
|
|||
|
#define COLORTABLE_NUM 512//色序表
|
|||
|
|
|||
|
#define EMB_PREVIEW_SIDE (32) // 留边大小
|
|||
|
#define TENTHOUSANDNEEDLE 100000
|
|||
|
|
|||
|
#define EMB_SHOWDIRX (1) // X向显示坐标和数据坐标的差异
|
|||
|
#define EMB_SHOWDIRY (1) // Y向显示坐标和数据坐标的差异
|
|||
|
#define OUTLINESTEPFACTOR 100 // 生成轮廓花样针步乘以的系数,单位是0.01,所以乘以100
|
|||
|
|
|||
|
#define PI10000 31416
|
|||
|
#define PI20000 62832
|
|||
|
#define ANGLECORR 10466 //60度对应的弧度值
|
|||
|
|
|||
|
#define MODE_THICKEN 0 //密针方式
|
|||
|
#define MODE_LOCK 1 //锁针方式
|
|||
|
|
|||
|
class EmbData: public QObject
|
|||
|
{
|
|||
|
Q_OBJECT
|
|||
|
|
|||
|
public:
|
|||
|
EmbData();
|
|||
|
~EmbData();
|
|||
|
|
|||
|
public:
|
|||
|
void clear();
|
|||
|
QByteArray & getDsDat();//得到转换后的ds16数据
|
|||
|
inline DataDs16FileHead * getDsDatHead(){return m_pEmbDs16Head;}//得到转换后的ds16数据的文件头
|
|||
|
void setDsDatHeadFileID(u32 fileid);//设置数据区文件头的fileid
|
|||
|
void getAbsDatRangeXY();//得到绝对坐标的maxXY和minXY
|
|||
|
void appendAEmbAbsFile(QString filePath,QByteArray array,int mirror = 0);//附加一个绝对坐标的花样文件
|
|||
|
int addLockStitchs(u8 mode, u8 needles, u8 num);
|
|||
|
int angleCorrection(s16 oft);//角度修正
|
|||
|
int angleCorrectionXY(s32 px, s32 nx, s32 py, s32 ny);//角度修正
|
|||
|
void reFitByStep(s32 stepLen);//按固定针步重新拟合(用户可设置的参数,暂未用到)
|
|||
|
void reFitLine(s32 stepLen);//按固定针步重新拟合直线(用户可设置的参数)
|
|||
|
int moveStartPoint(short left, short front);//移动起始点,左边,前边
|
|||
|
|
|||
|
public:
|
|||
|
inline QString getFileName(){return m_pEmbDs16Head->fileName;}//得到花版名称
|
|||
|
inline int getStitchNums(){return m_pEmbDs16Head->itemNums;}//得到数据的针数
|
|||
|
inline int getDatWidth(){return m_pEmbDs16Head->maxX - m_pEmbDs16Head->minX;}//得到数据的图形宽度
|
|||
|
inline int getDatHeight(){return m_pEmbDs16Head->maxY - m_pEmbDs16Head->minY;}//得到数据的图形高度
|
|||
|
inline int getMaxX(){return m_pEmbDs16Head->maxX;}//得到数据最大X+
|
|||
|
inline int getMinX(){return m_pEmbDs16Head->minX;}//得到数据最小X-
|
|||
|
inline int getMaxY(){return m_pEmbDs16Head->maxY;}//得到数据最大Y+
|
|||
|
inline int getMinY(){return m_pEmbDs16Head->minY;}//得到数据最小Y-
|
|||
|
inline int getBeginX(){return m_pEmbDs16Head->beginX;}
|
|||
|
inline int getBeginY(){return m_pEmbDs16Head->beginY;}
|
|||
|
inline int getAnchorX(){return m_pEmbDs16Head->anchorX;}//得到数据定位点
|
|||
|
inline int getAnchorY(){return m_pEmbDs16Head->anchorY;}//得到数据定位点
|
|||
|
|
|||
|
public:
|
|||
|
void moveDataBeginPonit(s32 left, s32 front);
|
|||
|
void setAbsDat(QByteArray & dat);
|
|||
|
QByteArray & getAbsDat(void);
|
|||
|
int getPosInfoFromNeedleIdx(int stitchIdx, int & posx, int & posy, int & colorIdx);
|
|||
|
void setStartPosition(int x, int y);//设置起始点
|
|||
|
void setAnchorPosition(int x, int y);//设置定位点
|
|||
|
|
|||
|
public:
|
|||
|
double getAngle(double x1, double y1, double x2, double y2);
|
|||
|
int setDatSizeChange(int dsx, int dsy);//设置尺寸变化
|
|||
|
int setMirror(int mirror);//设置镜像
|
|||
|
int setFLip(int mirror);//设置镜像
|
|||
|
int setRotate(int dr);//设置旋转
|
|||
|
int setRotate90(bool flag);//旋转+-90度 flag :true代表顺时针方向
|
|||
|
int getNextElementIndex(int curIndex);//获得下一个图元的第一缝纫针步
|
|||
|
int getPreOrThisElementIndex(int curIndex);//上一个图元(当前为跨步时)或当前图元(当前为缝纫时)的第一缝纫针步
|
|||
|
|
|||
|
private:
|
|||
|
void splitBorderStitchAndAdd(QByteArray & dat,int bx,int by,int ex,int ey);//分割边框针步并添加
|
|||
|
//此函数转换传入的绝对坐标值,是否取镜像及反复时数据之间的间距
|
|||
|
void convertAbsDat(QByteArray & dat,int mirror = 0);
|
|||
|
int calcLine(double x0, double y0, double x1, double y1, s16 step, QByteArray &absAry, DsAbsItem item);
|
|||
|
|
|||
|
int createEmbDs16FromAbs();//生成DS16数据
|
|||
|
int reCalcDataChecksum();//重新计算文件CRC
|
|||
|
void drawNeedleIdxPen(int x, int y, QPainter &painter);//绘制针数索引的跟踪笔
|
|||
|
void drawFork(int x, int y, QPainter &painter);//绘制针数索引的十字
|
|||
|
void drawFork(int x, int y, QPainter &painter,int index, bool isDraw = 1);//绘制针数索引的十字
|
|||
|
void eraseNeedleIdxPen(QPainter &painter);//擦除针数索引的跟踪笔
|
|||
|
void eraseNeedleIdxPen(QPainter &painter,int index);//擦除针数索引的跟踪笔
|
|||
|
|
|||
|
private:
|
|||
|
void getCurvePointFillLine(QList<DsAbsItem> &inList, double indRunLen,QList<DsAbsItem> &outList);
|
|||
|
int getTotalDistanceFillLine(QList<DsAbsItem> *pPointList, double &dTotal);
|
|||
|
bool getPointInSectFillLine(const DsAbsItem &p1, const DsAbsItem &p2, const double &d, DsAbsItem &outp);
|
|||
|
//距p1点距离为d的点
|
|||
|
// d > s : out_p在p2延长线上
|
|||
|
// s >= d >= 0 : out_p在p1、p2线段上
|
|||
|
// d < 0 : out_p在p1延长线上
|
|||
|
bool getPointAtSect(const DsAbsItem &p1, const DsAbsItem &p2, const double &d, DsAbsItem &outp);
|
|||
|
|
|||
|
public:
|
|||
|
int m_editedflag;//数据被编辑的标志
|
|||
|
int m_spaceX;//横向间隙
|
|||
|
int m_spaceY;//纵向移动距离
|
|||
|
|
|||
|
//用于调节颜色
|
|||
|
#if(1)
|
|||
|
QString m_selfilename;
|
|||
|
#endif
|
|||
|
|
|||
|
double m_minX;
|
|||
|
double m_maxX;
|
|||
|
double m_minY;
|
|||
|
double m_maxY;
|
|||
|
|
|||
|
private:
|
|||
|
QByteArray m_embAbsData; // 转换后的绝对坐标数据
|
|||
|
QByteArray m_embDs16Data;//发给下位机的ds16数据(需要转换)
|
|||
|
int m_totalJumpNeedle;//总跳针数
|
|||
|
DataDs16FileHead * m_pEmbDs16Head;//ds16 文件头 //数据转换用的都是DataDs16FileHead
|
|||
|
double m_factor;//绘制数据与实际数据的缩放率
|
|||
|
u32 m_fileid;
|
|||
|
|
|||
|
//图形预览、刷新
|
|||
|
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);//设置视图(带背景图片背景)
|
|||
|
void setEmbData(int type,int redraw = 0);//重置数据
|
|||
|
//是否重绘 //是否为渐变
|
|||
|
void setDispMode(DISP_MODE dispmode = DISP_ALL_NORMAL, int redraw = 0);//设置预览模式
|
|||
|
void setDrawMode(DRAW_MODE drawmode = DRAW_VIEW);//设置绘制模式
|
|||
|
|
|||
|
void setExecIndex(int index);//设置进度显示数据
|
|||
|
void reDraw();//重新绘图
|
|||
|
|
|||
|
public:
|
|||
|
inline QPixmap getPreviewImage(){return m_canvas;}//返回预览图片
|
|||
|
|
|||
|
private:
|
|||
|
int createDispFromEmbDs16Dat(QByteArray & ds16dat);//创建显示用的数据(为了快速显示)
|
|||
|
int createDispFromEmbDs16DatForHeadInfo(QByteArray & ds16dat);
|
|||
|
int drawImageByDispFile();//用显示数据画图(是否渐变显示)
|
|||
|
int drawImageByOneStepLotLine();
|
|||
|
int findMaxSpHead(DsrHeadEx62 & head,int headCount);
|
|||
|
void drawMultiTrack(QPainter &painter); //绘制多机头的跟踪图案
|
|||
|
void drawMultiLine(QPainter &painter, QPen &pen, QRgb rgb, int index); //绘制多机头的线迹
|
|||
|
|
|||
|
private:
|
|||
|
int m_type; //机型
|
|||
|
int m_penX, m_penY;//执行过程中绘制跟踪笔的坐标索引
|
|||
|
|
|||
|
QPixmap m_canvas;//预览图片
|
|||
|
QPixmap m_penPix;//跟踪笔绘制的临时区域
|
|||
|
QVector<QPixmap> m_penHeadPix;
|
|||
|
QVector<QPoint> m_penPoint;
|
|||
|
|
|||
|
int m_viewWidth;
|
|||
|
int m_viewHight;
|
|||
|
|
|||
|
QString m_filePath;//文件路径
|
|||
|
|
|||
|
private:
|
|||
|
QByteArray m_dispDat;//绘制图形的绝对数据(进行缩放的)
|
|||
|
QVector<Disp_HeadItem> m_headDispDate; //五头机绘图针步
|
|||
|
int m_stitchIndex; //进度步数
|
|||
|
int m_dispIndex; //当前index
|
|||
|
DISP_MODE m_dispMode;
|
|||
|
DRAW_MODE m_drawMode;
|
|||
|
|
|||
|
signals:
|
|||
|
void siDrawNeedleIdx(int idx);
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
#endif // EMBDATA_H
|