#include "datafiledsr.h" DataFileDsr::DataFileDsr() { m_colorNum = 0;//颜色数 m_pColor = NULL;//颜色rgb值 } DataFileDsr::~DataFileDsr() { } void DataFileDsr::initColor(int cnum, QRgb *pColor) { m_colorNum = cnum;//颜色数 m_pColor = pColor;//颜色rgb值 } void DataFileDsr::initFile(const QString &fullPathName) { clear(); QFileInfo file(fullPathName); if (file.exists() && file.isFile()) { m_fileFullPathName = fullPathName; m_fileName = fullPathName; } else { qDebug() << "Init file failed path =" << m_fileFullPathName; } } //检查dsr文件版本,非5.2以上版本或5.5版本和错误格式返回-1 int DataFileDsr::checkDsrVersion() { loadFile(); // 如果数据未读取,重新读取 int size = m_fileData.size(); if (size <= (int)(sizeof(DsrHead))) { qDebug("dsr size less then headsize"); return -1; } DsrHead * dsrHead = (DsrHead *)(m_fileData.data()); float ver = *((float*)(&dsrHead->verCode)); if(ver < DSR_VERSION_5 || ver > DSR_VERSION_5_5)// 5.x 以下版本 { return -1; } if (size <= (int)(sizeof(DsrHead))) { qDebug("dsr size less then headsize"); return -1; } if(dsrHead->dataBegin > (u32)size) { qDebug("dsr dataBegin err"); return -1; } size -= dsrHead->dataBegin; if (size <= 0) { qDebug("dsr dataBegin err"); return -1; } int stepsize = size/sizeof(DsrStep); if (stepsize <= 0) { qDebug("dsr data size err"); return -1; } if (stepsize > PATTERN_LARGE_NEEDLES)//128万针 { qDebug("dsr data size big"); return -2; } return stepsize; } // 转换为绝对数据 void DataFileDsr::convertDataToEmbAbs() { m_embAbsData.clear(); getDsrMinMax();//读取dsr源文件 int size = m_fileData.size(); if (size <= (int)(sizeof(DsrHead))) { qDebug("dsr size less then headsize"); return; } DsrHead * dsrHead = (DsrHead *)(m_fileData.data());//读取dsr源文件的头文件的结构体 if(dsrHead->dataBegin > (u32)size) { qDebug("dsr dataBegin err"); return; } size -= dsrHead->dataBegin; if (size <= 0) { qDebug("dsr dataBegin err"); return; } //异形冲孔 //int sizeHead = sizeof(DsrHead); float ver = *((float*)(&dsrHead->verCode)); if(ver == DSR_VERSION_5_5 && dsrHead->shapeAddress != 0) { int addSize = m_fileData.size() - dsrHead->shapeAddress; if (addSize <= 0) { qDebug("dsr shapeAddress err"); return; } size = dsrHead->shapeAddress - dsrHead->dataBegin; if (size <= 0) { qDebug("dsr dataBegin err"); return; } } int stepsize = size/sizeof(DsrStep); if (stepsize <= 0) { qDebug("dsr data size err"); return; } DsrStep * dsrDataBeg = (DsrStep *)((m_fileData.data() + dsrHead->dataBegin)); // 绝对坐标数据 DataDs16FileHead dhead; memset(&dhead, 0, sizeof(DataDs16FileHead)); QByteArray absData;//绝对坐标 absData.clear(); DsAbsItem absItem; memset(&absItem,0,sizeof(DsAbsItem)); DsrStep * dsrDataPtr = dsrDataBeg; DsrStep * dsrDataPtrTemp = dsrDataBeg; int stepidx = 0; BYTE ctrl,attr; int colorNum = 1; int runflag = 0; double xfactor ; double yfactor ; double rfactor ; if (dsrHead->xyUnit == 0) // 0:单位0.1mm; 1: 0.01mm; 2: mm { xfactor = DSR_DATADIRX*10; yfactor = DSR_DATADIRY*10; } else if (dsrHead->xyUnit == 2) { xfactor = DSR_DATADIRX*100; yfactor = DSR_DATADIRY*100; } else { xfactor = DSR_DATADIRX; yfactor = DSR_DATADIRY; } if (dsrHead->rUnit == 0) // 0:单位0.36度; 1: 0.036度; 2: 度; 3, 1/10000弧度; { rfactor = 2*PI*10 * DSR_DATADIRR; } else if (dsrHead->rUnit == 1) { rfactor = 2*PI * DSR_DATADIRR; } else { rfactor = DSR_DATADIRR; } int firstPunchStepFlag = 0;//第一针冲孔针步标志 int firstPunchStepDr = 0;//第一针冲孔针步角度 int ax,ay,ar; ax = ay = ar = 0; for (int i = 0; i < stepsize; i++) { ctrl = dsrDataPtr->ctrl; attr = dsrDataPtr->attr; ax = dsrDataPtr->dx; ay = dsrDataPtr->dy; ar = dsrDataPtr->dr; if (ctrl == DATA_PAUSE_OLD) // 暂停 { ctrl = DATA_PAUSE; } if (ctrl == DATA_ANGLE_OLD) // 拐点 { ctrl = DATA_ANGLE; } if (ctrl == DATA_CUT_OLD) // 剪线 { ctrl = DATA_CUTTRD; } if (ctrl == DATA_END_OLD) // 结束码 { ctrl = DATA_END; } if (ctrl == DATA_CHGND_OLD) // 换色功能码 { ctrl = DATA_CHGND; } if (dsrDataPtr->ctrl == DSR_CHGND) // 换色 { ctrl = DATA_CHGND; colorNum++; } if(firstPunchStepFlag == 0) { if(dsrDataPtr->ctrl == DSR_PUNCH) { firstPunchStepFlag = 1; firstPunchStepDr = ar; } } //画笔与冲孔之间的转换线需要转换为偏移 int insertFlag = 0; if(ctrl == DSR_PUNCH) { if(dsrDataPtr != dsrDataBeg) { dsrDataPtr--; if(dsrDataPtr->ctrl == DSR_DRAWING) { ctrl = DSR_OFFSET; runflag = 1; insertFlag = 1; } dsrDataPtr++; } } //判断是否要改变第一针的属性 if(ctrl == DSR_JUMP) { if (runflag == 0) { runflag = 1; } runflag++; } else if(ctrl == DSR_EMB || ctrl == DSR_SEWING || ctrl == DSR_PUNCH)//第一针不转换为跳针 { if ((runflag == 0 || runflag > 3) && (i >= 0)) // 第一个运针是入针 { dsrDataPtr++; u8 ctl = dsrDataPtr->ctrl; if(ctl == DSR_EMB)//下一针还为针步时才转换为跳针 { ctrl = DATA_JUMP; } dsrDataPtr--; runflag = 1; } //else if (i == 0 && ddx == 0 && ddy == 0) // 第一针,入针,向后扫描,如果有连续的三个跳针,则将第一针入针转换为跳针 ljs else if (i == 0) // 20230511 第一针,入针,向后扫描,如果有连续的三个跳针,则将第一针入针转换为跳针 ljs { int count = 0; do { dsrDataPtrTemp++; if (dsrDataPtr->ctrl == DSR_JUMP) { count++; if (dsrDataPtrTemp->dx == 0 && dsrDataPtrTemp->dy == 0) // 空跳,直接变成跳针 { count += 2; } } else { break; } }while(1); if (count >= 3) { if(ctrl == DSR_EMB) { ctrl = DATA_JUMP; } runflag = 2; } else { runflag = 1; } } else { runflag = 1; } } else if (ctrl == DATA_CHGND) // 换色 { runflag = 10; } else { if(ctrl != DSR_OFFSET) { runflag = 0; } } absItem.ctrl = ctrl; absItem.attr = attr; absItem.action = dsrDataPtr->action; absItem.ax = ax * xfactor; absItem.ay = ay * yfactor; absItem.ar = ar * rfactor; absData.append((char*)(&absItem), sizeof(DsAbsItem)); //插入空针 if(insertFlag == 1) { absItem.ctrl = dsrDataPtr->ctrl; absItem.attr = 0; absItem.action = 0; absItem.ax = ax * xfactor; absItem.ay = ay * yfactor; absItem.ar = ar * rfactor; absData.append((char*)(&absItem), sizeof(DsAbsItem)); stepidx++; } #if(0) //插入空针,原地冲个孔 if(ctrl == DSR_OFFSET) { DsrStep * tempDataPtr; //下一针非偏移 if(i+1 < stepsize) { tempDataPtr = dsrDataPtr + 1; if(tempDataPtr->ctrl != DSR_OFFSET) { if(tempDataPtr->ctrl == DSR_PUNCH) { absItem.ctrl = tempDataPtr->ctrl; absItem.attr = 0; absItem.action = 0; absItem.ax = ax * xfactor; absItem.ay = ay * yfactor; absItem.ar = ar * rfactor; absData.append((char*)(&absItem), sizeof(DsAbsItem)); stepidx++; } } } } #endif stepidx++; dsrDataPtr++; } int newstepnum = stepidx; // 转换后的数据长度 // 文件头转换 QString name = getFileFullName(); int namelen = name.size(); if (namelen > HEAD_NAME_STR_LEN) { namelen = HEAD_NAME_STR_LEN; } memcpy(dhead.fileName, name.data(), namelen); // 文件名称 dhead.dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数 dhead.itemNums = newstepnum; // 数据项个数 dhead.bytesPerItem = sizeof(DsAbsItem); // 每项占的字节数 dhead.bytesPerBlk = MAX_EXDP_LEN; // 数据内容划分块大小 dhead.dataChecksum = calcCheckSum32((u8 *)(absData.data()) , absData.length()); // 数据累加校验和 dhead.checkCrc = calcCrc16((u8 *)(&dhead), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验,(6个字段分别为:文件名称,字节数,项个数,每项字节数,每块字节数,数据累加和的CRC校验值) u32 fileID = 0; fileID = calcCheckSum32((u8 *)(absData.data()) , absData.length()); // 原始数据累加校验和 dhead.fileid = fileID; //中间数据的 fileid = dhead.anchorX = dsrHead->anchorX;// 定位点坐标X dhead.anchorY = dsrHead->anchorY;// 定位点坐标Y dhead.beginX = dsrHead->startX;// 数据起点坐标X dhead.beginY = dsrHead->startY;// 数据起点坐标Y dhead.beginR = firstPunchStepDr; dhead.minX = m_minX; dhead.maxX = m_maxX; dhead.minY = m_minY; dhead.maxY = m_maxY; // 轮廓范围,使用重新计算之后的值 dhead.colorNumber = colorNum; dhead.offsetX = dsrHead->offsetX; dhead.offsetY = dsrHead->offsetY; memcpy(dhead.switchTable,dsrHead->switchTable,sizeof(dhead.switchTable));//如果文件有色序会自动设置为文件中的色序 // 保存文件头到数组中 m_embAbsData.append((char *)(&dhead), sizeof(DataDs16FileHead)); // 保存数据到数组中 m_embAbsData.append(absData); } int DataFileDsr::createPreviewImage(QImage *pImg, int saveflag, int penwidth, 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 = DSR_PREVIEW_WIDTH; height = DSR_PREVIEW_HEIGHT; pImage = new QImage(width, height, IMAGE_TYPE); newimgflag = 1; } else { pImage = pImg; } width = pImage->width(); height = pImage->height(); if (width <= DSR_PREVIEW_SIDE*2 || height <= DSR_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); // 透明背景 // 背景 QPen pen; pen.setWidth(penwidth); pen.setColor(backcolor); painter.setPen(pen); painter.setBrush(backcolor); painter.drawRect(0, 0, width, height); QColor color = QColor(Qt::blue); pen.setColor(color); painter.setPen(pen); getDsrMinMax(); // 图形 int size = m_fileData.size(); if (size <= (int)(sizeof(DsrHead))) { qDebug("dsr size less then headsize"); return -1; } DsrHead * dsrHead = (DsrHead *)(m_fileData.data()); if(dsrHead->dataBegin > (u32)size) { qDebug("dsr dataBegin err"); return -1; } size -= dsrHead->dataBegin; if (size <= 0) { qDebug("dsr dataBegin err"); return -1; } float ver = *((float*)(&dsrHead->verCode)); if(ver == DSR_VERSION_5_5 && dsrHead->shapeAddress != 0) { int addSize = m_fileData.size() - dsrHead->shapeAddress; if (addSize <= 0) { qDebug("dsr shapeAddress err"); return -1; } size = dsrHead->shapeAddress - dsrHead->dataBegin; if (size <= 0) { qDebug("dsr dataBegin err"); return -1; } } int stepsize = size/sizeof(DsrStep); if (stepsize <= 0) { qDebug("dsr data size err"); return -1; } DsrStep * dsrDataBeg = (DsrStep *)((m_fileData.data() + dsrHead->dataBegin)); // 图形显示区域 int dpminx = DSR_PREVIEW_SIDE; int dpmaxx = width - DSR_PREVIEW_SIDE; int dpminy = DSR_PREVIEW_SIDE + DSR_PREVIEW_SIDE; int dpmaxy = height - DSR_PREVIEW_SIDE; // 计算缩放系数 double factor, temp; factor = (double)(abs(m_maxX - m_minX)) / (dpmaxx - dpminx); // 按x计算的缩放系数 temp = (double)(abs(m_maxY - m_minY)) / (dpmaxy - dpminy); // 按轮廓计算,最小能够放下重复次数个图形 if (temp >= factor) // 使用较大的缩放系数 { factor = temp; } // 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心) int dpx = (int)((dpminx+dpmaxx)/2 - (((m_maxX+dsrHead->startX)+(m_minX+dsrHead->startX))/factor)/2); int dpy = (int)((dpminy+dpmaxy)/2 - (((m_maxY+dsrHead->startY)+(m_minY+dsrHead->startY))/factor)/2); // 显示花样图形 BYTE ctrlByte; int colorIdx; int oldcolor; colorIdx = 0; oldcolor = -1; double datposx, datposy; int curx, cury, prex, prey; curx = cury = prex = prey = 0; DsrStep * dsrDataPtr = dsrDataBeg; for (int i = 0; i < stepsize; i++) { // 读入一个针步数据 ctrlByte = dsrDataPtr->ctrl; //attrByte = dsrDataPtr->attr; prex = curx; prey = cury; datposx = dsrDataPtr->dx + dsrHead->startX; datposy = dsrDataPtr->dy + dsrHead->startY; curx = (datposx) / factor + dpx; cury = (datposy) / factor + dpy; if (DSR_SHOWDIRX == -1) { curx = (width)-curx; } if (DSR_SHOWDIRY == -1) { cury = (height)-cury; } if(i == 0) { dsrDataPtr++; continue; } if ( ctrlByte == DSR_SEWING || ctrlByte == DSR_PUNCH || ctrlByte == DSR_CUTTING || ctrlByte == DSR_JUMP || ctrlByte == DSR_EMB ) { if (oldcolor != colorIdx) { int cidx = dsrHead->switchTable[colorIdx % BF_SW_ND]; int cnum = m_colorNum; cnum /= sizeof(QRgb); if (cnum > BF_SW_ND) { cnum = BF_SW_ND; } QColor sewcolor; if (cnum != 0) { cidx %= cnum; QRgb * pColor = m_pColor; if(pColor != NULL) { sewcolor.setRgb(pColor[cidx]); } else { sewcolor = QColor(Qt::green); } } else { sewcolor = QColor(Qt::green); } pen.setColor(sewcolor); painter.setPen(pen); oldcolor = colorIdx; } if(ctrlByte == DSR_PUNCH) { int cr = PUNCHRADIUS / factor; if(cr <= 0){cr = 1;} painter.drawEllipse(curx-cr, cury-cr, cr*2, cr*2); } else { painter.drawLine(prex, prey, curx, cury); } } else if (ctrlByte == DSR_CHGND) // 换色 { colorIdx++; } else { //qDebug("other type=0x%x", ctrlByte); } dsrDataPtr++; } // 保存成文件 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; } int DataFileDsr::createPunchShapeImage(QImage *pImg, int idx) { int width,height; QImage * pImage; pImage = pImg; width = pImage->width() - 2; height = pImage->height() - 2; QPainter painter(pImage); //背景 QPen pen; pen.setWidth(1); pen.setColor(QColor("white")); painter.setPen(pen); painter.setBrush(QColor("white")); painter.drawRect(0, 0, width, height); double suofanglv; int i; u32 j; suofanglv=0; for(i = 0; i < m_punchCountList.size(); i++) { if(m_punchCountList.at(i).biColorID == idx) { KongDaoInfo chongDaoInfo = m_punchCountList.at(i).pKongDaoInfo; ChongKongObj chongKongObj = chongDaoInfo.pChongKongObj; pen.setColor(QColor("blue")); painter.setPen(pen); double n1 = chongDaoInfo.widthX/width; double n2 = chongDaoInfo.heightY/height; n1>n2?suofanglv = n1:suofanglv=n2; for(j = 1; j < chongKongObj.countPt; j++) { tempDs16Item item0 = chongKongObj.pointList[j-1]; tempDs16Item item1 = chongKongObj.pointList[j]; painter.drawLine(item0.ax/suofanglv,item0.ay/suofanglv,item1.ax/suofanglv,item1.ay/suofanglv); } } } return 0; } int DataFileDsr::createPunchShapeData(QString filePath) { m_punchCountList.clear(); KongCount punchCount; KongDaoInfo punchInfo; ChongKongObj punchObj; tempDs16Item item ; QFile file(filePath); if(file.exists()) { //打开 if(!file.open(QIODevice::ReadOnly)) { return -1; } QByteArray fileData; fileData.clear(); fileData = file.readAll(); int size = fileData.size(); if (size <= (int)(sizeof(DsrHead))) { file.close(); return -1; } DsrHead * dsrHead = (DsrHead *)(fileData.data()); if(dsrHead->dataBegin > (u32)size) { qDebug("dsr dataBegin err"); return -1; } int dataSize = size - dsrHead->dataBegin; if (dataSize <= 0) { file.close(); return -1; } float ver = *((float*)(&dsrHead->verCode)); if(ver == DSR_VERSION_5_5) { int shapeSize = size - dsrHead->shapeAddress; if (shapeSize <= 0) { file.close(); return -1; } file.seek(dsrHead->shapeAddress); int k; u32 j; double dfiFlag; s32 iCount,iIndex; file.read((char *)&dfiFlag, sizeof(double)); //标识开始 file.read((char *)&iCount , sizeof(s32) ); //色号个数 if(dfiFlag == 5.5 && iCount>=0 && iCount<50) //记号判断 { for (k = 0; k < iCount; k++) { memset(&punchCount,0,sizeof(KongCount)); file.read((char *)&punchCount.biColorID, sizeof(u8)); //色号值 memset(&punchInfo,0,sizeof(KongDaoInfo)); file.read((char *)&punchInfo.colorId, sizeof(u32) ); file.read((char *)&punchInfo.refColor,sizeof(u8)*4); file.read((char *)&punchInfo.widthX, sizeof(float)); file.read((char *)&punchInfo.heightY,sizeof(float)); file.read((char *)&punchInfo.biValue, sizeof(u8)); if(punchInfo.biValue) { memset(&punchObj,0,sizeof(ChongKongObj)); file.read((char *)&punchObj.nIdKey, sizeof(u32)); file.read((char *)&punchObj.refColor,sizeof(u8)*4); file.read((char *)&punchObj.countPt , sizeof(u32)); file.read((char *)&punchObj.zhuCount, sizeof(u32)); //if (punchObj.countPt < 0 || punchObj.zhuCount < 0 || punchObj.zhuCount > 500) if (punchObj.zhuCount > 500) { memset(&punchObj,0,sizeof(ChongKongObj)); } else { for (j = 0; j < punchObj.zhuCount; j++) { file.read((char *)&iIndex, sizeof(s32)); punchObj.gruopIndexArray[j]=iIndex; //punchObj.gruopIndexArray[j]=iIndex; } for (j = 0; j < punchObj.countPt; j++) { memset(&item,0,sizeof(tempDs16Item)); file.read((char *)&item.ax, sizeof(double)); file.read((char *)&item.ay, sizeof(double)); punchObj.pointList[j]=item; //punchObj.pointList.append(m_item); } } } punchInfo.pChongKongObj=punchObj; punchCount.pKongDaoInfo=punchInfo; m_punchCountList.append(punchCount); } } return 0; } else { return -1; } } else { file.close(); return -1; } file.close(); return 0; } void DataFileDsr::clear() { m_fileFullPathName.clear(); // 文件路径 m_fileData.clear(); // 文件数据内容 m_embAbsData.clear(); // 转换后的数据 } void DataFileDsr::loadFile() { QFile rdfile(m_fileFullPathName); if(!rdfile.open(QIODevice::ReadOnly)) { qDebug() << "open file fail when read, path =" << m_fileFullPathName; return; } m_fileData = rdfile.readAll(); rdfile.close(); int ret = checkFileCryption(); if(ret > 0)//已加密 { //解密 int size = m_fileData.size(); if (size <= (int)(sizeof(DsrHead))) { qDebug("dsr size less then headsize"); return; } DsrHead * dsrHead = (DsrHead *)(m_fileData.data()); if(dsrHead->dataBegin > (u32)size) { qDebug("dsr dataBegin err"); return ; } size -= dsrHead->dataBegin; BYTE* pCryFactors = (BYTE*)(&dsrHead->dataBegin); BYTE* pData = (BYTE*)((m_fileData.data() + dsrHead->dataBegin)); DsrCryption cry; cry.InitDsrCryptionCtrl(-1, dsrHead->cryWord, pCryFactors); int rslt = cry.DeCryption(pData, size); if (rslt == 0) { dsrHead->cryWord = 0; } } return; } void DataFileDsr::saveFile() { QFile wrfile(m_fileFullPathName); if(!wrfile.open(QIODevice::WriteOnly | QIODevice::Truncate)) { qDebug() << "open file fail when wirte, path =" << m_fileFullPathName; return; } else { wrfile.write(m_fileData); wrfile.close(); } } //写入起始点到文件中 void DataFileDsr::writePointToFile(int x, int y, int flag) { if(m_fileData.size() <= 0) { return; } DsrHead * pDsrHead = (DsrHead *)(m_fileData.data()); if(flag == 0) { pDsrHead->startX = x; pDsrHead->startY = y; } else { pDsrHead->anchorX = x; pDsrHead->anchorY = 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); wfile.close(); #ifdef Q_OS_LINUX system("sync"); #endif } void DataFileDsr::writeOffsetXYMoveToFile(s32 offsetX, s32 offsetY) { if(m_fileData.size() <= 0) { return; } DsrHead * pDsrHead = (DsrHead *)(m_fileData.data()); pDsrHead->offsetX = offsetX; pDsrHead->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(); } QString DataFileDsr::getFileFullPath() { QFileInfo file(m_fileFullPathName); return file.absoluteFilePath(); } QString DataFileDsr::getFileFullName() { QFileInfo file(m_fileFullPathName); return file.fileName(); } QString DataFileDsr::getFileName() { QFileInfo file(m_fileFullPathName); return file.completeBaseName(); } QString DataFileDsr::getFileSuffix() { QFileInfo file(m_fileFullPathName); return file.suffix(); } int DataFileDsr::getStitchNums() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDsrHead->itemNums; } int DataFileDsr::getColorNums() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDsrHead->colorNumber; } //测试fileid用,目前这个函数没用到 int DataFileDsr::getFileid() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDsrHead->fileid; } int DataFileDsr::getDatWidth() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); return (pDsrHead->maxX - pDsrHead->minX); } int DataFileDsr::getDatHeight() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); return (pDsrHead->maxY - pDsrHead->minY); } int DataFileDsr::getMaxX() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDsrHead->maxX; } int DataFileDsr::getMinX() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDsrHead->minX; } int DataFileDsr::getMaxY() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDsrHead->maxY; } int DataFileDsr::getMinY() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); return pDsrHead->minY; } int DataFileDsr::getAnchorX() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); int x = pDsrHead->anchorX; return x; } int DataFileDsr::getAnchorY() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); int y = pDsrHead->anchorY; return y; } int DataFileDsr::getBeginX() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); int x = pDsrHead->beginX; return x; } int DataFileDsr::getBeginY() { if(m_embAbsData.size() <= 0) { return 0; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); int y = pDsrHead->beginY; return y; } int DataFileDsr::getBeginXYAndAnchorXY(QString path, int &beginX, int &beginY, int &anchorX, int &anchorY) { QFileInfo file(path); if (!file.exists() || !file.isFile()) { return -1; } QFile rdfile(path); if(!rdfile.open(QIODevice::ReadOnly)) { return -1; } QByteArray fileData = rdfile.readAll(); int size = fileData.size(); if (size <= (int)(sizeof(DsrHead))) { return -1; } DsrHead * pDsrHead = (DsrHead *)((fileData.data())); DsrStep * dsrDataBeg = (DsrStep *)((fileData.data() + pDsrHead->dataBegin)); anchorX = pDsrHead->anchorX; anchorY = pDsrHead->anchorY; //起始点坐标等于定位点+起始点+第一针的坐标 beginX = pDsrHead->anchorX-pDsrHead->startX-dsrDataBeg->dx; beginY = pDsrHead->anchorY+pDsrHead->startY+dsrDataBeg->dy; rdfile.close(); return 0; } void DataFileDsr::getSwitchTable(u8 *table) { if(m_embAbsData.size() <= 0) { return; } DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data())); memcpy(table,pDsrHead->switchTable,sizeof(pDsrHead->switchTable)); } int DataFileDsr::checkFileCryption() { int encryption = 0; int size = m_fileData.size(); if (size <= (int)(sizeof(DsrHead))) { qDebug("dsr size less then headsize"); return -1; } DsrHead * dsrHead = (DsrHead *)(m_fileData.data()); if(dsrHead->dataBegin > (u32)size) { qDebug("dsr dataBegin err"); return -1; } size -= dsrHead->dataBegin; if (size <= 0) { qDebug("dsr dataBegin err"); return -1; } int stepsize = size/sizeof(DsrStep); if (stepsize <= 0) { qDebug("dsr data size err"); return -1; } if (dsrHead->cryWord != 0) { encryption = 1; } return encryption; } void DataFileDsr::getDsrMinMax() { loadFile(); // 如果数据未读取,重新读取 int size = m_fileData.size(); if (size <= (int)(sizeof(DsrHead))) { qDebug("dsr size less then headsize"); return; } DsrHead * dsrHead = (DsrHead *)(m_fileData.data()); if(dsrHead->dataBegin > (u32)size) { qDebug("dsr dataBegin err"); return; } size -= dsrHead->dataBegin; if (size <= 0) { qDebug("dsr dataBegin err"); return; } float ver = *((float*)(&dsrHead->verCode)); if(ver == DSR_VERSION_5_5 && dsrHead->shapeAddress != 0) { int addSize = m_fileData.size() - dsrHead->shapeAddress; if (addSize <= 0) { qDebug("dsr shapeAddress err"); return; } size = dsrHead->shapeAddress - dsrHead->dataBegin; if (size <= 0) { qDebug("dsr dataBegin err"); return; } } int stepsize = size/sizeof(DsrStep); if (stepsize <= 0) { qDebug("dsr data size err"); return; } DsrStep * dsrDataBeg = (DsrStep *)((m_fileData.data() + dsrHead->dataBegin)); DsrStep * dsrDataPtr = dsrDataBeg; m_maxX = S32_MIN; m_maxY = S32_MIN; m_minY = S32_MAX; m_minX = S32_MAX; BYTE ctrlByte; long curPitX = 0; long curPitY = 0; int i = 0; do { if (i < stepsize) { ctrlByte = dsrDataPtr->ctrl; if ( ctrlByte == DATA_EMB || ctrlByte == DSR_SEWING || ctrlByte == DATA_JUMP || ctrlByte == DATA_OFFSET || ctrlByte == DATA_PUNCH || ctrlByte == DATA_DRAWING || 0 ) { curPitX = dsrDataPtr->dx; curPitY = dsrDataPtr->dy; } dsrDataPtr++; i++; } else { break; } if (curPitX > m_maxX) { m_maxX = curPitX; } if (curPitX < m_minX) { m_minX = curPitX; } if (curPitY > m_maxY) { m_maxY = curPitY; } if (curPitY < m_minY) { m_minY = curPitY; } }while(1); return; } int DataFileDsr::checkDefaultSwitchTable(int colornum) { //loadFile(); // 如果数据未读取,重新读取 int size = m_fileData.size(); if (size <= (int)(sizeof(DsrHead))) { qDebug("dst size less then headsize"); return -1; } DsrHead * dsrHead = (DsrHead *)(m_fileData.data()); if(dsrHead->dataBegin > (u32)size) { qDebug("dsr dataBegin err"); return -1; } size -= dsrHead->dataBegin; int stepsize = size/sizeof(DsrStep); if (stepsize <= 0) { qDebug("dst data size err"); return -1; } DsrHead * pDsrHead = (DsrHead *)((m_fileData.data())); int i; if (colornum < 1) { colornum = 1; } if (colornum > BF_SW_ND) { colornum = BF_SW_ND; } for (i = 0; i < colornum; i++) { if (pDsrHead->switchTable[i] != 0x20) { break; } } if (i < colornum) // 不全部是0x20, 可能设置过色序 { for (i = 0; i < colornum; i++) { if (pDsrHead->switchTable[i] != 0x00) { break; } } } if (i >= colornum && colornum > 1) // 全部是0x20 或 全部是0, 未设置过色序 { for (i = 0; i < colornum; i++) { pDsrHead->switchTable[i] = i; // 默认色序 } saveFile(); // 保存文件 } return 0; }