PunchHMI/datafile/datafiledsr.cpp

1380 lines
34 KiB
C++
Raw Normal View History

2024-02-06 06:58:57 +00:00
#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;
}
}
//画笔与冲孔之间的转换线需要转换为偏移
if(ctrl == DSR_PUNCH)
{
if(dsrDataPtr != dsrDataBeg)
{
dsrDataPtr--;
if(dsrDataPtr->ctrl == DSR_DRAWING)
{
ctrl = DSR_OFFSET;
runflag = 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(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++;
}
}
}
}
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;
}