#ifndef EMBDATA_H #define EMBDATA_H #include #include #include #include #include #include #include #include #include #include #include #include #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 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