#include "datafiledst.h" DataFileDst::DataFileDst() { m_colorNum = 0;//颜色数 m_pColor = NULL;//颜色rgb值 m_beadSequinTable.clear(); m_beadSequinTable.resize(BEADSEQUINTYPE); memset(m_beadSequinTable.data(),0,m_beadSequinTable.size()); m_beadSequinMap.clear(); m_beadSequinMap.resize(BEADSEQUINTYPE); memset(m_beadSequinMap.data(),0,m_beadSequinMap.size()); } DataFileDst::~DataFileDst() { } void DataFileDst::initColor(int cnum, QRgb *pColor) { m_colorNum = cnum;//颜色数 m_pColor = pColor;//颜色rgb值 qDebug()<<"m_colorNum"<itemNums; } int DataFileDst::getColorNums() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDstHead->colorNum; } //测试fileid用,目前这个函数没用到 int DataFileDst::getFileid() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDstHead->fileid; } int DataFileDst::getDatWidth() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data())); return (pDstHead->maxX - pDstHead->minX); } int DataFileDst::getDatHeight() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data())); return (pDstHead->maxY - pDstHead->minY); } int DataFileDst::getMaxX() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDstHead->maxX; } int DataFileDst::getMinX() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDstHead->minX; } int DataFileDst::getMaxY() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDstHead->maxY; } int DataFileDst::getMinY() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDstHead->minY; } int DataFileDst::getJumpNeedleNum() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDstHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDstHead->jumpNeedleNum; } // 设置珠片码对应表 int DataFileDst::setBeadSequinTable(u8 * val) { if(val == NULL) { return -1; } memcpy(m_beadSequinTable.data(),(char*)val,m_beadSequinTable.size()); return 0; } // 得到有效珠片码的位图 int DataFileDst::getBeadSequinMap(QByteArray & map) { if(m_embAbsData.size() <= 0) { return 0; } map.append(m_beadSequinMap); return 0; } // 转换为绝对坐标数据,同时得到最大最小值 void DataFileDst::convertDataToAbs() { QByteArray ds4Data;//相对坐标 m_embAbsData.clear(); loadFile(); // 如果数据未读取,重新读取 int size = m_fileData.size(); if (size <= (int)(sizeof(DstHead))) { qDebug("dst size less then headsize"); return; } // int dstHeadSize = sizeof(DstHead); // qDebug()<<"dstHeadSize"<= 0) { ctrl = ds4Item.ctrl; dxy = ((ds4Item.dx == 0) && (ds4Item.dy == 0))? 0:1; jctrl = ctrl; // 跳针属性临时寄存 if (ctrl == DATA_EMB) {// 运针 if (i == 0) {// 第1针特殊处理 if (dxy == 0) {// 第1针为空针转换为跳针,为了避免第1针锁针添加失败 ctrl = DATA_JUMP; ds4Item.ctrl = DATA_JUMP; } else { { // 第1针为入针则向后扫描,如果第二针也是运针,则将第1针入针转换为跳针 DstStep * ndstDataPtr = dstDataPtr; Ds4Item nds4Item; // 下一针数据 ndstDataPtr++; rslt = changeDstStep(ndstDataPtr, nds4Item); //三字节针步转换 if (rslt != 0) { break; } if (nds4Item.ctrl == DATA_EMB) { ctrl = DATA_JUMP; ds4Item.ctrl = DATA_JUMP; } } { // 第1针为入针则向后扫描,如果有连续的3个以上跳针(或1个以上空跳),则将第1针入针转换为跳针 int count = 0; DstStep * ndstDataPtr = dstDataPtr; Ds4Item nds4Item; // 下一针数据 do { ndstDataPtr++; rslt = changeDstStep(ndstDataPtr, nds4Item); //三字节针步转换 if (rslt != 0) { break; } if (nds4Item.ctrl == DATA_JUMP) { count++; if ((nds4Item.dx == 0) && (nds4Item.dy == 0)) { count += 2; } } else { break; } if (count >= 3) { break; } }while(1); if (count >= 3) { ctrl = DATA_JUMP; ds4Item.ctrl = DATA_JUMP; } } } } else if (((i == 1) && (sqrt(ds4Item.dx*ds4Item.dx+ds4Item.dy*ds4Item.dy) >= 60)) || // 第2针时,如果当前针位移大于6mm,下1针是运针,当前针转换为跳针 (bctrl == DATA_CHGND) || // 上1针为换色码时,如果下1针是运针,则当前针改为跳针 (jumpNum >= 2) || // 前面连续2个以上跳针时,如果当前针和下一针是运针,则当前针改为跳针 0 ) { DstStep * ndstDataPtr = dstDataPtr; Ds4Item nds4Item; // 下一针数据 ndstDataPtr++; rslt = changeDstStep(ndstDataPtr, nds4Item); //三字节针步转换 if (rslt == 0) { if (nds4Item.ctrl == DATA_EMB) { ctrl = DATA_JUMP; ds4Item.ctrl = DATA_JUMP; } } } if (zeroJump != 0) {// 处理珠片码 bds4Item.ctrl = DATA_EMB; bds4Item.attr |= (zeroJump & 0x1f); m_beadSequinMap[(zeroJump & 0x1f)] = 1; // 位图有效 memcpy(&(pData[stepidx]), &bds4Item, sizeof(Ds4Item)); stepidx++; zeroJump = 0; } if ((ctrl == DATA_EMB) || (dxy == 1)) {// 保存针步 memcpy(&(pData[stepidx]), &ds4Item, sizeof(Ds4Item)); stepidx++; } } else if (ctrl == DATA_CHGND) {// 换色 if (zeroJump != 0) { bds4Item.ctrl = DATA_EMB; bds4Item.attr |= (zeroJump & 0x1f); m_beadSequinMap[(zeroJump & 0x1f)] = 1; // 位图有效 memcpy(&(pData[stepidx]), &bds4Item, sizeof(Ds4Item)); stepidx++; zeroJump = 0; } if (bctrl == DATA_CHGND) // 上一针也为换色码 { ctrl = DATA_PAUSE; // 将此换色码改为暂停码 ds4Item.ctrl = ctrl; } {// 保存换色(暂停)针步 memcpy(&(pData[stepidx]), &ds4Item, sizeof(Ds4Item)); stepidx++; } if (ctrl == DATA_CHGND) { colornum++; } if (ctrl == DATA_CHGND) {// 换色后插入毛巾高度码:DATA_TOWELHIGH ds4Item.ctrl = DATA_TOWELHIGH; memcpy(&(pData[stepidx]), &ds4Item, sizeof(Ds4Item)); stepidx++; } } else if (ctrl == DATA_JUMP) {// 跳针 if (openSequin == 0) {// 不在开关状态码过程中 if (dxy != 0) {// 非空跳 jumpNeedleNum++; memcpy(&(pData[stepidx]), &ds4Item, sizeof(Ds4Item)); stepidx++; } } else {// 开关亮片码中 判断珠片码 if (dxy != 0) {// 非空跳 if (zeroJump != 0) {// 保存前一次的珠片码 bds4Item.ctrl = DATA_EMB; bds4Item.attr |= (zeroJump & 0x1f); m_beadSequinMap[(zeroJump & 0x1f)] = 1; // 位图有效 memcpy(&(pData[stepidx]), &bds4Item, sizeof(Ds4Item)); stepidx++; zeroJump = 0; } memcpy(&bds4Item, &ds4Item, sizeof(Ds4Item)); // 保存当前珠片信息 zeroJump = 1; } else { zeroJump++; } } } else if (ctrl == DATA_OPEN_SEQUIN) {// 开关亮片功能码 if (openSequin == 0) { openSequin = 1; // 进入开关亮片状态 zeroJump = 0; } else { if (zeroJump != 0) {// 保存前一次的珠片码 bds4Item.ctrl = DATA_EMB; bds4Item.attr |= (zeroJump & 0x1f); m_beadSequinMap[(zeroJump & 0x1f)] = 1; // 位图有效 memcpy(&(pData[stepidx]), &bds4Item, sizeof(Ds4Item)); stepidx++; zeroJump = 0; } openSequin = 0; // 退出开关亮片状态 } } else if (ctrl == DATA_END) {// 结束码 memcpy(&(pData[stepidx]), &ds4Item, sizeof(Ds4Item)); stepidx++; break; } else // 未定义 { } if ((openSequin == 0) && // 开关亮片状态:关 (jctrl == DATA_JUMP) && // 原始数据是跳针 1) {// 连续跳针的个数 jumpNum++; } else { jumpNum = 0; } bctrl = jctrl; } dstDataPtr++; i++; } else { break; } }while(1); //qDebug()<<"Ds4Item end"; /* for (i=0;i HEAD_NAME_STR_LEN) { namelen = HEAD_NAME_STR_LEN; } QByteArray array = name.toLocal8Bit().data(); int asize = array.length(); memcpy(dhead.fileName, array, asize); // 文件名称 dhead.dataSize = ds4StepSize*sizeof(DsAbsItem); // 数据字节数 dhead.itemNums = ds4StepSize; // 数据项个数 dhead.bytesPerItem = sizeof(DsAbsItem); // 每项占的字节数 dhead.bytesPerBlk = MAX_EXDP_LEN; // 数据内容划分块大小 dhead.dataChecksum = calcCheckSum32((u8 *)(absItemAry.data()) , dhead.dataSize); // 数据累加校验和 dhead.checkCrc = calcCrc16((u8 *)(&dhead), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) dhead.fileid = fileID; //qDebug()<<"dhead 1"; dhead.anchorX = 0; // 定位点坐标X dhead.anchorY = 0; // 定位点坐标Y dhead.beginX = begX; // 数据起点坐标X dhead.beginY = begY; // 数据起点坐标Y, dhead.beginR = begR; // 数据起点坐标R, dhead.minX = m_minX; dhead.maxX = m_maxX; dhead.minY = m_minY; dhead.maxY = m_maxY; // 轮廓范围,使用重新计算之后的值 dhead.jumpNeedleNum = jumpNeedleNum;// 跳针数 dhead.colorNum = colornum; // 颜色数 //dsr头文件中的以何种工作机头定点 dhead.begHead = pDstHead->begWorkHead; dhead.offsetEn = pDstHead->offsetEn; //两个结构体不一样,所以参数在结构体存的位置不影响 dhead.offsetX = pDstHead->offsetX; dhead.offsetY = pDstHead->offsetY; //dst的花版 //dhead.patternType = 1; //qDebug()<<"m_maxX"<switchTable, EMB_BF_SW_ND); //qDebug()<<"dhead 3"; // 保存文件头到数组中 m_embAbsData.append((char *)(&dhead), sizeof(DataDs16FileHead)); //qDebug()<<"dhead 4"; // 保存数据到数组中 //qDebug()<<"ds4StepSize"<begWorkHead=workHead; pDstHead->startX = x; pDstHead->startY = y; } QFile wfile(m_fileFullPathName); if(!wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { qDebug() << "open file fail when read, path =" << m_fileFullPathName; return; } wfile.write(m_fileData); #ifdef Q_OS_LINUX system("sync"); #endif wfile.close(); } //将fcg里的 偏移点XY写在dst头文件里 void DataFileDst::writeOffsetXYMoveToFile(s32 EnFlag,s32 offsetX,s32 offsetY) { if(m_fileData.size() <= 0) { return; } DstHead * pDstHead = (DstHead *)((m_fileData.data())); pDstHead->offsetEn = EnFlag; pDstHead->offsetX = offsetX; pDstHead->offsetY = offsetY; QFile wfile(m_fileFullPathName); if(!wfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { qDebug() << "open file fail when read, path =" << m_fileFullPathName; return; } wfile.write(m_fileData); #ifdef Q_OS_LINUX system("sync"); #endif wfile.close(); } int DataFileDst::checkDstFile() { loadFile(); // 如果数据未读取,重新读取 int size = m_fileData.size(); if (size <= (int)(sizeof(DstHead))) { qDebug("dsr size less then headsize"); return -1; } size -= sizeof(DstHead); int stepsize = size/sizeof(DstStep); if (stepsize <= 0) { qDebug("dst data size err"); return -1; } if (stepsize > PATTERN_LARGE_NEEDLES)//128万针 { qDebug("dsr data size big"); return -2; } return stepsize; } //----------------------------------------------------------------------- //补光增加 QColor DataFileDst::getBrightAdd(QColor embcolor) { QColor backColor; float rgbR = embcolor.red();//R值 float rgbG = embcolor.green();//G值 float rgbB = embcolor.blue();//B值 float Y = 0.257 * rgbR + 0.504 * rgbG + 0.098 * rgbB + 16; float U = (-0.148) * rgbR - 0.291 * rgbG + 0.439 * rgbB +128; float V = 0.439 * rgbR - 0.368 * rgbG + 0.071 * rgbB + 128; Y = Y + 100; int R = 1.164*Y + 1.596 * V - 222.9; int G = 1.164*Y - 0.392 * U - 0.823 * V+ 135.6; int B = 1.164*Y + 2.017 * U- 276.8 ; if(R > 255) { R = 255; } else if (R < 0) { R = 0; } if(G > 255) { G = 255; } else if (G < 0) { G = 0; } if(B > 255) { B = 255; } else if (B < 0) { B = 0; } backColor.setRgb(R , G , B); return backColor; } //补光减少 QColor DataFileDst::getBrightDec(QColor embcolor) { QColor backColor; float rgbR = embcolor.red();//R值 float rgbG = embcolor.green();//G值 float rgbB = embcolor.blue();//B值 float Y = 0.257 * rgbR + 0.504 * rgbG + 0.098 * rgbB + 16; float U = (-0.148) * rgbR - 0.291 * rgbG + 0.439 * rgbB +128; float V = 0.439 * rgbR - 0.368 * rgbG + 0.071 * rgbB + 128; if( Y > 100.0) { Y = Y - 100.0; } else { Y = 16; } int R = 1.164*Y + 1.596 * V - 222.9; int G = 1.164*Y - 0.392 * U - 0.823 * V+ 135.6; int B = 1.164*Y + 2.017 * U- 276.8 ; if(R > 255) { R = 255; } else if (R < 0) { R = 0; } if(G > 255) { G = 255; } else if (G < 0) { G = 0; } if(B > 255) { B = 255; } else if (B < 0) { B = 0; } backColor.setRgb(R , G , B); return backColor; } // 生成预览文件 int DataFileDst::createPreviewImage(QImage * pImg, int saveflag, int penwidth, int gradientFlag, int reDraw) { #if(1) if(reDraw == 0)//图片存在则不重画 { // 图片是否存在,存在则返回 QString previewPath = getFileFullPathName() + ".preview.png"; QFile imageFile(previewPath); if (imageFile.exists()) { return 0; } } #endif int newimgflag = 0; QImage * pImage; int width, height; if (pImg == NULL) { width = DST_PREVIEW_WIDTH; height = DST_PREVIEW_HEIGHT; pImage = new QImage(width, height, IMAGE_TYPE); newimgflag = 1; } else { pImage = pImg; } width = pImage->width(); height = pImage->height(); if (width <= DST_PREVIEW_SIDE*2 || height <= DST_PREVIEW_SIDE*2) { if (pImage != NULL && newimgflag == 1) { delete pImage; } qDebug("preview img too small"); return -1; } memset(pImage->bits(), 0x00, pImage->byteCount()); QPainter painter(pImage); QColor backcolor(255, 255, 255, 0); // 透明背景 QColor backColor1; QColor backColor2; // 背景 QPen pen; pen.setWidth(penwidth); pen.setColor(backcolor); painter.setPen(pen); painter.setBrush(backcolor); painter.drawRect(0, 0, width, height); // 图形 //qDebug()<<"convertDataToAbs defore"; convertDataToAbs(); // 转换为绝对坐标数据 //qDebug()<<"convertDataToAbs end"; #define SEG2_1 0.1 #define SEG2_2 1.0 // absdat数据 int size = m_embAbsData.size(); if (size <= (int)sizeof(DataDs16FileHead)) { qDebug("2 data less then head size"); return -1; } DataDs16FileHead * pAbsHead = (DataDs16FileHead *)(m_embAbsData.data()); int datasize = size - sizeof(DataDs16FileHead); if (datasize <= 0) { qDebug("absdat dataBegin err"); return -1; } int stepsize = datasize/sizeof(DsAbsItem); if (stepsize <= 0) { qDebug("absdat data size err"); return -1; } DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)); DsAbsItem * absDataPtr = pData; //-------- // 图形显示区域 int dpminx = DST_PREVIEW_SIDE; int dpmaxx = width - DST_PREVIEW_SIDE; int dpminy = DST_PREVIEW_SIDE; int dpmaxy = height - DST_PREVIEW_SIDE; // 计算缩放系数 double factor, temp; if ((dpmaxx - dpminx) <= 0 || (dpmaxy - dpminy) <= 0) { return -1; } factor = (double)(fabs(m_maxX - m_minX)) / (dpmaxx - dpminx); // 按x计算的缩放系数 temp = (double)(fabs(m_maxY - m_minY)) / (dpmaxy - dpminy); // 按x计算的缩放系数 if (temp >= factor) // 使用较大的缩放系数 { factor = temp; } // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) int dpx = (int)((dpminx+dpmaxx)/2 - ((m_maxX+m_minX)/factor)/2); int dpy = (int)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2); // 显示花样图形 u8 ctrlByte; int dx; int dy; int colorIdx; int oldcolor; double datposx, datposy; int curx, cury, prex, prey; datposx = pAbsHead->beginX; datposy = pAbsHead->beginY; curx = (datposx) / factor + dpx; cury = (datposy) / factor + dpy; if (DST_SHOWDIRX == -1) { curx = (width)-curx; } if (DST_SHOWDIRY == -1) { cury = (height)-cury; } absDataPtr = pData; colorIdx = 0; oldcolor = -1; s16 jumpFlag = 0;//遇到跳针的标志 for (int i = 0; i < stepsize; i++) { // 读入一个针步数据 ctrlByte = absDataPtr->ctrl; if ( ctrlByte == DATA_EMB || 0 ) { prex = curx; prey = cury; dx = absDataPtr->ax; dy = absDataPtr->ay; datposx = dx; datposy = dy; curx = (datposx) / factor + dpx; cury = (datposy) / factor + dpy; if (DST_SHOWDIRX == -1) { curx = (width)-curx; } if (DST_SHOWDIRY == -1) { cury = (height)-cury; } if (oldcolor != colorIdx) { int cidx = pAbsHead->switchTable[colorIdx % EMB_BF_SW_ND]; int cnum = m_colorNum; cnum /= sizeof(QRgb); if (cnum > EMB_BF_SW_ND) { cnum = EMB_BF_SW_ND; } QColor embcolor; if (cnum != 0) { cidx %= cnum; QRgb * pColor = m_pColor; if(pColor != NULL) { embcolor.setRgb(pColor[cidx]); } else { embcolor = QColor(Qt::green); } } else { embcolor = QColor(Qt::green); } pen.setColor(embcolor); painter.setPen(pen); oldcolor = colorIdx; if(gradientFlag == 1)//渐变色绘制 { backColor2 = getBrightDec(embcolor); backColor1 = getBrightAdd(embcolor); } } if(gradientFlag == 1)//渐变色绘制 { QLinearGradient gradient(prex, prey, curx, cury); //绣花跳针两针为一步,所以要将两针跳针每针分两段渐变,亮色部分拼接到一起 //实现一针渐变的效果(可参考菱形图效果) if(jumpFlag == 1) { jumpFlag = 2; //两段渐变 gradient.setColorAt(SEG2_1,backColor1); gradient.setColorAt(SEG2_2,backColor2); } else if (jumpFlag == 2) { jumpFlag = 0; //两段渐变 gradient.setColorAt(SEG2_1,backColor2); gradient.setColorAt(SEG2_2,backColor1); } else { gradient.setColorAt(0.1,backColor2); gradient.setColorAt(0.5,backColor1); gradient.setColorAt(1.0,backColor2); } painter.setRenderHint(QPainter::Antialiasing,true); QBrush brush(gradient); QPen npen(brush , penwidth); painter.setPen(npen); } if(i != 0) { painter.drawLine(prex, prey, curx, cury); } } //如果连续两步都是跳针,则过滤掉 else if (ctrlByte == DATA_JUMP) { jumpFlag = 1;//跳针标志置为1 DsAbsItem * JumpAbsDataPtr = pData; JumpAbsDataPtr = absDataPtr - 1; u8 beforectrlByte = JumpAbsDataPtr->ctrl; JumpAbsDataPtr = absDataPtr + 2; u8 nextctrlByte = JumpAbsDataPtr->ctrl; prex = curx; prey = cury; dx = absDataPtr->ax; dy = absDataPtr->ay; datposx = dx; datposy = dy; curx = (datposx) / factor + dpx; cury = (datposy) / factor + dpy; if (DST_SHOWDIRX == -1) { curx = (width)-curx; } if (DST_SHOWDIRY == -1) { cury = (height)-cury; } if (oldcolor != colorIdx) { int cidx = pAbsHead->switchTable[colorIdx % EMB_BF_SW_ND]; int cnum = m_colorNum; cnum /= sizeof(QRgb); if (cnum > EMB_BF_SW_ND) { cnum = EMB_BF_SW_ND; } QColor embcolor; if (cnum != 0) { cidx %= cnum; QRgb * pColor = m_pColor; if(pColor != NULL) { embcolor.setRgb(pColor[cidx]); } else { embcolor = QColor(Qt::green); } } else { embcolor = QColor(Qt::green); } pen.setColor(embcolor); painter.setPen(pen); oldcolor = colorIdx; if(gradientFlag == 1)//渐变色绘制 { backColor2 = getBrightDec(embcolor); backColor1 = getBrightAdd(embcolor); } } if(beforectrlByte == DATA_JUMP || nextctrlByte == DATA_JUMP) { //该针上下两针都是跳针则不画线 } else { if(gradientFlag == 1)//渐变色绘制 { QLinearGradient gradient(prex, prey, curx, cury); gradient.setColorAt(0.1,backColor2); gradient.setColorAt(0.5,backColor1); gradient.setColorAt(1.0,backColor2); painter.setRenderHint(QPainter::Antialiasing,true); QBrush brush(gradient); QPen npen(brush , penwidth); painter.setPen(npen); } if(i != 0) { painter.drawLine(prex, prey, curx, cury); } } } //// else if (ctrlByte == DATA_CHGND) // 换色 { colorIdx++; } else { // qDebug("other type=0x%x", ctrlByte); } absDataPtr++; } // 保存成文件 QString preview = getFileFullPathName(); if (saveflag != 0 && preview.isEmpty() == false) { #if (1) preview += ".preview.png"; pImage->save(preview, "png"); #endif } if (pImage != NULL && newimgflag == 1) { delete pImage; } return 0; } #define EMB_DST_DAT_DIRX (-1) // X向DST数据坐标和绝对数据坐标的差异 #define EMB_DST_DAT_DIRY (1) // Y向DST数据坐标和绝对数据坐标的差异 // 针步转换 int DataFileDst::changeDstStep(DstStep * pDststep, Ds4Item & ds4step) { int dx, dy; u8 c1, c2, c3; u8 ctrl, attr; if (pDststep == NULL) { return -1; } c1 = pDststep->c1; c2 = pDststep->c2; c3 = pDststep->c3; dx = 0; dy = 0; if ((c1&0x08) != 0) { dx -= 9; } if ((c1&0x04) != 0) { dx += 9; } if ((c1&0x02) != 0) { dx -= 1; } if ((c1&0x01) != 0) { dx += 1; } if ((c2&0x08) != 0) { dx -= 27; } if ((c2&0x04) != 0) { dx += 27; } if ((c2&0x02) != 0) { dx -= 3; } if ((c2&0x01) != 0) { dx += 3; } if ((c3&0x08) != 0) { dx -= 81; } if ((c3&0x04) != 0) { dx += 81; } if ((c1&0x10) != 0) { dy -= 9; } if ((c1&0x20) != 0) { dy += 9; } if ((c1&0x40) != 0) { dy -= 1; } if ((c1&0x80) != 0) { dy += 1; } if ((c2&0x10) != 0) { dy -= 27; } if ((c2&0x20) != 0) { dy += 27; } if ((c2&0x40) != 0) { dy -= 3; } if ((c2&0x80) != 0) { dy += 3; } if ((c3&0x10) != 0) { dy -= 81; } if ((c3&0x20) != 0) { dy += 81; } #if(0) switch (c3 & 0xF3) { case 0x03: // 运针 ctrl = DATA_EMB; break; case 0x43: // 开关亮片码 qDebug("Sequin switch, not support, c1=0x%x, c2=0x%x, c3=0x%x", c1, c2, c3); // 不合法的DST return -2; break; case 0x83: // 跳针 ctrl = DATA_JUMP; break; case 0xC3: // 换色 ctrl = DATA_CHGND; break; case 0xF3: // 结束 if(dx == 0 && dy == 0) { ctrl = DATA_END; } break; default: if((c3 & 0x80) != 0x00) { if(dx == 0 && dy == 0)//空跳 { ctrl = DATA_JUMP; } else { ctrl = DATA_OFFSET; } } else { ctrl = DATA_EMB; } break; } #else if (c3 == 0xF3 && dx == 0 && dy == 0) { ctrl = DATA_END; // 结束 } else if ((c3&0xC3) == 0x03) // 运针 { ctrl = DATA_EMB; } else if ((c3&0xC3) == 0x83) // 跳针 { ctrl = DATA_JUMP; } else if ((c3&0xC3) == 0xC3) // 换色 { ctrl = DATA_CHGND; } else if ((c3&0xC3) == 0x43) // 开关亮片码 { ctrl = DATA_OPEN_SEQUIN; } else { ctrl = DATA_UNKNOW; qDebug("not know dst step, c1=0x%x, c2=0x%x, c3=0x%x", c1, c2, c3); // 不合法的DST return -3; } #endif // 添加针步 attr = 0; dx *= EMB_DST_DAT_DIRX; // X向显示坐标和数据坐标的差异 dy *= EMB_DST_DAT_DIRY; // Y向显示坐标和数据坐标的差异 if (dx < 0) { attr |= 0x80; } if (dy < 0) { attr |= 0x40; } ds4step.ctrl = ctrl; ds4step.attr = attr; ds4step.dx = abs(dx); ds4step.dy = abs(dy); return 0; } // 检查并设置默认换色表 int DataFileDst::checkDefaultSwitchTable(int colornum) { //loadFile(); // 如果数据未读取,重新读取 int size = m_fileData.size(); if (size <= (int)(sizeof(DstHead))) { qDebug("dst size less then headsize"); return -1; } size -= sizeof(DstHead); int stepsize = size/sizeof(DstStep); if (stepsize <= 0) { qDebug("dst data size err"); return -1; } DstHead * pDstHead = (DstHead *)((m_fileData.data())); int i; if (colornum < 1) { colornum = 1; } if (colornum > EMB_BF_SW_ND) { colornum = EMB_BF_SW_ND; } for (i = 0; i < colornum; i++) { if (pDstHead->switchTable[i] != 0x20) { break; } } if (i < colornum) // 不全部是0x20, 可能设置过色序 { for (i = 0; i < colornum; i++) { if (pDstHead->switchTable[i] != 0x00) { break; } } } if (i >= colornum && colornum > 1) // 全部是0x20 或 全部是0, 未设置过色序 { for (i = 0; i < colornum; i++) { pDstHead->switchTable[i] = i; // 默认色序 } saveFile(); // 保存文件 } return 0; }