1380 lines
34 KiB
C++
1380 lines
34 KiB
C++
#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;
|
||
}
|