EmbHMI/datafile/datafiledsr.cpp
2024-02-06 14:27:07 +08:00

1324 lines
32 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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以上版本和错误格式返回-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))+0.1;
if(ver < DSR_VERSION_5)// 5.x 以下版本
{
return -1;
}
if(ver >= DSR_VERSION_6_3)//6.3版本
{
if (size <= (int)(sizeof(DsrHead63)))
{
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 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,beforeCtrl;
int runflag = 0;
beforeCtrl = 0;
int colorNum = 1;
s16 towelHighNum = 1;
int dataEMB = 0;
int dataLASER = 0;
int dataCHEN = 0;
int dataCOIL = 0;
double xfactor ;
double yfactor ;
double rfactor ;
if (dsrHead->xyUnit == 0) // 0单位0.1mm; 1: 0.01mm; 2: mm
{
xfactor = DSR_EMB_DATADIRX*10;
yfactor = DSR_EMB_DATADIRY*10;
}
else if (dsrHead->xyUnit == 2)
{
xfactor = DSR_EMB_DATADIRX*100;
yfactor = DSR_EMB_DATADIRY*100;
}
else
{
xfactor = DSR_EMB_DATADIRX;
yfactor = DSR_EMB_DATADIRY;
}
if (dsrHead->rUnit == 0) // 0单位0.36度; 1: 0.036度; 2: 度; 3, 1/10000弧度;
{
rfactor = 2*PI*10 * DSR_EMB_DATADIRR;
}
else if (dsrHead->rUnit == 1)
{
rfactor = 2*PI * DSR_EMB_DATADIRR;
}
else
{
rfactor = DSR_EMB_DATADIRR;
}
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(beforeCtrl != ctrl)
{
//等于冲缝绣任意一种针步
if(ctrl == DSR_SEWING || ctrl == DSR_PUNCH || ctrl == DSR_EMB)
{
if(beforeCtrl != 0)
{
//判断前一针步是否为换色
dsrDataPtr--;
if(dsrDataPtr->ctrl == DSR_CHGND)
{
dsrDataPtr++;
}
else
{
//插入换色码
absItem.ctrl = DATA_CHGND;
absItem.attr = 0;
absItem.action = 0;
absItem.ax = ax * xfactor;
absItem.ay = ay* yfactor;
absItem.ar = ar * rfactor;
absData.append((char*)(&absItem), sizeof(DsAbsItem));
dsrDataPtr++;
colorNum++;
}
}
beforeCtrl = ctrl;
}
}
if (dsrDataPtr->ctrl == DSR_CHGND) // 换色
{
ctrl = DATA_CHGND;
colorNum++;
}
if (dsrDataPtr->ctrl == DSR_TOWELHIGH) // 毛巾高度
{
ctrl = DATA_TOWELHIGH;
towelHighNum++;
}
//判断dsr花版里是不是有以下数据
if(dsrDataPtr->ctrl == DSR_EMB)// bit2,平绣数据有无 0,无 1,有
{
dataEMB = 1;
}
if(dsrDataPtr->ctrl == DSR_LASER)// bit3,激光数据有无 0,无 1,有
{
dataLASER = 1;
}
if(dsrDataPtr->ctrl == DSR_CHENILLE ||
dsrDataPtr->ctrl == DSR_CHAIN)// bit4,毛巾链式数据有无 0,无 1,有
{
dataCHEN = 1;
}
if(dsrDataPtr->ctrl == DSR_COIL ||
dsrDataPtr->ctrl == DSR_SAWTOOTH ||
dsrDataPtr->ctrl == DSR_RIBBON)// bit5,缠绕,锯齿,盘带,数据有无 0,无 1,有
{
dataCOIL = 1;
}
#if(1)
//判断是否要改变第一针的属性
if(ctrl == DSR_JUMP)
{
if (runflag == 0)
{
runflag = 1;
}
runflag++;
}
else if(ctrl == DSR_EMB)//是否转换为跳针
{
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)
{
ctrl = DATA_JUMP;
runflag = 2;
}
else
{
runflag = 1;
}
}
else
{
runflag = 1;
}
//第一针位移都为0时下一针也转换为跳针
// if(i == 0 && ddx == 0 && ddy == 0)
// {
// runflag = 3;
// }
}
else if (ctrl == DATA_CHGND) // 换色
{
runflag = 10;
}
else
{
runflag = 0;
}
#endif
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));
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 = 0; // 定位点坐标X
dhead.anchorY = 0; // 定位点坐标Y
dhead.beginX = dsrHead->startX;// 数据起点坐标X
dhead.beginY = dsrHead->startY;// 数据起点坐标Y
dhead.beginR = 0;
dhead.minX = m_minX;
dhead.maxX = m_maxX;
dhead.minY = m_minY;
dhead.maxY = m_maxY; // 轮廓范围,使用重新计算之后的值
dhead.colorNum = colorNum;
dhead.towelHighNum = towelHighNum;
dhead.offsetEn = dsrHead->offsetEn;//中间数据的偏移点XY = dsr头文件的偏移点XY允许
if(dataEMB == 1)// bit2,平绣数据有无 0,无 1,有
{
dhead.offsetEn = dhead.offsetEn | 0x04;
}
if(dataLASER == 1)// bit3,激光数据有无 0,无 1,有
{
dhead.offsetEn = dhead.offsetEn | 0x08;
}
if(dataCHEN == 1)// bit4,毛巾链式数据有无 0,无 1,有
{
dhead.offsetEn = dhead.offsetEn | 0x10;
}
if(dataCOIL == 1 )// bit5,缠绕,锯齿,盘带,数据有无 0,无 1,有
{
dhead.offsetEn = dhead.offsetEn | 0x20;
}
else
{
dhead.offsetEn = dhead.offsetEn | 0x00;
}
dhead.offsetX = dsrHead->offsetX;
dhead.offsetY = dsrHead->offsetY;
//dsr头文件中的以何种工作机头定点
dhead.begHead = dsrHead->begWorkHead;//中间数据的机头 等于 dsr头文件的机头
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 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 = 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 backColor1;
QColor backColor2;
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;
}
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+m_minX)/factor)/2);
int dpy = (int)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2);
// 显示花样图形
BYTE ctrlByte;
//BYTE attrByte;
int colorIdx;
int oldcolor;
colorIdx = 0;
oldcolor = -1;
WORD actionWord; //附加动作
double datposx, datposy;
int curx, cury, prex, prey;
curx = cury = prex = prey = 0;
DsrStep * dsrDataPtr = dsrDataBeg;
QColor beadColor;
for (int i = 0; i < stepsize; i++)
{
// 读入一个针步数据
ctrlByte = dsrDataPtr->ctrl;
//attrByte = dsrDataPtr->attr;
actionWord = dsrDataPtr->action;
prex = curx;
prey = cury;
datposx = dsrDataPtr->dx;
datposy = dsrDataPtr->dy;
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_CUTTING ||
ctrlByte == DSR_LASER ||
ctrlByte == DSR_JUMP ||
ctrlByte == DSR_PUNCH ||
ctrlByte == DSR_CHENILLE ||
ctrlByte == DSR_CHAIN ||
ctrlByte == DSR_COIL ||
ctrlByte == DSR_SAWTOOTH ||
ctrlByte == DSR_RIBBON ||
ctrlByte == DSR_EMB )
{
if (oldcolor != colorIdx)
{
int cidx = dsrHead->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 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(gradientFlag == 1)//渐变色绘制
{
backColor2 = getBrightDec(sewcolor);
backColor1 = getBrightAdd(sewcolor);
}
beadColor = sewcolor;
}
//亮片或散珠动作
//action1是0x20代表散珠或亮片动作,绘制散珠或亮片效果图
if((actionWord & 0x20) == 0x20)
{
int cr = BEADRADIUS / factor;
if(((actionWord >> 8) >= 0x01) && ((actionWord >> 8) <= 0x0F))//亮片
{
QPen npen;
npen.setWidth(2);
npen.setColor(beadColor);
painter.setPen(npen);
painter.drawEllipse(curx-cr,cury-cr,cr*2,cr*2);
painter.drawEllipse((curx-cr)+cr/2+cr*0.3,(cury-cr)+cr/2+cr*0.3,cr*0.7,cr*0.7);
}
if(((actionWord >> 8) >= 0x11) && ((actionWord >> 8) <= 0x1F))//散珠
{
QBrush brush;
brush.setColor(beadColor);//设置颜色
brush.setStyle(Qt::SolidPattern);//设置填充的风格,可以使用帮助文档查看有哪些风格
painter.setBrush(brush);
QPen npen(brush , 2);
painter.setPen(npen);
painter.drawEllipse(curx-cr,cury-cr,cr*2,cr*2);
}
}
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);
}
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;
}
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);
#ifdef Q_OS_LINUX
system("sync");
#endif
wrfile.close();
}
}
//偏移点XY写回dsr头文件
void DataFileDsr:: writeOffsetXYMoveToFile(s32 EnFlag,s32 offsetX,s32 offsetY)
{
if(m_fileData.size() <= 0)
{
return;
}
DsrHead * pDsrHead = (DsrHead *)(m_fileData.data());
pDsrHead->offsetEn = EnFlag;
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();
}
QByteArray DataFileDsr::getTowelHighTable(QString path)
{
QByteArray towelHighTable;//dsr6.3毛巾高度
towelHighTable.resize(TOWELHIGHBUF);
memset(towelHighTable.data(),0,TOWELHIGHBUF);
QFile rdfile(path);
if(!rdfile.open(QIODevice::ReadOnly))
{
return towelHighTable;
}
QByteArray fileData = rdfile.readAll();
rdfile.close();
int size = fileData.size();
if (size <= (int)(sizeof(DsrHead)))
{
qDebug("dsr size less then headsize");
return towelHighTable;
}
DsrHead * dsrHead = (DsrHead *)(fileData.data());//读取dsr源文件的头文件的结构体
float ver = *((float*)(&dsrHead->verCode))+0.1;
if(ver >= DSR_VERSION_6_3)//6.3版本-带毛巾高度
{
DsrHead63 * dsrHead63 = (DsrHead63 *)(fileData.data()+sizeof(DsrHead));
memcpy(towelHighTable.data(),dsrHead63->towelHighTable,towelHighTable.length());
}
return towelHighTable;
}
//写入起绣点到文件中
void DataFileDsr::writePointToFile(u8 type, int x, int y, int st ,u8 workHead)
{
if(st == 0){}
if(m_fileData.size() <= 0)
{
return;
}
DsrHead * pDsrHead = (DsrHead *)(m_fileData.data());
if(type == START_POINT)
{
pDsrHead->begWorkHead = workHead;//dsr头文件 == 主控中的机头
pDsrHead->startX = x;
pDsrHead->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();
#ifdef Q_OS_LINUX
system("sync");
#endif
}
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->colorNum;
}
int DataFileDsr::getTowelHighNums()
{
if(m_embAbsData.size() <= 0)
{
return 0;
}
DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data()));
return pDsrHead->towelHighNum;
}
//测试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::getJumpNeedleNum()
{
if(m_embAbsData.size() <= 0)
{
return 0;
}
DataDs16FileHead * pDsrHead = (DataDs16FileHead *)((m_embAbsData.data()));
return pDsrHead->jumpNeedleNum;
}
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;
}
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_CHENILLE ||
ctrlByte == DATA_CHAIN ||
ctrlByte == DATA_COIL ||
ctrlByte == DATA_SAWTOOTH ||
ctrlByte == DATA_RIBBON ||
ctrlByte == DATA_LASER ||
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 > EMB_BF_SW_ND)
{
colornum = EMB_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;
}
QColor DataFileDsr::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 DataFileDsr::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;
}