Quilting-lw/datafile/embdata.cpp
2026-01-23 16:37:18 +08:00

10661 lines
333 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 "embdata.h"
#include "main.h"
#include "sharedviews/setcontrolstyle.h"
#include <QList>
#include <bitset>
static int emb_showDirX = (1);// X向显示坐标和数据坐标的差异
static int emb_showDirY = (1);// Y向显示坐标和数据坐标的差异
const int headNum = 5; // 机头数
EmbData::EmbData()
{
m_pEmbDs16Head = new DataDs16FileHead();
m_penHeadPix.resize(5);
m_penPoint.resize(5);
clear();
}
EmbData::~EmbData()
{
clear();
if(m_pEmbDs16Head != NULL)
{
delete m_pEmbDs16Head;
}
}
void EmbData::clear()
{
m_maxX = 0;
m_minX = 0;
m_maxY = 0;
m_minY = 0;
m_fileid = 0;
m_spaceX = 0;
m_spaceY = 0;
m_penX = 0;
m_penY = 0;
m_embDs16Data.clear();
m_editedflag = 0;
m_filePath.clear();
m_factor = 0;
m_dispDatFront.clear();//飞梭机前排数据
m_dispDatMiddle.clear();//飞梭机中排数据
m_dispDatBehind.clear();//飞梭机后排数据
m_dispMinX = S32_MAX;
m_dispMaxX = S32_MIN;
m_dispMinY = S32_MAX;
m_dispMaxY = S32_MIN;
m_oftNeedleSize = 0;
m_ritStepSize = 0;
memset(m_pEmbDs16Head,0,sizeof(DataDs16FileHead));
}
QByteArray & EmbData::getDsDat()
{
//qDebug()<<"m_editedflag"<<m_editedflag;
if(m_editedflag != 0)
{
createEmbDs16FromAbs();
}
return m_embDs16Data;
}
//检查起针和末针的x坐标是否一致如果有相差是不能绣作的需要提示
bool EmbData::checkFirstEndNeedle(QByteArray ary)
{
int size = ary.size();
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("dat dataBegin err: datasize is non-positive!");
return false;
}
int stepsize = datasize / sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("ds16 data size err: stepsize is non-positive!");
return false;
}
int firstX = 0;
int endX = 0;
DsAbsItem * ds16DataPtr = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead));
for(int i = 0; i < stepsize; i++)
{
// 确保指针不越界
if (reinterpret_cast<char*>(ds16DataPtr) + sizeof(DsAbsItem) > ary.data() + size) {
qDebug("Array access out of bounds at step %d", i);
return false;
}
if(
ds16DataPtr->ctrl == DATA_SEWING ||
ds16DataPtr->ctrl == DATA_JUMP ||
ds16DataPtr->ctrl == DATA_OFFSET)
{
if(i == 0)
{
firstX = ds16DataPtr->ax;
}
endX = ds16DataPtr->ax;
}
ds16DataPtr++;
}
if(abs(endX - firstX) != 0) // 不等于0mm
{
qDebug() << "firstX:" << firstX << "endX:" << endX;
return false;
}
return true;
}
//按照标志位置来设置文件数据-旋转角度调整
QByteArray EmbData::rotationAngleAdjustment(int flag)
{
// 检查数据大小是否足够
if (m_embDs16Data.size() < static_cast<int>(sizeof(DataDs16FileHead)))
{
qDebug("dat dataBegin err: not enough data for header!");
return QByteArray();
}
DataDs16FileHead *dataDs16FileHead = reinterpret_cast<DataDs16FileHead*>(m_embDs16Data.data());
int size = m_embDs16Data.size();
int datasize = size - static_cast<int>(sizeof(DataDs16FileHead));
if (datasize <= 0)
{
qDebug("dat dataBegin err: datasize is non-positive!");
return QByteArray();
}
int stepsize = datasize / static_cast<int>(sizeof(Ds16Item));
if (stepsize <= 0)
{
qDebug("ds16 data size err: stepsize is non-positive!");
return QByteArray();
}
Ds16Item *ds16DataPtr = reinterpret_cast<Ds16Item*>(m_embDs16Data.data() + sizeof(DataDs16FileHead));
Ds16Item *ds16DataPtr_tmp = reinterpret_cast<Ds16Item*>(m_embDs16Data.data() + sizeof(DataDs16FileHead));
QList<short> drList;
for(int i = 0; i < stepsize; ++i)
{
drList.append(ds16DataPtr_tmp->dr);
ds16DataPtr_tmp++;
}
switch (flag)
{
case 1:
{
dataDs16FileHead->beginR += ds16DataPtr->dr;
for (int i = 0; i < stepsize - 1; ++i)
{
// 确保指针不越界
if (reinterpret_cast<char*>(ds16DataPtr) + sizeof(Ds16Item) > m_embDs16Data.data() + size)
{
qDebug("Array access out of bounds at step %d", i);
return QByteArray();
}
ds16DataPtr->dr = drList.at(i+1);
if (i == stepsize - 2)
{
(ds16DataPtr + 1)->dr = 0;
}
ds16DataPtr++;
}
}
break;
case -1:
{
for (int i = 0; i < stepsize - 1; ++i)
{
// 确保指针不越界
if (reinterpret_cast<char*>(ds16DataPtr) + sizeof(Ds16Item) > m_embDs16Data.data() + size)
{
qDebug("Array access out of bounds at step %d", i);
return QByteArray();
}
if (i == 0)
{
(ds16DataPtr + 1)->dr = drList.at(i);
ds16DataPtr->dr = 0;
continue;
}
(ds16DataPtr + 1)->dr = drList.at(i);
ds16DataPtr++;
}
}
break;
case 0:
return m_embDs16Data;
break;
default:
qDebug()<<"The Flag is no meet the requirements!";
return QByteArray();
}
return QByteArray();
}
QByteArray EmbData::getDispDat(double showWidth,double showHeight)
{
QByteArray dispDat;
ViewItem dispItem;
dispDat.clear();//显示绘图用的数据(需要转换)
// ds16数据
int size = m_embDs16Data.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
return dispDat;
}
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(m_embDs16Data.data());
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
return dispDat;
}
int stepsize = datasize/sizeof(Ds16Item);
if (stepsize <= 0)
{
return dispDat;
}
double width = showWidth;
double height = showHeight;
Ds16Item * ds16DataPtr;
Ds16Item * pData = (Ds16Item *)(m_embDs16Data.data() + sizeof(DataDs16FileHead));
ds16DataPtr = pData;
// 显示花样图形
u8 ctrlByte;
u8 attrByte;
int dx;
int dy;
int dr;
double datposx, datposy, datposr, firstx, firsty;
double curx, cury, curr, prex, prey;
curx = cury = curr = prex = prey = 0;
double unit = 100.0;//因为ds16的数据是0.01毫米
// 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心)
// int dpx = (showWidth)/2.0 - ((m_maxX+m_minX)/unit)/2.0;
// int dpy = (showHeight)/2.0 - ((m_maxY+m_minY)/unit)/2.0;
int dpx = (showWidth)/2.0;
int dpy = (showHeight)/2.0;
datposx = pDsHead->beginX;
datposy = pDsHead->beginY;
datposr = pDsHead->beginR;
firstx = pDsHead->beginX;
firsty = pDsHead->beginY;
curx = (datposx - firstx)/unit + dpx;
cury = (datposy - firsty)/unit + dpy;
if(isFlipDispYMac())
{
emb_showDirY = -1;
}
if(isFlipDispXMac())
{
emb_showDirX = -1;
}
if (emb_showDirX == -1)
{
curx = width - curx;
}
if (emb_showDirY == -1)
{
cury = height - cury;
}
// double maxX = S32_MIN;
// double maxY = S32_MIN;
// double minX = S32_MAX;
// double minY = S32_MAX;
for (int i = 0; i < stepsize; i++)
{
prex = curx;
prey = cury;
// 读入一个针步数据
ctrlByte = ds16DataPtr->ctrl;
attrByte = ds16DataPtr->attr;
dx = ds16DataPtr->dx;
dy = ds16DataPtr->dy;
dr = ds16DataPtr->dr;
datposx += dx;
datposy += dy;
datposr += dr;
curx = (datposx - firstx)/unit + dpx;
cury = (datposy - firsty)/unit + dpy;
if (emb_showDirX == -1)
{
curx = width - curx;
}
if (emb_showDirY == -1)
{
cury = height - cury;
}
while(datposr >= PI10000)
{
datposr -= (PI20000-1);
}
while(datposr <= -PI10000)
{
datposr += (PI20000-1);
}
dispItem.ctrl = ctrlByte;
dispItem.attr = attrByte;
dispItem.bx = prex;
dispItem.by = prey;
dispItem.ex = curx;
dispItem.ey = cury;
dispItem.ar = curr;
memcpy(&dispItem.action,ds16DataPtr->action,sizeof(dispItem.action));
dispDat.append((char*)(&dispItem), sizeof(ViewItem));
ds16DataPtr++;
}
return dispDat;
}
//设置数据区文件头的fileid计算完以后的fileid再设置进来
void EmbData::setDsDatHeadFileID(u32 fileid)
{
if(m_pEmbDs16Head != NULL)
{
m_pEmbDs16Head->fileid = fileid;
if((u32)m_embDs16Data.size() > sizeof(DataDs16FileHead))
{
memcpy(m_embDs16Data.data(),(char*)m_pEmbDs16Head, sizeof(DataDs16FileHead));
}
}
}
//得到绝对坐标的maxXY和minXY
void EmbData::getAbsDatRangeXY()
{
m_minX = S32_MAX;
m_maxX = S32_MIN;
m_minY = S32_MAX;
m_maxY = S32_MIN;
double ax, ay;
int minx, miny, maxx, maxy;
const QByteArray & ary = m_embAbsData;
int size = ary.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return;
}
DsAbsItem * pData = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData;
//-----
minx = S32_MAX;
maxx = S32_MIN;
miny = S32_MAX;
maxy = S32_MIN;
// 数据区
for (int j = 0; j < stepsize; j++)
{
ax = absDataPtr->ax;
ay = absDataPtr->ay;
if (minx > ax) { minx = ax; }
if (maxx < ax) { maxx = ax; }
if (miny > ay) { miny = ay; }
if (maxy < ay) { maxy = ay; }
absDataPtr++;
}
if (m_minX > minx) { m_minX = minx; }
if (m_minX > maxx) { m_minX = maxx; }
if (m_maxX < minx) { m_maxX = minx; }
if (m_maxX < maxx) { m_maxX = maxx; }
if (m_minY > miny) { m_minY = miny; }
if (m_minY > maxy) { m_minY = maxy; }
if (m_maxY < miny) { m_maxY = miny; }
if (m_maxY < maxy) { m_maxY = maxy; }
qDebug() << "==========================m_minX" << m_minX;
qDebug() << "==========================m_minY" << m_minY;
qDebug() << "==========================m_maxY" << m_maxY;
qDebug() << "==========================m_maxX" << m_maxX;
}
// 添加锁针针步
///
/// \brief EmbData::addLockStitchs
/// \param mode
/// \param lockNeedles//锁针针数
/// \param lockNum//锁针次数
/// \return
///
int EmbData::addLockStitchs(u8 mode, u8 lockNeedles, u8 lockNum)
{
if (lockNeedles <= 0)
{
return -1;
}
int size = m_embAbsData.size();
if (size <= 0)
{
return -1;
}
u8 clockNeedles = lockNeedles;
// 文件头
int stepsize = (size - sizeof(DataDs16FileHead))/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("dat size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData;
QByteArray tgtdsdat; // 添加后的绝对坐标数据
tgtdsdat.clear();
tgtdsdat.append((char*)pHead, sizeof(DataDs16FileHead));
// if(mode == MODE_LOCK) //锁针 来回加固
// {
// QByteArray data = lockReinforce(lockNeedles, lockNum, absDataPtr, stepsize);
// tgtdsdat.append(data);
// }
// else if(mode == MODE_THICKEN) //密针 分割大针步
// {
// QByteArray data = thickenReinforce(lockNeedles, lockNum, absDataPtr, stepsize);
// tgtdsdat.append(data);
// }
//DsAbsItem * test = (pData + stepsize - 1);//最后一针
//DsAbsItem * test1 = pData;//第一针
int runflag = 0;
for (int j = 0; j < stepsize; j++)
{
if (absDataPtr->ctrl == DATA_SEWING || absDataPtr->ctrl == DATA_SEWING_R ||
absDataPtr->ctrl == DATA_SYNCSEW || absDataPtr->ctrl == DATA_MIRROR_SEC)//包括起针和剪线后加锁针
{
if ((runflag == 0 || runflag > 3))
{
// 添加锁针
if(mode == MODE_LOCK)//锁针方式
{
int nst = 0;
if(lockNum%2 == 0)//偶数
{
nst = 0;
}
else//奇数
{
nst = lockNeedles;
}
if(j == 0 && lockNeedles == 1)
{
nst = lockNeedles;
}
do
{
if(j + nst < stepsize)
{
DsAbsItem * nextPtr = absDataPtr+nst; // 要加锁针的点
if (nextPtr->ctrl == DATA_SEWING || nextPtr->ctrl == DATA_SEWING_R ||
nextPtr->ctrl == DATA_SYNCSEW || nextPtr->ctrl == DATA_MIRROR_SEC)
{
if(lockNum%2 == 0)//偶数锁针
{
nextPtr--;
for (int kNum = 0; kNum < lockNum; kNum++)
{
if(kNum%2 == 0)
{
for (int s = 0; s < lockNeedles; s++)
{
nextPtr++;
if(nextPtr >= pData && nextPtr < (pData + stepsize))
{
DsAbsItem nitem;
memset(&nitem,0,sizeof(DsAbsItem));
nitem.ctrl = absDataPtr->ctrl;
nitem.attr = (absDataPtr->attr | ATTR_RESEW);
nitem.ax = nextPtr->ax;
nitem.ay = nextPtr->ay;
nitem.ar = absDataPtr->ar;
tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem));
}
}
}
nextPtr++;//之前没有这一行,刘威添加
if(kNum > 0 && kNum%2 != 0)
{
for (int s = lockNeedles; s > 0; s--)
{
nextPtr--;
if(kNum == lockNum-1 && s == 1)
{
continue;//最后一次锁针的最后一步不添加
}
if((nextPtr >= pData && nextPtr < (pData + stepsize)) || j == 0)
{
DsAbsItem nitem;
memset(&nitem,0,sizeof(DsAbsItem));
nitem.ctrl = absDataPtr->ctrl;
nitem.attr = (absDataPtr->attr | ATTR_RESEW);
nitem.ax = nextPtr->ax;
nitem.ay = nextPtr->ay;
nitem.ar = absDataPtr->ar;
tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem));
}
}
}
}
}
else//奇数锁针
{
{
nextPtr--;
if(nextPtr >= pData && nextPtr < (pData + stepsize))
{
DsAbsItem nitem;
memset(&nitem,0,sizeof(DsAbsItem));
nitem.ctrl = DATA_OFFSET;//第一针步转换为跨步
nitem.attr = absDataPtr->attr;
nitem.ax = nextPtr->ax;
nitem.ay = nextPtr->ay;
nitem.ar = absDataPtr->ar;
tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem));
}
nextPtr++;//之前这一行为nextPtr--,刘威修改
}
for (int k = 0; k < lockNum; k++)
{
if(k%2 == 0)//偶数
{
for (int s = lockNeedles; s > 0; s--)
{
if (nextPtr >= pData && nextPtr < (pData + stepsize))
{
DsAbsItem nitem;
memset(&nitem,0,sizeof(DsAbsItem));
nitem.ctrl = absDataPtr->ctrl;
nitem.attr = (absDataPtr->attr | ATTR_RESEW);
nitem.ax = nextPtr->ax;
nitem.ay = nextPtr->ay;
nitem.ar = absDataPtr->ar;
tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem));
}
nextPtr--;
}
nextPtr++;
}
if(k > 0 && k%2 != 0)//奇数
{
for (int s = 0; s < lockNeedles; s++)
{
nextPtr++;
if(nextPtr >= pData && nextPtr < (pData + stepsize))
{
DsAbsItem nitem;
memset(&nitem,0,sizeof(DsAbsItem));
nitem.ctrl = absDataPtr->ctrl;
nitem.attr = absDataPtr->attr | ATTR_RESEW;
nitem.ax = nextPtr->ax;
nitem.ay = nextPtr->ay;
nitem.ar = absDataPtr->ar;
tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem));
}
}
nextPtr--;
}
}
}
break;
}
else
{
break;
}
}
else
{
break;
}
}while(1);
}
else if(mode == MODE_THICKEN)//密针方式
{
tgtdsdat.append((char*)absDataPtr, sizeof(DsAbsItem));
s16 nNum = 0;
if(lockNum == 0)//如果锁针次数为0时第一针锁针次数就是锁针针数
{
nNum = lockNeedles+1;
}
else
{
nNum = lockNum+1;
}
do
{
if(j < stepsize)
{
DsAbsItem * nextPtr = absDataPtr; // 下一个点
if (nextPtr->ctrl == DATA_SEWING || nextPtr->ctrl == DATA_SEWING_R || nextPtr->ctrl == DATA_SYNCSEW || nextPtr->ctrl == DATA_MIRROR_SEC)
{
DsAbsItem nitem;
memset(&nitem,0,sizeof(DsAbsItem));
DsAbsItem * prePtr = absDataPtr;
for (int s = 0; s < clockNeedles; s++)
{
double dx = nextPtr->ax - prePtr->ax;
double dy = nextPtr->ay - prePtr->ay;
double len = sqrt(dx*dx + dy*dy);
if (len <= 0)
{
prePtr = nextPtr;
nextPtr++;
clockNeedles++;
if(nextPtr >= (pData + stepsize))
{
break;
}
continue;
}
if(prePtr >= pData && prePtr < (pData + stepsize))
{
double dLen = len / nNum;
double axbase = prePtr->ax;
double aybase = prePtr->ay;
for (int k = 0; k < nNum; k++)
{
double nax = dx * dLen / len + axbase;
double nay = dy * dLen / len + aybase;
nitem.ctrl = absDataPtr->ctrl;
nitem.attr = (absDataPtr->attr | ATTR_RESEW);
nitem.ax = nax;
nitem.ay = nay;
nitem.ar = absDataPtr->ar;
tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem));
axbase = nax;
aybase = nay;
}
if(lockNum == 0)
{
nNum--;
}
}
prePtr = nextPtr;
nextPtr++;
}
clockNeedles = lockNeedles;
break;
}
else
{
break;
}
}
else
{
break;
}
}while(1);
for (int s = 0; s < lockNeedles; s++)//跳到不加锁针的那一针
{
absDataPtr++;
j++;
}
}
runflag = 1;
}
}
else if (absDataPtr->ctrl == DATA_CUTTRD || absDataPtr->ctrl == DATA_CUTTER_SEC || absDataPtr->ctrl == DATA_SYNC_CUTTER)
{
runflag = 10;
}
else
{
runflag = 0;
}
DsAbsItem * prePtrstep = absDataPtr-1; // 上一个点
//加锁针
if (absDataPtr->ctrl == DATA_END
|| absDataPtr->ctrl == DATA_NULL
|| j == stepsize - 1
//当前点不为缝纫,上一个点为缝纫
//适用于双头或四头绗缝机++++++
|| ((prePtrstep->ctrl == DATA_SEWING) &&
(absDataPtr->ctrl != DATA_SEWING && absDataPtr->ctrl != DATA_SYNCSEW && absDataPtr->ctrl != DATA_MIRROR_SEC) && prePtrstep > pData)
|| ((prePtrstep->ctrl == DATA_SEWING_R) &&
(absDataPtr->ctrl != DATA_SEWING_R && absDataPtr->ctrl != DATA_SYNCSEW && absDataPtr->ctrl != DATA_MIRROR_SEC) && prePtrstep > pData)
|| ((prePtrstep->ctrl == DATA_MIRROR_SEC) &&
(absDataPtr->ctrl != DATA_SEWING && absDataPtr->ctrl != DATA_SEWING_R && absDataPtr->ctrl != DATA_SYNCSEW && absDataPtr->ctrl != DATA_MIRROR_SEC) && prePtrstep > pData)
|| ((prePtrstep->ctrl == DATA_SYNCSEW) &&
(absDataPtr->ctrl != DATA_SEWING && absDataPtr->ctrl != DATA_SEWING_R && absDataPtr->ctrl != DATA_SYNCSEW && absDataPtr->ctrl != DATA_MIRROR_SEC) && prePtrstep > pData)
//适用于双头或四头绗缝机++++++
|| absDataPtr->ctrl == DATA_CUTTRD
|| absDataPtr->ctrl == DATA_CUTTER_SEC
|| absDataPtr->ctrl == DATA_SYNC_CUTTER)
{
int m = 1;
//结束前或剪线前加锁针
DsAbsItem * prePtr = absDataPtr-1; // 上一个点
u8 ctl = prePtr->ctrl;
//如果结束前为剪线则不加锁针了,因为剪线前已经加了锁针
if((ctl == DATA_CUTTRD || ctl == DATA_CUTTER_SEC || ctl == DATA_SYNC_CUTTER) &&
(absDataPtr->ctrl == DATA_NULL || absDataPtr->ctrl == DATA_END))
{
tgtdsdat.append((char*)absDataPtr, sizeof(DsAbsItem));
absDataPtr++;
continue;
}
//如果第二机头剪线前为第一机头剪线,则不加锁针,因为第一机头剪线前已经加了锁针
if(ctl == DATA_CUTTRD && absDataPtr->ctrl == DATA_CUTTER_SEC)
{
tgtdsdat.append((char*)absDataPtr, sizeof(DsAbsItem));
absDataPtr++;
continue;
}
//如果同步剪线前为第一机头剪线或第二机头剪线,则不加锁针,因为之前已经加了锁针
if(ctl == DATA_SYNC_CUTTER && (absDataPtr->ctrl == DATA_CUTTRD || absDataPtr->ctrl == DATA_CUTTER_SEC))
{
tgtdsdat.append((char*)absDataPtr, sizeof(DsAbsItem));
absDataPtr++;
continue;
}
//为缝纫或双机头同步缝纫或双机头镜像缝纫(双头组合机型是有后两种)
while(ctl != DATA_SEWING && ctl != DATA_SEWING_R && ctl != DATA_SYNCSEW && ctl != DATA_MIRROR_SEC && ctl != DATA_DRAWING)
{
prePtr--;
if(prePtr < pData)//越界起始地址 2025.4.22 ls
{
return -1;
}
m++;
ctl = prePtr->ctrl;
}
// 添加锁针
int nst = 1;
int addIdx = m+1;
if(mode == MODE_LOCK)//锁针方式
{
do
{
if(j-m-nst > 0)
{
DsAbsItem * lockPtr = prePtr; // 要加锁针的点
if (lockPtr->ctrl == DATA_SEWING || lockPtr->ctrl == DATA_SEWING_R || lockPtr->ctrl == DATA_SYNCSEW || lockPtr->ctrl == DATA_MIRROR_SEC)
{
for (int k = 0; k < lockNum; k++)
{
if(k%2 == 0)
{
for (int s = lockNeedles; s > 0; s--)
{
lockPtr--;
if(lockPtr >= pData && lockPtr < (pData + stepsize))//越界起始地址 2025.4.22 ls
{
DsAbsItem nitem;
memset(&nitem,0,sizeof(DsAbsItem));
nitem.ctrl = prePtr->ctrl;
nitem.attr = (absDataPtr->attr | ATTR_RESEW);
nitem.ax = lockPtr->ax;
nitem.ay = lockPtr->ay;
nitem.ar = prePtr->ar;
// if((int)(tgtdsdat.size()-addIdx*sizeof(DsAbsItem)) < tgtdsdat.size())
// {
// tgtdsdat.insert((tgtdsdat.size()-addIdx*sizeof(DsAbsItem)),(char*)(&nitem), sizeof(DsAbsItem));
// addIdx++;
// }
tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem));
}
}
}
if(k > 0 && k%2 != 0)
{
for (int s = 0; s < lockNeedles; s++)
{
lockPtr++;
if(lockPtr >= pData && lockPtr < (pData + stepsize))
{
DsAbsItem nitem;
memset(&nitem,0,sizeof(DsAbsItem));
nitem.ctrl = prePtr->ctrl;
nitem.attr = (absDataPtr->attr | ATTR_RESEW);
nitem.ax = lockPtr->ax;
nitem.ay = lockPtr->ay;
nitem.ar = prePtr->ar;
// if((int)(tgtdsdat.size()-addIdx*sizeof(DsAbsItem)) < tgtdsdat.size())
// {
// tgtdsdat.insert((tgtdsdat.size()-addIdx*sizeof(DsAbsItem)),(char*)(&nitem), sizeof(DsAbsItem));
// addIdx++;
// }
tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem));
}
}
}
}
break;
}
else
{
break;
}
}
else
{
break;
}
}while(1);
}
else if(mode == MODE_THICKEN)//密针方式
{
addIdx += 1;
nst = lockNeedles;
DsAbsItem * ptr = prePtr-lockNeedles; // 加锁针点
while(ptr->ctrl != DATA_SEWING && ptr->ctrl != DATA_SEWING_R && ptr->ctrl != DATA_SYNCSEW && ptr->ctrl != DATA_MIRROR_SEC)
{
ptr++;
lockNeedles--;
addIdx--;
if(ptr >= (pData + stepsize) || lockNeedles <= 0)
{
break;
}
}
//去除要加密针的已添加的针步
tgtdsdat.remove(tgtdsdat.size() - lockNeedles*sizeof(DsAbsItem),lockNeedles*sizeof(DsAbsItem));
s16 nNum = 0;
if(lockNum == 0)//如果锁针次数为0时第一针锁针次数就是锁针针数
{
nNum = lockNeedles+1;
}
else
{
nNum = lockNum+1;
}
do
{
if(j-m-nst > 0)
{
DsAbsItem * lockPtr = prePtr-lockNeedles; // 加锁针点
addIdx -= lockNeedles;
if(lockPtr < pData)//越界起始地址
{
return -1;
}
//为缝纫或双机头同步缝纫或双机头镜像缝纫(双头组合机型是有后两种)
if (lockPtr->ctrl == DATA_SEWING || lockPtr->ctrl == DATA_SEWING_R || lockPtr->ctrl == DATA_SYNCSEW || lockPtr->ctrl == DATA_MIRROR_SEC)
{
for (int s = 0; s < lockNeedles; s++)
{
DsAbsItem * nextPtr = lockPtr+1;
if(nextPtr > (pData + (stepsize-1)))
{
return -1;
}
double dx = nextPtr->ax - lockPtr->ax;
double dy = nextPtr->ay - lockPtr->ay;
double len = sqrt(dx*dx + dy*dy);
if (len <= 0)
{
if(lockNum == 0)
{
nNum--;
}
lockPtr++;
addIdx++;
if(lockPtr > (pData + (stepsize-1)))
{
return -1;
}
if (lockPtr->ctrl != DATA_SEWING && lockPtr->ctrl != DATA_SEWING_R && lockPtr->ctrl != DATA_SYNCSEW && lockPtr->ctrl != DATA_MIRROR_SEC)
{
break;
}
continue;
}
double dLen = len / nNum;
double axbase = lockPtr->ax;
double aybase = lockPtr->ay;
for (int k = 0; k < nNum; k++)
{
double nax = dx * dLen / len + axbase;
double nay = dy * dLen / len + aybase;
DsAbsItem nitem;
memset(&nitem,0,sizeof(DsAbsItem));
nitem.ctrl = prePtr->ctrl;
nitem.attr = absDataPtr->attr | ATTR_RESEW;
nitem.ax = nax;
nitem.ay = nay;
nitem.ar = prePtr->ar;
tgtdsdat.append((char*)(&nitem), sizeof(DsAbsItem));
axbase = nax;
aybase = nay;
}
if(lockNum == 0)
{
nNum--;
}
lockPtr++;
if (lockPtr->ctrl != DATA_SEWING && lockPtr->ctrl != DATA_SEWING_R && lockPtr->ctrl != DATA_SYNCSEW && lockPtr->ctrl != DATA_MIRROR_SEC)
{
break;
}
}
break;
}
else
{
lockPtr++;
lockNeedles -= 1;
if(lockNeedles <= 0 || lockPtr >= (pData + stepsize))
{
break;
}
}
}
else
{
break;
}
}while(1);
}
}
tgtdsdat.append((char*)absDataPtr, sizeof(DsAbsItem));
absDataPtr++;
}
m_embAbsData.clear();
m_embAbsData = tgtdsdat;
m_editedflag = 1;
return 0;
}
//锁针加固方式
///
/// \brief EmbData::lockReinforce
/// \param needles 针数
/// \param num 次数
/// \param absDataPtr
/// \param stepSize
/// \return
///
QByteArray EmbData::lockReinforce(u8 needles, u8 num, DsAbsItem *absDataPtr, int stepSize)
{
QByteArray result;
for(int i = 0; i < stepSize-1; i++)
{
bool isNeedOriginPoint = true;
do
{
if(needles == 0 || num == 0)
{
break;
}
//加固条件,此针为缝纫并且 第一针或者上一针不是缝纫
if(absDataPtr->ctrl == DATA_SEWING)
{
//第一针
if(i==0)
{
if(num%2 == 0)//偶数次 从起始点开始
{
evenNumberAddLock(result, absDataPtr, needles, num);
}
else //奇数次
{
oddNumberAddLock(result, absDataPtr, needles, num);
}
}
//上一针不是缝纫针步 线断起始加固
else if((absDataPtr-1)->ctrl != DATA_SEWING)
{
if(num%2 == 0)//偶数次 从起始点开始
{
evenNumberAddLock(result, absDataPtr - 1, needles, num);
addResew(result, absDataPtr - 1, DATA_SEWING);
isNeedOriginPoint = false;
}
else //奇数次 从中间点点开始
{
//把上一针删了
result.remove(result.size() - sizeof(DsAbsItem), sizeof(DsAbsItem));
oddNumberAddLock(result, absDataPtr - 1, needles, num);
addResew(result, absDataPtr - 1, DATA_SEWING);
isNeedOriginPoint = false;
}
}
//下一针不为缝纫 结尾加固
else if(i < stepSize-1 && (absDataPtr+1)->ctrl != DATA_SEWING)
{
}
else
{
break;
}
}
break;
}
while(0);
if(isNeedOriginPoint)
addResew(result, absDataPtr, absDataPtr->ctrl, false);
absDataPtr++;
}
return result;
}
//密针加固方式
QByteArray EmbData::thickenReinforce(u8 needles, u8 num, DsAbsItem *absDataPtr, int stepSize)
{
if(needles == 0 && num == 0){}//为了去掉编译警告
QByteArray result;
for(int i = 0; i < stepSize; i++)
{
absDataPtr++;
}
return result;
}
//加回针或者锁针
void EmbData::addResew(QByteArray &data, DsAbsItem *ptr, u8 ctrl ,bool resewFlag)
{
DsAbsItem item;
memset(&item,0,sizeof(DsAbsItem));
item.ctrl = ctrl;
item.ax = ptr->ax;
item.ay = ptr->ay;
item.ar = ptr->ar;
if(resewFlag)
item.attr = ptr->attr | ATTR_RESEW;
else
item.attr = ptr->attr;
data.append((char*)(&item), sizeof(DsAbsItem));
}
void EmbData::evenNumberAddLock(QByteArray &data, DsAbsItem *absDataPtr,int lockNeedles, int num)
{
if(num < 0 || num % 2 !=0)
{
return;
}
QList<DsAbsItem *> listPoint;
//添加原点
DsAbsItem * dataPtr = absDataPtr;
if(DATA_SEWING == absDataPtr->ctrl) //第一针
{
addResew(data, dataPtr, dataPtr->ctrl);
}
//记录要添加的点
for(int j = 0; j < lockNeedles; j++)
{
dataPtr++;
listPoint.append(dataPtr);
}
//循环添加
for(int count = num/2; count > 0; count--)
{
//正向添加
for(DsAbsItem * ptr : listPoint)
{
addResew(data, ptr, DATA_SEWING);
}
//反向加回
for(int k = listPoint.size(); k > 0; k--)
{
//端点不加 因为正向的时候加过了
if(k == listPoint.size())
continue;
DsAbsItem * ptr = listPoint.at(k-1);
addResew(data, ptr, DATA_SEWING);
}
if(count > 1)
addResew(data, absDataPtr, DATA_SEWING);
}
}
void EmbData::oddNumberAddLock(QByteArray &data, DsAbsItem *absDataPtr, int lockNeedles, int num)
{
QList<DsAbsItem *> listPoint;
DsAbsItem * dataPtr = absDataPtr;
if(absDataPtr->ctrl != DATA_SEWING)
{
dataPtr --;
}
//记录要添加的点
for(int j = 0; j < lockNeedles; j++)
{
dataPtr++;
listPoint.append(dataPtr);
}
if(absDataPtr->ctrl != DATA_SEWING)
{
addResew(data, dataPtr++, absDataPtr->ctrl, true);
absDataPtr--;
}
//反向加回
for(int k = listPoint.size(); k > 0; k--)
{
DsAbsItem * ptr = listPoint.at(k-1);
addResew(data, ptr, DATA_SEWING, true);
}
//此时可以当作偶数处理
int tempNum = num - 1;
evenNumberAddLock(data, absDataPtr, lockNeedles, tempNum);
}
//角度修正
int EmbData::angleCorrection(s16 oft)
{
if (oft == 0)
{
return 0;
}
double dx, dy, dr;
double ax, ay, ar;
double bdx, bdy;
bdx = bdy = 0;
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
DsAbsItem * secondPtr = NULL;//第二个点坐标指针
double addx,addy;
addx = addy = 0;
double s = 0;
int firstY = 0;//花样第一点坐标
// 数据区
for (int j = 0; j < stepsize; j++)
{
if (j == 0)//第一针
{
dx = absDataPtr->ax;
dy = absDataPtr->ay;
dr = absDataPtr->ar;
firstY = absDataPtr->ay;
}
else
{
dx = absDataPtr->ax - ax;
dy = absDataPtr->ay - ay;
dr = absDataPtr->ar - ar;
}
if (j == 1)//第二针
{
secondPtr = absDataPtr;
}
//判断夹角是否大于60度
if(dr >= ANGLECORR || dr <= -ANGLECORR || j == stepsize - 1)
{
s = sqrt(bdx*bdx + bdy*bdy);
if(s == 0)
{
addx = 0;
addy = 0;
}
else
{
addx = bdx*oft/s;
addy = bdy*oft/s;
m_endPosX = addx;
m_endPosY = addy;
}
absDataPtr--;
if(absDataPtr->ctrl == DATA_SEWING)
{
absDataPtr->ax += addx;
absDataPtr->ay += addy;
}
absDataPtr++;
}
ax = absDataPtr->ax;
ay = absDataPtr->ay;
ar = absDataPtr->ar;
bdx = dx;
bdy = dy;
absDataPtr++;
}
DsAbsItem *datItem = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead)+sizeof(DsAbsItem)*(stepsize-1));
DsAbsItem insertItem;
memcpy(&insertItem,datItem,sizeof(DsAbsItem));
int mdy = secondPtr->ay - firstY;
double modY = datItem->ay + mdy;
insertItem.ctrl = DATA_SEWING;
double tar = atan2((modY-datItem->ay),(secondPtr->ax-datItem->ax));
insertItem.ar = (tar * 10000+0.5*(tar>0?1:-1));
insertItem.ax = secondPtr->ax;
insertItem.ay = modY;
m_embAbsData.insert(sizeof(DataDs16FileHead)+sizeof(DsAbsItem)*(stepsize-1),(char*)(&insertItem),sizeof(DsAbsItem));//插入回针
m_embAbsData.remove(sizeof(DataDs16FileHead),sizeof(DsAbsItem));//去掉第一针
//重新计算角度
size = m_embAbsData.size();
datasize = size - sizeof(DataDs16FileHead);
stepsize = datasize/sizeof(DsAbsItem);
DsAbsItem * ptr = (DsAbsItem *)(m_embAbsData.data()+sizeof(DataDs16FileHead));
double prex = 0;
double prey = 0;
double curx = 0;
double cury = 0;
double ddx = 0;
double ddy = 0;
for(int i = 0; i < stepsize; i++)
{
curx = ptr->ax;
cury = ptr->ay;
ddx = curx - prex;
ddy = cury - prey;
double tar = atan2(ddy,ddx);
ptr->ar = (tar * 10000+0.5*(tar>0?1:-1));
prex = curx;
prey = cury;
ptr++;
}
return 1;
}
int EmbData::angleCorrectionXY(s32 px, s32 nx, s32 py, s32 ny)
{
if(px == 0 && nx == 0 && py == 0 && ny == 0)
{
return -1;
}
double dx, dy, dr;
double ax, ay, ar;
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
QByteArray ary;
ary.clear();
DataDs16FileHead *head = (DataDs16FileHead *)m_embAbsData.data();
ary.append((char*)head,sizeof(DataDs16FileHead));
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
//记录第一个点的绝对坐标值
DsAbsItem firstAbsDataPtr;
memcpy(&firstAbsDataPtr,(char*)pData,sizeof(DsAbsItem));
//记录第二个点的绝对坐标值
DsAbsItem secAbsDataPtr;
// 过滤掉坐标值及属性相同的针步,只留一个,避免空针(不拟合针步时空针会使补偿异常)
DsAbsItem * lstAbsDataPtr = absDataPtr;
for (int j = 0; j < stepsize; j++)
{
if(j == 0)
{
//注释掉这行代码,为了去掉第一针,为了结束时加补偿,再缝下一个图元时能直接回到第二个点,而不是第一个点,只有缝制第一个图元时会少一针,其他地方正常,没有影响
//ary.append((char*)absDataPtr,sizeof(DsAbsItem));
}
else
{
if(lstAbsDataPtr->ax == absDataPtr->ax && lstAbsDataPtr->ay == absDataPtr->ay &&
lstAbsDataPtr->ctrl == absDataPtr->ctrl && lstAbsDataPtr->attr == absDataPtr->attr &&
lstAbsDataPtr->action == absDataPtr->action)
{
}
else
{
ary.append((char*)absDataPtr,sizeof(DsAbsItem));
}
}
if(j == 1)
{
secAbsDataPtr.ax = absDataPtr->ax;
secAbsDataPtr.ay = absDataPtr->ay;
}
lstAbsDataPtr = absDataPtr;
absDataPtr++;
}
m_embAbsData.clear();
m_embAbsData.append(ary);
size = m_embAbsData.size();
datasize = size - sizeof(DataDs16FileHead);
stepsize = datasize/sizeof(DsAbsItem);
pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
absDataPtr = pData; //中间数据针步
ary.clear();
head = (DataDs16FileHead *)(m_embAbsData.data());
ary.append((char*)head,sizeof(DataDs16FileHead));
double addx,addy;
addx = addy = 0;
int maxX = S32_MIN;
int maxY = S32_MIN;
int minY = S32_MAX;
int minX = S32_MAX;
// 数据区
for (int j = 0; j < stepsize; j++)
{
if (j == 0)//第一针
{
dx = absDataPtr->ax;
dy = absDataPtr->ay;
dr = absDataPtr->ar;
}
else
{
dx = absDataPtr->ax - ax;
dy = absDataPtr->ay - ay;
dr = absDataPtr->ar - ar;
}
if (absDataPtr->ax > maxX)
{
maxX = absDataPtr->ax;
}
if (absDataPtr->ax < minX)
{
minX = absDataPtr->ax;
}
if (absDataPtr->ay > maxY)
{
maxY = absDataPtr->ay;
}
if (absDataPtr->ay < minY)
{
minY = absDataPtr->ay;
}
//判断夹角是否大于60度或小于-60度
if(dr >= ANGLECORR || dr <= -ANGLECORR)
{
if(dx > 0)
{
addx = 0 - nx;
}
else if(dx == 0)
{
DsAbsItem * prePtr = absDataPtr-1;
double prex = prePtr->ax;
while(prex == absDataPtr->ax)
{
prePtr--;
prex = prePtr->ax;
if(prePtr == pData)
{
break;
}
}
double cx = prex - absDataPtr->ax;
if(cx < 0)
{
addx = px;
}
else
{
addx = 0 - nx;
}
}
else
{
addx = px;
}
if(dy > 0)
{
addy = py;
}
else if(dy == 0)
{
DsAbsItem * prePtr = absDataPtr-1;
double prey = prePtr->ay;
while(prey == absDataPtr->ay)
{
prePtr--;
prey = prePtr->ay;
if(prePtr == pData)
{
break;
}
}
double cy = prey - absDataPtr->ay;
if(cy < 0)
{
addy = py;
}
else
{
addy = 0 - ny;
}
}
else
{
addy = 0 - ny;
}
absDataPtr--;
// int ccx = absDataPtr->ax;
// int ccy = absDataPtr->ay;
// DsAbsItem * temp = absDataPtr - 1;
// ccx = ccx - temp->ax;
// ccy = ccy - temp->ay;
// addx += ccx;
// addy += ccy;
if(absDataPtr->ctrl == DATA_SEWING)
{
// absDataPtr->ax += addx;
// absDataPtr->ay += addy;
DsAbsItem item;
memcpy((char*)&item,(char*)absDataPtr,sizeof(DsAbsItem));
double xyLen = sqrt((addx/100.0*addx/100.0)*10000.0+ (addy/100.0*addy/100.0)*10000.0);
if(xyLen > 200)//大于2毫米
{
double dx{0},dy{0};
double cdx{0},cdy{0};
//分割针步
double splitVal = 200.0;//分割针步为200
s32 stepNum = xyLen / splitVal;//拆分几步
double lastStep = (double)((int)xyLen % (int)splitVal);
double addStep = lastStep / stepNum;
for(int m = 0; m < stepNum; m++)
{
double stepX = 0;
double stepY = 0;
stepX = addx * splitVal / xyLen + addx * addStep / xyLen;
stepY = addy * splitVal / xyLen + addy * addStep / xyLen;
dx = qRound(stepX);//四舍五入
dy = qRound(stepY);
if (m == stepNum-1)
{
//最后一针,消除累计误差
dx = addx - cdx;
dy = addy - cdy;
}
cdx += dx;
cdy += dy;
// item.ax = temp->ax + cdx;
// item.ay = temp->ay + cdy;
item.ax = absDataPtr->ax + cdx;
item.ay = absDataPtr->ay + cdy;
int rsize = ary.size();
DsAbsItem tmp;
memcpy(&tmp,ary.data()+rsize-sizeof(DsAbsItem),sizeof(DsAbsItem));
// if(m == 0)
// {
// ary.remove(rsize-sizeof(DsAbsItem),sizeof(DsAbsItem));
// }
ary.append((char*)&item,sizeof(DsAbsItem));
}
}
else
{
item.ax = absDataPtr->ax + addx;
item.ay = absDataPtr->ay + addy;
// int rsize = ary.size();
// ary.remove(rsize-sizeof(DsAbsItem),sizeof(DsAbsItem));
ary.append((char*)&item,sizeof(DsAbsItem));
}
}
absDataPtr++;
}
ax = absDataPtr->ax;
ay = absDataPtr->ay;
ar = absDataPtr->ar;
ary.append((char*)absDataPtr,sizeof(DsAbsItem));
absDataPtr++;
}
DsAbsItem *tempPtr = (DsAbsItem *)(ary.data() + ary.size() - sizeof(DsAbsItem));
//让结束后再回到起点位置上,避免越缝越偏
DsAbsItem addPtr;
memcpy(&addPtr,&firstAbsDataPtr,sizeof(DsAbsItem));
addPtr.ax = tempPtr->ax + (secAbsDataPtr.ax - firstAbsDataPtr.ax);
addPtr.ay = tempPtr->ay + (secAbsDataPtr.ay - firstAbsDataPtr.ay);
pData = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead));
int idx = 0;
while(tempPtr->ctrl != DATA_SEWING)
{
tempPtr--;
if(tempPtr == pData)
{
return -1;
}
idx++;
}
ary.insert(ary.size() - sizeof(DsAbsItem)*idx, (char*)&addPtr, sizeof(DsAbsItem));
m_embAbsData.clear();
m_embAbsData.append(ary);
//重新计算角度
size = m_embAbsData.size();
datasize = size - sizeof(DataDs16FileHead);
stepsize = datasize/sizeof(DsAbsItem);
DsAbsItem * ptr = (DsAbsItem *)(m_embAbsData.data()+sizeof(DataDs16FileHead));
double prex = 0;
double prey = 0;
double curx = 0;
double cury = 0;
double ddx = 0;
double ddy = 0;
for(int i = 0; i < stepsize; i++)
{
curx = ptr->ax;
cury = ptr->ay;
ddx = curx - prex;
ddy = cury - prey;
double tar = atan2(ddy,ddx);
ptr->ar = (tar * 10000+0.5*(tar>0?1:-1));
prex = curx;
prey = cury;
ptr++;
}
return 0;
}
//按固定针步重新拟合(用户可设置的参数,暂未用到)
void EmbData::reFitByStep(s32 stepLen)
{
QList<LineItem> lineList;
lineList.clear();
int stepLength = stepLen;//参数(300-800 单位0.01mm)
LineItem item;
item.absItemList.clear();
int dr = 0;
unsigned char ctrl;
double prer = 0;
double ax, ay, ar;
ax = ay = ar = 0;
DsAbsItem absItem;
memset(&absItem,0,sizeof(DsAbsItem));
//添加线段集合(夹角大于某个值时为新的一段线段)
int datasize = m_embAbsData.size() - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
return;
}
int stepsize = datasize/sizeof(DsAbsItem);
DsAbsItem * dataBeg = (DsAbsItem *)(m_embAbsData.data()+sizeof(DataDs16FileHead));
prer = dataBeg->ar;
for (int i = 0; i < stepsize; i++)
{
ctrl = dataBeg->ctrl;
dr = dataBeg->ar - prer;
unsigned char nctrl,bctrl;
if(i == stepsize-1)
{
nctrl = ctrl;
}
else
{
dataBeg++;
nctrl = dataBeg->ctrl;//下一针步属性
dataBeg--;
}
if(i == 0)
{
bctrl = ctrl;
}
else
{
dataBeg--;
bctrl = dataBeg->ctrl;//上一针步属性
dataBeg++;
}
if(ctrl != DATA_SEWING)
{
item.absItemList.append(*dataBeg);
}
//上一针非缝纫属性且当前针为缝纫属性
if(bctrl != DATA_SEWING && ctrl == DATA_SEWING)
{
lineList.append(item);
item.absItemList.clear();
item.absItemList.append(*dataBeg);
}
//下一针非缝纫针步与当前针为缝纫针步
else if(nctrl != DATA_SEWING && ctrl == DATA_SEWING)
{
lineList.append(item);
item.absItemList.clear();
item.absItemList.append(*dataBeg);
}
//上一针为缝纫针步与当前针非缝纫针步
else if(bctrl == DATA_SEWING && ctrl != DATA_SEWING)
{
lineList.append(item);
item.absItemList.clear();
item.absItemList.append(*dataBeg);
}
//下一针为缝纫针步与当前针非缝纫针步
else if(nctrl == DATA_SEWING && ctrl != DATA_SEWING)
{
lineList.append(item);
item.absItemList.clear();
item.absItemList.append(*dataBeg);
}
else if(ctrl == DATA_SEWING)
{
double angle = dr / 10000.0 * (180.0 / PI);
if(angle > 30 || angle < -30)//新的一条线段(30度为分界)
{
lineList.append(item);
item.absItemList.clear();
item.absItemList.append(*dataBeg);
}
else
{
item.absItemList.append(*dataBeg);
}
}
prer = dataBeg->ar;
dataBeg++;
}
//开始重置针步(绝对坐标的线段集合)
QByteArray nabsData;
nabsData.clear();
double cx,cy,cr;
cx = cy = cr = 0;
int lSize = lineList.size();
for(int j = 0; j < lSize; j++)
{
int pSize = lineList[j].absItemList.size();
for(int m = 0; m < pSize; m++)
{
memset(&absItem,0,sizeof(DsAbsItem));
absItem = lineList[j].absItemList[m];
ctrl = absItem.ctrl;
//absItem.ax = absItem.ax - minX;
//absItem.ay = absItem.ay - minY;
ax = absItem.ax;
ay = absItem.ay;
ar = absItem.ar;
if(ctrl != DATA_SEWING)
{
nabsData.append((char*)&absItem,sizeof(DsAbsItem));
continue;
}
if(m == 0)
{
cx = ax;
cy = ay;
nabsData.append((char*)&absItem,sizeof(DsAbsItem));
}
if(m == pSize - 1 && pSize > 1)
{
//最后一步如果超出长度就均分
int pos = nabsData.size()-sizeof(DsAbsItem);
DsAbsItem * litem = (DsAbsItem *)((nabsData.data()+pos));
double curX = absItem.ax;
double curY = absItem.ay;
double preX = litem->ax;
double preY = litem->ay;
double ldis = sqrt(((curX-preX)/100.0*(curX-preX)/100.0)*10000.0+((curY-preY)/100.0*(curY-preY)/100.0)*10000.0);
if(ldis > stepLength)
{
DsAbsItem addItem;
memset(&addItem,0,sizeof(DsAbsItem));
addItem = absItem;
if(litem->ay == absItem.ay)//y相同
{
addItem.ay = absItem.ay;
addItem.ax = (absItem.ax+litem->ax)/2;
nabsData.append((char*)&addItem,sizeof(DsAbsItem));
nabsData.append((char*)&absItem,sizeof(DsAbsItem));
break;
}
else if(litem->ax == absItem.ax)//x相同
{
addItem.ax = absItem.ax;
addItem.ay = (absItem.ay+litem->ay)/2;
nabsData.append((char*)&addItem,sizeof(DsAbsItem));
nabsData.append((char*)&absItem,sizeof(DsAbsItem));
break;
}
else
{
double k = ((double)(absItem.ay-litem->ay))/((double)(absItem.ax-litem->ay));
double cdis = ldis / 2;
double r = atan(k);
double x = cdis * cos(r);
double y = cdis * sin(r);
addItem.ax = litem->ax + x;
addItem.ay = litem->ay + y;
nabsData.append((char*)&addItem,sizeof(DsAbsItem));
nabsData.append((char*)&absItem,sizeof(DsAbsItem));
break;
}
}
else
{
nabsData.append((char*)&absItem,sizeof(DsAbsItem));
break;
}
}
double dis = sqrt(((ax-cx)/100.0*(ax-cx)/100.0)*10000.0+((ay-cy)/100.0*(ay-cy)/100.0)*10000.0);
while(dis > stepLength)
{
QPoint firstPoint(0,0);//直线第一个点
if((m-1) >= 0)
{
// firstPoint.setX(lineList[j].absItemList[m-1].ax-minX);
// firstPoint.setY(lineList[j].absItemList[m-1].ay-minY);
firstPoint.setX(lineList[j].absItemList[m-1].ax);
firstPoint.setY(lineList[j].absItemList[m-1].ay);
}
QPoint secondPoint;//直线第二个点
secondPoint.setX(ax);
secondPoint.setY(ay);
QPoint circlePoint;//圆心
circlePoint.setX(cx);
circlePoint.setY(cy);
QPoint p;
if(secondPoint.x()-firstPoint.x() == 0)
{
p.setX(secondPoint.x());
//int y = (secondPoint.y()/stepLength)*stepLength;
//int y = (secondPoint.y()+firstPoint.y())/2;
//取出上一点的坐标
int pos = nabsData.size()-sizeof(DsAbsItem);
DsAbsItem * litem = (DsAbsItem *)((nabsData.data()+pos));
int y = 0;
if(litem->ay >= secondPoint.y())
{
y = litem->ay - stepLength;
}
else
{
y = litem->ay + stepLength;
}
p.setY(y);
cx = p.x();
cy = p.y();
if(cx < 0 || cy < 0)
{
//qDebug()<<j<<m<<cx<<cy;
}
absItem.ax = cx;
absItem.ay = cy;
nabsData.append((char*)&absItem,sizeof(DsAbsItem));
dis = sqrt(((ax-cx)/100.0*(ax-cx)/100.0)*10000.0+((ay-cy)/100.0*(ay-cy)/100.0)*10000.0);
}
else
{
//(x - cx )^2 + (y - cy)^2 = r^2
//y = kx +b
// 求得直线方程
double k = ((double)(secondPoint.y()-firstPoint.y()))/(secondPoint.x()-firstPoint.x());
double b = firstPoint.y()-k*firstPoint.x();
// 列方程
//(1 + k^2)*x^2 - x*(2*cx -2*k*(b -cy) ) + cx*cx + ( b - cy)*(b - cy) - r*r = 0
int x1,y1,x2,y2;
double c = (circlePoint.x()/100.0)*(circlePoint.x()/100.0)*10000.0+((b-circlePoint.y())/100.0)*((b-circlePoint.y())/100.0)*10000.0-stepLength*stepLength;
double a = (1+k*k);
double b1 = 2*circlePoint.x()-2*k*(b-circlePoint.y());
// 得到下面的简化方程
// a*x^2 - b1*x + c = 0;
double sval = (b1/100.0)*(b1/100.0)*10000.0-4*a*c;
if(sval < 0)
{
qDebug()<<j<<sval;
//sval = abs(sval);
}
double tmp = sqrt(sval);
x1 = qRound((b1+tmp)/(2*a));
y1 = qRound(k*x1+b);
x2 = qRound((b1-tmp)/(2*a));
y2 = qRound(k*x2+b);
//判断点是否在第一个和第二个点之间
QPoint p1(x1,y1);
QPoint p2(x2,y2);
QRect rect(firstPoint,secondPoint);
bool bl1 = false;
if(rect.contains(p1))
{
bl1 = true;
}
bool bl2 = false;
if(rect.contains(p2))
{
bl2 = true;
}
// 判断求出的点是否在圆上
int res = qRound(sqrt((x1-cx)*(x1-cx)+(y1-cy)*(y1-cy)));
bool bl3 = true;//这里让此条件一直成立
if(res <= (stepLength+10) &&
res >= (stepLength-10))
{
bl3 = true;
}
if(bl3)
{
if(bl1 == true && bl2 == true)
{
double dis1 = sqrt(((ax-x1)/100.0*(ax-x1)/100.0)*10000.0+((ay-y1)/100.0*(ay-y1)/100.0)*10000.0);
double dis2 = sqrt(((ax-x2)/100.0*(ax-x2)/100.0)*10000.0+((ay-y2)/100.0*(ay-y2)/100.0)*10000.0);
if(dis1 > dis2)
{
cx = x2;
cy = y2;
}
else
{
cx = x1;
cy = y1;
}
absItem.ax = cx;
absItem.ay = cy;
nabsData.append((char*)&absItem,sizeof(DsAbsItem));
dis = sqrt(((ax-cx)/100.0*(ax-cx)/100.0)*10000.0+((ay-cy)/100.0*(ay-cy)/100.0)*10000.0);
}
else
{
if(bl1)
{
p.setX(x1);
p.setY(y1);
}
else if(bl2)
{
p.setX(x2);
p.setY(y2);
}
else
{
qDebug()<<"bl1&bl2=false";
break;
}
cx = p.x();
cy = p.y();
if(cx < 0 || cy < 0)
{
//qDebug()<<j<<m<<cx<<cy;
}
absItem.ax = cx;
absItem.ay = cy;
nabsData.append((char*)&absItem,sizeof(DsAbsItem));
dis = sqrt(((ax-cx)/100.0*(ax-cx)/100.0)*10000.0+((ay-cy)/100.0*(ay-cy)/100.0)*10000.0);
}
}
else
{
qDebug()<<"bl3=false";
break;
}
}
}
}
}
//修改绝对坐标数据
stepsize = nabsData.size() / sizeof(DsAbsItem);
m_pEmbDs16Head->dataSize = stepsize*sizeof(DsAbsItem); // 数据字节数
m_pEmbDs16Head->itemNums = stepsize; // 数据项个数
m_pEmbDs16Head->dataChecksum = calcCheckSum32((u8 *)(nabsData.data()) , nabsData.length()); // 数据累加校验和
m_pEmbDs16Head->checkCrc = calcCrc16((u8 *)(m_pEmbDs16Head), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验6个字段分别为文件名称字节数项个数每项字节数每块字节数数据累加和的CRC校验值
u32 fileID = 0;
fileID = calcCheckSum32((u8 *)(nabsData.data()) , nabsData.length()); // 原始数据累加校验和
m_pEmbDs16Head->fileid = fileID; //中间数据的 fileid =
m_embAbsData.clear();
m_embAbsData.append((char *)(m_pEmbDs16Head), sizeof(DataDs16FileHead));
m_embAbsData.append(nabsData);
}
#define MERGEANGLE PI/180*70*10000 //70度
void EmbData::reFitLine(s32 stepLen)
{
QList<LineItem> lineList;
lineList.clear();
double stepLength = stepLen;//参数(200-800 单位0.01mm)
if(stepLength <= 0)
{
return;
}
LineItem item;
item.absItemList.clear();
int dr = 0;
double prer = 0;
DsAbsItem preItem;
memset(&preItem,0,sizeof(DsAbsItem));
s16 addOftFlag = 0;
s16 addSewFlag = 0;
DsAbsItem absItem;
memset(&absItem,0,sizeof(DsAbsItem));
//添加线段集合(夹角大于某个值时为新的一段线段)
int datasize = m_embAbsData.size() - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
return;
}
int stepsize = datasize/sizeof(DsAbsItem);
memcpy((char*)m_pEmbDs16Head,m_embAbsData.data(),sizeof(DataDs16FileHead));
DsAbsItem * dataBeg = (DsAbsItem *)(m_embAbsData.data()+sizeof(DataDs16FileHead));
prer = dataBeg->ar;
for (int i = 0; i < stepsize; i++)
{
dr = dataBeg->ar - prer;
while (dr < -PI10000)
{
dr += PI20000;
}
while (dr > PI10000)
{
dr -= PI20000;
}
if(dataBeg->ctrl == DATA_OFFSET)
{
if(item.absItemList.size() > 0)
{
lineList.append(item);
}
item.absItemList.clear();
item.absItemList.append(*dataBeg);
lineList.append(item);
item.absItemList.clear();
}
else if(dataBeg->ctrl != DATA_SEWING)
{
if(addSewFlag == 1)
{
lineList.append(item);
item.absItemList.clear();
item.absItemList.append(*(dataBeg-1));
addSewFlag = 0;
}
item.absItemList.append(*dataBeg);
addOftFlag = 1;
}
else
{
addSewFlag = 1;
if(addOftFlag == 1)
{
lineList.append(item);
item.absItemList.clear();
item.absItemList.append(*(dataBeg-1));
item.absItemList.append(*dataBeg);
addOftFlag = 0;
}
if((abs(dr) > MERGEANGLE))//新的一条线段
{
lineList.append(item);
item.absItemList.clear();
item.absItemList.append(*(dataBeg-1));
item.absItemList.append(*dataBeg);
}
else
{
item.absItemList.append(*dataBeg);
}
}
prer = dataBeg->ar;
dataBeg++;
}
//开始重置针步(绝对坐标的线段集合)
QByteArray nabsData;
nabsData.clear();
QList<DsAbsItem> outList;
int lSize = lineList.size();
for(int i = 0; i < lSize; i++)
{
outList.clear();
int pSize = lineList[i].absItemList.size();
if(pSize == 1)//只有一个点
{
nabsData.append((char*)&lineList[i].absItemList[0],sizeof(DsAbsItem));
}
else
{
getCurvePointFillLine(lineList[i].absItemList,stepLength,outList);
//从第二段开始起始点不向绝对坐标中添加,如果添加会出现空针步
int idx = 0;
if(i > 0)
{
idx = 1;
}
for(int m = idx; m < outList.size(); m++)
{
nabsData.append((char*)(&outList[m]), sizeof(DsAbsItem));
}
}
}
//重新计算ar
stepsize = nabsData.size() / sizeof(DsAbsItem);
if(stepsize <= 0)
{
return;
}
//如果最后一针不为结束码则添加结束码ax和ay是最后一针的
DsAbsItem dsAbsItem;
memcpy(&dsAbsItem,nabsData.data()+(nabsData.size() - sizeof(DsAbsItem)),sizeof(DsAbsItem));
if(dsAbsItem.ctrl != DATA_END && dsAbsItem.ctrl != DATA_NULL)
{
dsAbsItem.ctrl = DATA_END;
nabsData.append((char*)(&dsAbsItem), sizeof(DsAbsItem));
stepsize++;
}
DsAbsItem * absDataPtr = (DsAbsItem *)(nabsData.data());
double minX, maxX, minY, maxY;
minX = S32_MAX;
maxX = S32_MIN;
minY = S32_MAX;
maxY = S32_MIN;
double prex,prey,curx,cury,dx,dy;
prex = prey = curx = cury = dx = dy = 0;
prex = absDataPtr->ax;
prey = absDataPtr->ay;
for (int i = 0; i < stepsize; i++)
{
curx = absDataPtr->ax;
cury = absDataPtr->ay;
dx = curx - prex;
dy = cury - prey;
double tar = atan2(dy,dx);
absDataPtr->ar = (tar*10000+0.5*(tar>0?1:-1));
// qDebug() <<"dx dy " << dx << " /"<< dy << " index(absDataPtr->ar) : " << i << " : "<< absDataPtr->ar;
if(curx > maxX)
{
maxX = curx;
}
if(curx < minX)
{
minX = curx;
}
if(cury > maxY)
{
maxY = cury;
}
if(cury < minY)
{
minY = cury;
}
prex = curx;
prey = cury;
absDataPtr++;
}
//修改绝对坐标数据
m_pEmbDs16Head->dataSize = stepsize*sizeof(DsAbsItem); // 数据字节数
m_pEmbDs16Head->itemNums = stepsize; // 数据项个数
m_pEmbDs16Head->maxX = maxX;
m_pEmbDs16Head->minX = minX;
m_pEmbDs16Head->maxY = maxY;
m_pEmbDs16Head->minY = minY;
qDebug() << "-------- m_pEmbDs16Head->maxY = maxY;" << m_pEmbDs16Head->maxY ;
m_pEmbDs16Head->dataChecksum = calcCheckSum32((u8 *)(nabsData.data()) , nabsData.length()); // 数据累加校验和
m_pEmbDs16Head->checkCrc = calcCrc16((u8 *)(m_pEmbDs16Head), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验6个字段分别为文件名称字节数项个数每项字节数每块字节数数据累加和的CRC校验值
u32 fileID = 0;
fileID = calcCheckSum32((u8 *)(nabsData.data()) , nabsData.length()); // 原始数据累加校验和
m_pEmbDs16Head->fileid = fileID; //中间数据的 fileid =
m_embAbsData.clear();
m_embAbsData.append((char *)(m_pEmbDs16Head), sizeof(DataDs16FileHead));
m_embAbsData.append(nabsData);
m_ritStepSize = stepLen;
}
void EmbData::reFitLineDoubleHead(s32 stepLen)
{
QList<LineItem> lineList;
lineList.clear();
double stepLength = stepLen;//参数(200-800 单位0.01mm)
if(stepLength <= 0)
{
return;
}
LineItem item;
item.absItemList.clear();
int dr = 0;
double prer = 0;
DsAbsItem preItem;
memset(&preItem,0,sizeof(DsAbsItem));
DsAbsItem absItem;
memset(&absItem,0,sizeof(DsAbsItem));
//添加线段集合(夹角大于某个值时为新的一段线段)
int datasize = m_embAbsData.size() - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
return;
}
int stepsize = datasize/sizeof(DsAbsItem);
memcpy((char*)m_pEmbDs16Head,m_embAbsData.data(),sizeof(DataDs16FileHead));
DsAbsItem * dataBeg = (DsAbsItem *)(m_embAbsData.data()+sizeof(DataDs16FileHead));
prer = dataBeg->ar;
for (int i = 0; i < stepsize; i++)
{
dr = dataBeg->ar - prer;
while (dr < -PI10000)
{
dr += PI20000;
}
while (dr > PI10000)
{
dr -= PI20000;
}
//只要遇到左机头偏移或右机头偏移,就添加到一段新的线段中
if(dataBeg->ctrl == DATA_OFFSET || dataBeg->ctrl == DATA_OFFSET_SEC)
{
if(item.absItemList.size() > 0)
{
lineList.append(item);
}
item.absItemList.clear();
item.absItemList.append(*dataBeg);
lineList.append(item);
item.absItemList.clear();
}
//只要遇到剪线码,就添加到一段新的线段中
else if(dataBeg->ctrl == DATA_CUTTRD || dataBeg->ctrl == DATA_SYNC_CUTTER || dataBeg->ctrl == DATA_CUTTER_SEC)
{
if(item.absItemList.size() > 0)
{
lineList.append(item);
}
item.absItemList.clear();
item.absItemList.append(*dataBeg);
lineList.append(item);
item.absItemList.clear();
}
else
{
if((abs(dr) > MERGEANGLE))//新的一条线段
{
if(item.absItemList.size() > 0)
{
lineList.append(item);
}
item.absItemList.clear();
DsAbsItem * preDataBeg = dataBeg - 1;
if(preDataBeg->ctrl != DATA_OFFSET_SEC)
{
if(preDataBeg->ctrl == dataBeg->ctrl ||
(dataBeg->ctrl == DATA_SYNCSEW || dataBeg->ctrl == DATA_MIRROR_SEC ||
dataBeg->ctrl == DATA_SYNCOFST || dataBeg->ctrl == DATA_MIRROR_OFT_SEC))
{
item.absItemList.append(*preDataBeg);
}
}
else
{
DsAbsItem * preDataBeg2 = dataBeg - 2;
if(preDataBeg2->ctrl != DATA_OFFSET)
{
if(preDataBeg2->ctrl == dataBeg->ctrl ||
(dataBeg->ctrl == DATA_SYNCSEW || dataBeg->ctrl == DATA_MIRROR_SEC ||
dataBeg->ctrl == DATA_SYNCOFST || dataBeg->ctrl == DATA_MIRROR_OFT_SEC))
{
item.absItemList.append(*preDataBeg2);
}
}
}
item.absItemList.append(*dataBeg);
}
else
{
item.absItemList.append(*dataBeg);
}
}
prer = dataBeg->ar;
dataBeg++;
}
if(item.absItemList.size() > 0)
{
lineList.append(item);
}
//开始重置针步(绝对坐标的线段集合)
QByteArray nabsData;
nabsData.clear();
QList<DsAbsItem> outList;
int lSize = lineList.size();
for(int i = 0; i < lSize; i++)
{
outList.clear();
int pSize = lineList[i].absItemList.size();
if(pSize == 1)//只有一个点
{
nabsData.append((char*)&lineList[i].absItemList[0],sizeof(DsAbsItem));
}
else
{
// for(int j = 0; j < lineList[i].absItemList.size(); j++)
// {
// nabsData.append((char*)&lineList[i].absItemList[j],sizeof(DsAbsItem));
// }
getCurvePointFillLine(lineList[i].absItemList,stepLength,outList);
//从第二段开始起始点不向绝对坐标中添加,如果添加会出现空针步
int idx = 0;
if(i > 0)
{
idx = 1;
}
for(int m = idx; m < outList.size(); m++)
{
nabsData.append((char*)(&outList[m]), sizeof(DsAbsItem));
}
}
}
//重新计算ar
stepsize = nabsData.size() / sizeof(DsAbsItem);
if(stepsize <= 0)
{
return;
}
//如果最后一针不为结束码则添加结束码ax和ay是最后一针的
DsAbsItem dsAbsItem;
memcpy(&dsAbsItem,nabsData.data()+(nabsData.size() - sizeof(DsAbsItem)),sizeof(DsAbsItem));
if(dsAbsItem.ctrl != DATA_END && dsAbsItem.ctrl != DATA_NULL)
{
dsAbsItem.ctrl = DATA_END;
nabsData.append((char*)(&dsAbsItem), sizeof(DsAbsItem));
stepsize++;
}
DsAbsItem * absDataPtr = (DsAbsItem *)(nabsData.data());
double minX, maxX, minY, maxY;
minX = S32_MAX;
maxX = S32_MIN;
minY = S32_MAX;
maxY = S32_MIN;
double prex,prey,curx,cury,dx,dy;
prex = prey = curx = cury = dx = dy = 0;
prex = absDataPtr->ax;
prey = absDataPtr->ay;
for (int i = 0; i < stepsize; i++)
{
curx = absDataPtr->ax;
cury = absDataPtr->ay;
dx = curx - prex;
dy = cury - prey;
double tar = atan2(dy,dx);
absDataPtr->ar = (tar*10000+0.5*(tar>0?1:-1));
// qDebug() <<"dx dy " << dx << " /"<< dy << " index(absDataPtr->ar) : " << i << " : "<< absDataPtr->ar;
if(curx > maxX)
{
maxX = curx;
}
if(curx < minX)
{
minX = curx;
}
if(cury > maxY)
{
maxY = cury;
}
if(cury < minY)
{
minY = cury;
}
prex = curx;
prey = cury;
absDataPtr++;
}
//修改绝对坐标数据
m_pEmbDs16Head->dataSize = stepsize*sizeof(DsAbsItem); // 数据字节数
m_pEmbDs16Head->itemNums = stepsize; // 数据项个数
m_pEmbDs16Head->maxX = maxX;
m_pEmbDs16Head->minX = minX;
m_pEmbDs16Head->maxY = maxY;
m_pEmbDs16Head->minY = minY;
qDebug() << "-------- m_pEmbDs16Head->maxY = maxY;" << m_pEmbDs16Head->maxY ;
m_pEmbDs16Head->dataChecksum = calcCheckSum32((u8 *)(nabsData.data()) , nabsData.length()); // 数据累加校验和
m_pEmbDs16Head->checkCrc = calcCrc16((u8 *)(m_pEmbDs16Head), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验6个字段分别为文件名称字节数项个数每项字节数每块字节数数据累加和的CRC校验值
u32 fileID = 0;
fileID = calcCheckSum32((u8 *)(nabsData.data()) , nabsData.length()); // 原始数据累加校验和
m_pEmbDs16Head->fileid = fileID; //中间数据的 fileid =
m_embAbsData.clear();
m_embAbsData.append((char *)(m_pEmbDs16Head), sizeof(DataDs16FileHead));
m_embAbsData.append(nabsData);
m_ritStepSize = stepLen;
}
//移动起始点,左边,前边
int EmbData::moveStartPoint(short left, short front)
{
if(m_pEmbDs16Head == NULL){return -1;}
if(m_embDs16Data.size() <= 0){return -1;}
m_pEmbDs16Head->anchorX += left;
m_pEmbDs16Head->anchorY += front;
m_pEmbDs16Head->beginX += left;
m_pEmbDs16Head->beginY += front;
//将最大最小值写入文件头
m_pEmbDs16Head->maxX += left;
m_pEmbDs16Head->minX += left;
m_pEmbDs16Head->maxY += front;
m_pEmbDs16Head->minY += front;
qDebug() << "-------- m_pEmbDs16Head->maxY += front;" << m_pEmbDs16Head->maxY ;
m_maxX += left;
m_minX += left;
m_maxY += front;
m_minY += front;
memcpy(m_embDs16Data.data(),(char*)m_pEmbDs16Head,sizeof(DataDs16FileHead));
return 0;
}
QByteArray & EmbData::lolaComp(s16 valuePos, s16 valueNeg, s16 valueZero)
{
if(valuePos == 0 && valueNeg == 0 && valueZero == 0)
{
return m_embDs16Data;
}
m_minY = S32_MAX;
m_maxY = S32_MIN;
double compValPos = valuePos / 1000.0;//一米补偿量,单位mm
compValPos *= 100;//单位0.01mm
double compValNeg = valueNeg / 1000.0;//一米补偿量,单位mm
compValNeg *= 100;//单位0.01mm
double compValZero = valueZero / 1000.0;//一米补偿量,单位mm
compValZero *= 100;//单位0.01mm
// ds16数据
int size = m_embDs16Data.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
return m_embDs16Data;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
return m_embDs16Data;
}
int stepsize = datasize/sizeof(Ds16Item);
if (stepsize <= 0)
{
return m_embDs16Data;
}
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(m_embDs16Data.data());
Ds16Item * ds16DataPtr;
Ds16Item * pData = (Ds16Item *)(m_embDs16Data.data() + sizeof(DataDs16FileHead));
ds16DataPtr = pData;
double actY = pDsHead->beginY;
m_minY = m_maxY = ds16DataPtr->dy;
for (int i = 0; i < stepsize; i++)
{
// 读入一个针步数据
if(ds16DataPtr->dx > 0)
{
ds16DataPtr->dy += compValPos;
}
if(ds16DataPtr->dx < 0)
{
ds16DataPtr->dy += compValNeg;
}
if(ds16DataPtr->dx == 0)
{
ds16DataPtr->dy += compValZero;
}
actY += ds16DataPtr->dy;
if(m_minY > actY)
{
m_minY = actY;
}
if(m_maxY < actY)
{
m_maxY = actY;
}
ds16DataPtr++;
}
#if(1)
//保存成ds16文件
QString ds16FilePath = m_filePath + ".ds16";
QFile file(ds16FilePath);
if(file.exists())//存在ds16文件
{
QFile::remove(ds16FilePath);
}
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
qDebug() << "open file fail when wirte, path =" << m_filePath;
return m_embDs16Data;
}
else
{
file.write(m_embDs16Data);
file.close();
}
#endif
return m_embDs16Data;
}
void EmbData::setLastStepAngle()
{
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return;
}
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
DsAbsItem * preAbsDataPtr = NULL;
DsAbsItem * lastAbsDataPtr = NULL;
int rsize = m_embAbsData.size();
DsAbsItem tmp;
memcpy(&tmp,m_embAbsData.data()+rsize-2*sizeof(DsAbsItem),sizeof(DsAbsItem));
int firstFlag = 0;
int dx = 0;
int dy = 0;
for (int j = 0; j < stepsize; j++)
{
if(j == 0)
{
preAbsDataPtr = absDataPtr;
}
else
{
if(firstFlag == 0)
{
dx = absDataPtr->ax - preAbsDataPtr->ax;
dy = absDataPtr->ay - preAbsDataPtr->ay;
firstFlag = 1;
}
}
if(absDataPtr->ctrl == DATA_SEWING)
{
lastAbsDataPtr = absDataPtr;
}
absDataPtr++;
}
//到下一版的第一针的角度变化
if(lastAbsDataPtr != NULL)
{
double tar = atan2(dy,dx);
lastAbsDataPtr->ar = 0 + (tar * 10000+0.5*(tar>0?1:-1));//0度为基准再加上第一针的角度变化
}
memcpy(&tmp,m_embAbsData.data()+rsize-2*sizeof(DsAbsItem),sizeof(DsAbsItem));
return;
}
void EmbData::moveDataBeginPonit(s32 left, s32 front)
{
if((u32)m_embAbsData.size() > sizeof(DataDs16FileHead)){
DataDs16FileHead *dhead = (DataDs16FileHead *)(m_embAbsData.data());
dhead->beginX += left;
dhead->beginY += front;
dhead->maxX += left;
dhead->minX += left;
dhead->maxY += front;
dhead->minY += front;
}
}
void EmbData::appendAEmbAbsFile(QString filePath, QByteArray array, int mirror)
{
m_filePath = filePath;
convertAbsDat(array,mirror);//是否镜像、旋转、缩放的转换
m_embAbsData.clear();
m_embAbsData.append(array);
m_editedflag = 1;
}
void EmbData::setAbsDat(QByteArray & dat)
{
m_embAbsData = dat;
}
QByteArray & EmbData::getAbsDat(void)
{
return m_embAbsData;
}
int EmbData::getPosInfoFromNeedleIdx(int stitchIdx, int & posx, int & posy, int & colorIdx, int & dr, int & ar, int & dxV, int & dyV)
{
if (m_editedflag != 0)
{
createEmbDs16FromAbs();
}
posx = 0;
posy = 0;
colorIdx = 0;
dr = 0;
ar = 0;
// 文件头
int size = m_embDs16Data.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("m_embDs16Data data less then head size");
return -1;
}
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(m_embDs16Data.data());
int datasize = size - sizeof(DataDs16FileHead);
int stepsize = datasize/sizeof(Ds16Item);
if (stepsize <= 0)
{
qDebug("ds16 data size err");
return -1;
}
Ds16Item * ds16DataPtr;
Ds16Item * pData = (Ds16Item *)(m_embDs16Data.data() + sizeof(DataDs16FileHead));
ds16DataPtr = pData;
posx = pDsHead->beginX;
posy = pDsHead->beginY;
// posx = 0;
// posy = 0;
if (stitchIdx <= 0)
{
return 0;
}
colorIdx = 1;
if (stitchIdx > datasize)
{
stitchIdx = datasize;
}
int dx, dy;
u8 ctrl, attr;
for (int i = 0; i < stitchIdx; i++)
{
ctrl = ds16DataPtr->ctrl;
attr = ds16DataPtr->attr;
dx = ds16DataPtr->dx;
dy = ds16DataPtr->dy;
dr = ds16DataPtr->dr;
dxV = ds16DataPtr->dx;
dyV = ds16DataPtr->dy;
if (ctrl == DATA_CHGND)
{
colorIdx++;
}
if ((attr&0x80) != 0)
{
dx *= -1;
}
if ((attr&0x40) != 0)
{
dy *= -1;
}
posx += dx;
posy += dy;
ar += dr;
ds16DataPtr++;
}
return 0;
}
//设置起始点
void EmbData::setStartPosition(int x, int y)
{
qDebug()<<__FUNCTION__;
if(m_pEmbDs16Head == NULL){
qDebug()<< "(m_pEmbDs16Head == NULL)";
return;
}
if(m_embDs16Data.size() <= 0){
qDebug()<< "(m_embDs16Data.size() <= 0)";
return;
}
//旧的起始点坐标
int oldBeginX = m_pEmbDs16Head->beginX;
int oldBeginY = m_pEmbDs16Head->beginY;
m_pEmbDs16Head->beginX = x;
m_pEmbDs16Head->beginY = y;
//新的起始点坐标与旧的起始点坐标的差值
int cx = x - oldBeginX;
int cy = y - oldBeginY;
//重新计算最大最小XY
double maxX = m_pEmbDs16Head->maxX + cx;
double minX = m_pEmbDs16Head->minX + cx;
double maxY = m_pEmbDs16Head->maxY + cy;
double minY = m_pEmbDs16Head->minY + cy;
//将最大最小值写入文件头
m_pEmbDs16Head->maxX = maxX;
m_pEmbDs16Head->minX = minX;
m_pEmbDs16Head->maxY = maxY;
m_pEmbDs16Head->minY = minY;
qDebug() << "--------m_pEmbDs16Head->maxY = maxY" << m_pEmbDs16Head->maxY ;
//修复偶尔点击中间按钮花样消失的bug
m_maxX = maxX;
m_minX = minX;
m_maxY = maxY;
m_minY = minY;
memcpy(m_embDs16Data.data(),(char*)m_pEmbDs16Head,sizeof(DataDs16FileHead));
qDebug()<<"m_maxX"<<m_maxX<<"m_minX"<<m_minX;
qDebug()<<"m_maxY"<<m_maxY<<"m_minY"<<m_minY;
qDebug()<<"beginx"<<x<<"beginy"<<y;
#if(0)
QString suffix = ".ds16";
QString dsFilePath = m_filePath + suffix;
QFile file(dsFilePath);
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
qDebug() << "open file fail when wirte, path =" << m_filePath;
return;
}
else
{
file.write(m_embDs16Data);
file.close();
}
#endif
}
void EmbData::setStartPositionDoubleHead(int left,int front)
{
if(m_pEmbDs16Head == NULL)
{
return;
}
if((u32)m_embDs16Data.size() < sizeof(DataDs16FileHead))
{
return;
}
#if(0)
int oldStartX = m_pEmbDs16Head->beginX;
int oldStartY = m_pEmbDs16Head->beginY;
#endif
//起始点y1与y2的差
int cy = m_pEmbDs16Head->beginY2 - m_pEmbDs16Head->beginY;
int high = m_maxY - m_minY;
int beginY = high - abs(m_pEmbDs16Head->beginY);//因为y数据与机器坐标相反所以要用最大值减去起始y
//int beginY = m_pEmbDs16Head->beginY - m_minY;
m_pEmbDs16Head->beginX += left;
m_pEmbDs16Head->beginY = beginY + front;
double btar = atan2(m_pEmbDs16Head->beginY,m_pEmbDs16Head->beginX);
double begR = (btar*10000+0.5*(btar>0?1:-1));
m_pEmbDs16Head->beginR = begR;
m_pEmbDs16Head->beginX2 += left;
m_pEmbDs16Head->beginY2 = beginY + front - cy;//因为y数据与机器坐标相反所以用减
#if(0)
int sx = m_pEmbDs16Head->beginX - oldStartX;
int sy = m_pEmbDs16Head->beginY - oldStartY;
m_pEmbDs16Head->minX += sx;
m_pEmbDs16Head->maxX += sx;
m_pEmbDs16Head->minY += sy;
m_pEmbDs16Head->maxY += sy;
#endif
int width = m_pEmbDs16Head->maxX - m_pEmbDs16Head->minX;
int height = m_pEmbDs16Head->maxY - m_pEmbDs16Head->minY;
m_pEmbDs16Head->minX = left;
m_pEmbDs16Head->maxX = left + width;
m_pEmbDs16Head->minY = front;
m_pEmbDs16Head->maxY = front + height;
memcpy(m_embDs16Data.data(),(char*)m_pEmbDs16Head,sizeof(DataDs16FileHead));
}
void EmbData::setStartPositionFromLeftFront(int left, int front)
{
if(m_pEmbDs16Head == NULL)
{
return;
}
if((u32)m_embDs16Data.size() < sizeof(DataDs16FileHead))
{
return;
}
int x = 0 - m_minX;
int y = 0 - m_minY;
m_pEmbDs16Head->beginX = m_pEmbDs16Head->beginX + left + x;
m_pEmbDs16Head->beginY = m_pEmbDs16Head->beginY + front + y;
double btar = atan2(m_pEmbDs16Head->beginY,m_pEmbDs16Head->beginX);
//边走边裁不用计算起始角度
if(g_emMacType != MACHINE_CUTTINGWALK)
{
double begR = (btar*10000+0.5*(btar>0?1:-1));
m_pEmbDs16Head->beginR = begR;
}
m_minX = m_minX + left + x;
m_maxX = m_maxX + left + x;
m_minY = m_minY + front + y;
m_maxY = m_maxY + front + y;
m_pEmbDs16Head->minX = m_minX;
m_pEmbDs16Head->maxX = m_maxX;
m_pEmbDs16Head->minY = m_minY;
m_pEmbDs16Head->maxY = m_maxY;
memcpy(m_embDs16Data.data(),(char*)m_pEmbDs16Head,sizeof(DataDs16FileHead));
}
void EmbData::reCreatDispDat()
{
createDispFromEmbDs16DatDoubleHeadComb(m_embDs16Data);
}
void EmbData::setAnchorPosition(int x, int y)
{
if(m_pEmbDs16Head == NULL){return;}
if(m_embDs16Data.size() <= 0){return;}
m_pEmbDs16Head->anchorX = x;
m_pEmbDs16Head->anchorY = y;
memcpy(m_embDs16Data.data(),(char*)m_pEmbDs16Head,sizeof(DataDs16FileHead));
#if(0)
QString suffix = ".ds16";
QString dsFilePath = m_filePath + suffix;
QFile file(dsFilePath);
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
qDebug() << "open file fail when wirte, path =" << m_filePath;
return;
}
else
{
file.write(m_embDs16Data);
file.close();
}
#endif
}
double EmbData::getAngle(double x1, double y1, double x2, double y2)
{
double angle;
if(x1 == x2)
{
if(y2 > y1)
{
angle = 90.0;
}
else
{
angle = 270.0;
}
}
else if (y1 == y2)
{
if(x1 > x2)
{
angle = 180.0;
}
else
{
angle = 0.0;
}
}
else
{
angle = atan((y2 - y1)*1.0 / (x2 - x1) *1.0)*180/M_PI;
if(angle < 0)
{
if(x1 > x2)
{
angle = angle + 180.0;
}
else
{
angle = angle + 360.0;
}
}
else
{
if(x1 > x2)
{
angle = angle + 180.0;
}
}
}
return angle;
}
int EmbData::setDatSizeChange(int dsx, int dsy)
{
//因为帽绣机要有100%以下的缩放倍率,所以将 dsx <= 0 && dsy <= 0改为以下 -rq
if (dsx <= 0 && dsy <= 0)
{
return 0;
}
// 文件头
const QByteArray & ary = m_embAbsData;
int size = ary.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("dat data size err");
return -1;
}
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ary.data());
DsAbsItem * pData = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData;
int width = m_maxX - m_minX;
int height = m_maxY - m_minY;
double nw = dsx * 1.0;
double nh = dsy * 1.0;
double factorx,factory;
if (width != 0)
{
factorx = nw/(double)width;
}
else
{
factorx = 1;
}
if (height != 0)
{
factory = nh/(double)height;
}
else
{
factory = 1;
}
pDsHead->beginX *= factorx;
pDsHead->beginY *= factory;
// 数据缩放
for (int j = 0; j < stepsize; j++)
{
double ax = absDataPtr->ax;
double ay = absDataPtr->ay;
ax *= factorx;
ay *= factory;
absDataPtr->ax = ax;
absDataPtr->ay = ay;
absDataPtr++;
}
m_editedflag = 1;
return 1;
}
int EmbData::setMirror(MirrorType mirror)
{
int mirrorr = 0;
int mirrorrdir = 0;
if(mirror == HorizontalMirror)
{
mirrorr = 1*PI*10000;
mirrorrdir = -1;
}
else if (mirror == VerticalMirror)
{
mirrorr = 2*PI*10000;
mirrorrdir = -1;
}
else if (mirror == BothMirror)
{
mirrorr = 1*PI*10000;
mirrorrdir = 1;
}
// 文件头
const QByteArray & ary = m_embAbsData;
if(!checkData(ary.size()))
{
return -1;
}
int stepsize = (ary.size() - sizeof(DataDs16FileHead))/sizeof(DsAbsItem);
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ary.data());
int maxX = pDsHead->maxX;
int minX = pDsHead->minX;
int maxY = pDsHead->maxY;
int minY = pDsHead->minY;
int width = maxX - minX; //宽
int height = maxY - minY; //高
//在最大最小xy中 对起始点进行镜像处理
int bx = pDsHead->beginX;
int by = pDsHead->beginY;
//平移到原点
bx -= minX;
by -= minY;
//镜像
if(mirror == HorizontalMirror || mirror == BothMirror)
pDsHead->beginX = (width - bx) + minX;
if(mirror == VerticalMirror || mirror == BothMirror)
pDsHead->beginY = (height - by) + minY;
//beginR的旋转
double br = pDsHead->beginR;
if (mirrorrdir > 0)
{
br = br + mirrorr;
}
else if (mirrorrdir < 0)
{
br = mirrorr - br;
}
while (br > 2*PI * 10000)
{
br -= 2*PI * 10000;
}
while (br < -2*PI * 10000)
{
br += 2*PI * 10000;
}
pDsHead->beginR = br;
DsAbsItem * pData = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData;
// 数据镜像
for (int j = 0; j < stepsize; j++)
{
double ax = absDataPtr->ax;
double ay = absDataPtr->ay;
double ar = absDataPtr->ar;
//平移到原点
ax -= minX;
ay -= minY;
//镜像
if(mirror == HorizontalMirror || mirror == BothMirror)
absDataPtr->ax = (width - ax) + minX;
if(mirror == VerticalMirror || mirror == BothMirror)
absDataPtr->ay = (height - ay) + minY;
if (mirrorrdir > 0)
{
ar = ar + mirrorr;
}
else if (mirrorrdir < 0)
{
ar = mirrorr - ar;
}
while (ar > 2*PI * 10000)
{
ar -= 2*PI * 10000;
}
while (ar < -2*PI * 10000)
{
ar += 2*PI * 10000;
}
absDataPtr->ar = ar;
absDataPtr++;
}
m_editedflag = 1;
return 1;
}
//flag :true代表顺时针方向
int EmbData::setRotate90(bool flag)
{
// 文件头
const QByteArray & ary = m_embAbsData;
if(!checkData(ary.size()))
{
return -1;
}
int stepsize = (ary.size() - sizeof(DataDs16FileHead))/sizeof(DsAbsItem);
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ary.data());
int maxX = pDsHead->maxX;
int minX = pDsHead->minX;
int maxY = pDsHead->maxY;
int minY = pDsHead->minY;
int width = maxX - minX; //宽
int height = maxY - minY; //高
int bx = pDsHead->beginX;
int by = pDsHead->beginY;
//平移到原点
bx -= minX;
by -= minY;
int tempX;
int tempY;
//旋转
if(flag)
{
tempX = by;
tempY = width - bx;
}
else
{
tempX = height - by;
tempY = bx;
}
pDsHead->beginX = tempX + minX;
pDsHead->beginY = tempY + minY;
qDebug() << "__=++++++++++++++++++++++pDsHead->beginX" << pDsHead->beginX;
qDebug() << "__=++++++++++++++++++++++pDsHead->beginY" << pDsHead->beginY;
DsAbsItem * absDataPtr = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead));
for (int j = 0; j < stepsize; j++)
{
double ax = absDataPtr->ax;
double ay = absDataPtr->ay;
//平移到原点
ax -= minX;
ay -= minY;
//旋转
int rx, ry;
if(flag){
rx = ay;
ry = width - ax;
}
else
{
rx = height - ay;
ry = ax;
}
//平移回
absDataPtr->ax = rx + minX;
absDataPtr->ay = ry + minY;
absDataPtr++;
}
m_editedflag = 1;
return 1;
}
///
/// \brief //获得下一个图元的第一缝纫针步
/// \param curIndex
/// \return
///
int EmbData::getNextElementIndex(int curIndex)
{
// ds16数据
int size = m_embDs16Data.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("16 data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("dat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(Ds16Item);
if (stepsize <= 0)
{
qDebug("ds16 data size err");
return -1;
}
Ds16Item * ds16DataPtr = (Ds16Item *)(m_embDs16Data.data() + sizeof(DataDs16FileHead));
ds16DataPtr = ds16DataPtr + curIndex;
u8 curByte =ds16DataPtr->ctrl; //当前状态
ds16DataPtr ++;
curIndex ++;
int i = curIndex;
for (; i < stepsize; i++)
{
if(curByte != DATA_SEWING)
{
if(ds16DataPtr->ctrl == DATA_SEWING)
break;
}else{
if(ds16DataPtr->ctrl != DATA_SEWING)
curByte = ds16DataPtr->ctrl;
}
ds16DataPtr++;
}
return i;
}
///
/// \brief //上一个图元(当前为跨步时)或当前图元(当前为缝纫时)的第一缝纫针步
/// \param curIndex
/// \return
///
int EmbData::getPreOrThisElementIndex(int curIndex)
{
// ds16数据
int size = m_embDs16Data.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("16 data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("dat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(Ds16Item);
if (stepsize <= 0)
{
qDebug("ds16 data size err");
return -1;
}
Ds16Item * ds16DataPtr = (Ds16Item *)(m_embDs16Data.data() + sizeof(DataDs16FileHead));
ds16DataPtr = ds16DataPtr + curIndex;
u8 curByte =ds16DataPtr->ctrl; //当前状态
ds16DataPtr--;
curIndex --;
int i = curIndex;
for (; i > 0; i--)
{
//如果当前是缝纫数据,找到其他的就返回下一针
if(curByte == DATA_SEWING)
{
if(ds16DataPtr->ctrl != DATA_SEWING)
break;
}else{
//找到其他的就返回下一针
if(ds16DataPtr->ctrl == DATA_SEWING)
curByte = DATA_SEWING;
}
ds16DataPtr--;
}
return ++i;
}
//-------------------------------------------------
// 分割切刀数据(裁床专用代码)
//
#define CUT_MINST_STP (5.0) // 拟合小针步,小于此值的针步将被合并,单位0.01mm
#define CUT_LINE_MIN_STP (20.0) // 直线最小步长,单位0.01mm
#define CUT_LINE_MAX_STP (800.0) // 直线最大步长,单位0.01mm
#define CUT_ROUD_ANG (ANGLECORR) // 圆弧转角判断度数,单位:10000弧度
#define CUT_ROUD_STP (10.0) // 圆弧补偿步长,单位0.01mm
#define CUT1_RADIUS (50.0) // 切刀1圆弧补偿半径,精度0.01mm
#define CUT2_RADIUS (50.0) // 切刀2圆弧补偿半径,精度0.01mm
// 分割直线 (匀变步长 分割针步)
// 返回值: 增加的针数
// posX1,posY1: 起点坐标
// posX2,posY2: 起点坐标
// stepMin: 最小分割针步大小
// stepMax: 最大分割针步大小
// 分割直线
int EmbData::splittingLine(double posX1, double posY1,
double posX2, double posY2,
int stepMin, int stepMax,
QByteArray &cutData, DsAbsItem item)
{
int num = 0; // 增加的针步数
if ((stepMin == 0) || (stepMax == 0))
{
return -1;
}
DsAbsItem absItem;
// 线段长
double len = sqrt((posX1-posX2)*(posX1-posX2)+(posY1-posY2)*(posY1-posY2));
if (len <= stepMin)
{
memcpy(&absItem,&item,sizeof(DsAbsItem));
num++;
cutData.append((char*)(&absItem), sizeof(DsAbsItem)); // 中间数据
}
else
{// 分割份数
int n = (int)(len/stepMin + 0.5);
int i,j ;
double add;
j = stepMin;
add = 0;
for (i=0; i<(n/2);i++)
{// 扫描匀速点和降速点
add += j;
j += stepMin;
if (((add*2)>= len) ||
(j >= stepMax) ||
0)
{
break;
}
}
int n1 = i; // 匀速点
int n2 = n-n1-2; // 减速点
j = 1;
add = 1;
for (i=1; i<=n;i++)
{
if (i >= add)
{
add += j;
if (add > n)
{
add = n;
}
if ((i >= n2) && (j > 2))
{
j--;
}
else if (i < n1)
{
j++;
}
memcpy(&absItem,&item,sizeof(DsAbsItem));
absItem.ax = posX1+(posX2-posX1)*i/n;
absItem.ay = posY1+(posY2-posY1)*i/n;
num++;
cutData.append((char*)(&absItem), sizeof(DsAbsItem)); // 中间数据
}
}
}
return num;
}
// 分割圆弧
// 返回值: 增加的针数
// posX1,posY1: 起点坐标
// posX2,posY2: 起点坐标
// xc,yc,r: 圆心,半径
// dr1,dr2: 起点,终点角度
// step: 分割针步大小
// 分割圆弧
int EmbData::splittingArc(double posX1, double posY1,
double posX2, double posY2,
double xc, double yc, double r,
double dr1,double dr2,int step,
QByteArray &cutData, DsAbsItem item)
{
int num = 0;
int dir = 1;
// 弦长
double len = sqrt((posX1-posX2)*(posX1-posX2)+(posY1-posY2)*(posY1-posY2));
// 圆心角
double k = (r*r+r*r-len*len)/(2*r*r);
if (k < -1)
{
k = -1;
}
else if (k > 1)
{
k = 1;
}
double alph = acos(k);
if (0) // 执行此代码生成大圆弧
{
alph = PI*2 - alph;
}
if (1)
{// 求旋转方向
dr1 = dr1*-180/PI10000;
dr2 = dr2*-180/PI10000;
//qDebug()<<"bdr1="<<(dr1)<<",bdr2="<<(dr2);
do
{// 将dr1变换到整数
if ((dr1 >= 0) && (dr1 < 360)) { break; }
else if (dr1 < 0) { dr1 += 360; }
else if (dr1 >= 360) { dr1 -= 360; }
}while(1);
do
{// 将dr2变换到整数
if ((dr2 >= 0) && (dr2 < 360)) { break; }
else if (dr2 < 0) { dr2 += 360; }
else if (dr2 >= 360) { dr2 -= 360; }
}while(1);
if (((dr1 <= 180) && (dr2 <= 180)) ||
((dr1 > 180) && (dr2 > 180)) ||
0 )
{
if (dr1 < dr2)
{
dir = -1; // 逆时针(正转)
}
else
{
dir = 1; // 顺时针(反转)
}
}
else if ((dr1 > 180) && (dr2 <= 180))
{
if ((dr1-180) > dr2)
{
dir = -1; // 逆时针(正转)
}
else
{
dir = 1; // 顺时针(反转)
}
}
else if ((dr1 <= 180) && (dr2 > 180))
{
if ((dr1+180) > dr2)
{
dir = -1; // 逆时针(正转)
}
else
{
dir = 1; // 顺时针(反转)
}
}
// qDebug()<<"edr1="<<(int)(dr1+0.5)<<",edr2="<<(int)(dr2+0.5)<<",dir="<<dir;
}
// 弧长
len = alph*r;
// 分割份数
int n = (int)(len/step + 0.5);
// 增加的角度和方向
double inc;
inc = alph/n;
inc *= dir;
if (inc == 0)
{
return -1;
}
double lastx, lasty;
double xrot, yrot;
double ex, ey;
lastx = posX1;
lasty = posY1;
int i = 0;
DsAbsItem absItem;
memcpy(&absItem,&item,sizeof(DsAbsItem));
absItem.ax = posX1;
absItem.ay = posY1;
num++;
cutData.append((char*)(&absItem), sizeof(DsAbsItem)); // 第一针
do
{// 点 (lastx, lasty) 在圆上旋转
{// 旋转坐标值
xrot=(lastx-xc)*cos(inc) - (lasty-yc)*sin(inc);
yrot=(lastx-xc)*sin(inc) + (lasty-yc)*cos(inc);
}
lastx = xrot + xc;
lasty = yrot + yc;
ex = lastx;
ey = lasty;
memcpy(&absItem,&item,sizeof(DsAbsItem));
absItem.ax = ex;
absItem.ay = ey;
if (((fabs(lastx-posX2) > 1) || (fabs(lasty-posY2) > 1)) &&
(i < (n-1)) &&
1)
{// 圆弧中间 增加降速抬刀标志
absItem.attr |= 0x10;
}
num++;
cutData.append((char*)(&absItem), sizeof(DsAbsItem));
i++;
if ((fabs(lastx-posX2) <= 1) && (fabs(lasty-posY2) <= 1))
{
ex = posX2;
ey = posY2;
memcpy(&absItem,&item,sizeof(DsAbsItem));
absItem.ax = ex;
absItem.ay = ey;
num++;
cutData.append((char*)(&absItem), sizeof(DsAbsItem));
break;
}
} while(i < n);
return num;
}
// 偏心刀平板切割机补偿算法
// 增加对比数据
int EmbData::setCutcontrastData( )
{
int cutLineMaxStp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutLineMaxStp").toInt();
if (cutLineMaxStp == 0)
{
cutLineMaxStp = 100;
}
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
DsAbsItem absItem;
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
double begX; // 起始点
double begY;
// 数据区
{
absDataPtr = pData; //中间数据针步
for (int j = 0; j < stepsize; j++)
{
if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END))
{
// memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
// newstepnum++;
// cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem));
}
else
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
absDataPtr++;
}
}
// 参考数据
if (1)
{
absDataPtr = pData; //中间数据针步
for (int j = 0; j < stepsize; j++)
{
if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END))
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
if (j == 0)
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ctrl = DATA_OFFSET;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{// 分割针步
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ctrl = DATA_OFFSET;
newstepnum += splittingLine(begX, begY, absDataPtr->ax, absDataPtr->ay,
cutLineMaxStp, cutLineMaxStp,
cutAbsData, absItem); // 分割直线
}
begX = absDataPtr->ax;
begY = absDataPtr->ay;
}
absDataPtr++;
}
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
return 0;
}
// 增加拐点数据
int EmbData::setCutCornerStep()
{
int cutRoudAng = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutRoudAng").toInt();
cutRoudAng = cutRoudAng * 10000 * PI / 18000; // 角度->10000弧度
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
DsAbsItem absItem;
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
double nf1r = 0; // 切刀1角度
double nf2r = 0; // 切刀2角度
// 将数据中最后一段的角度赋值给起始角度
for (int j = 0; j < stepsize; j++)
{
if (absDataPtr->ctrl == DATA_EKNIFE1)
{// 切刀1 角度
nf1r= absDataPtr->ar;
}
else if (absDataPtr->ctrl == DATA_EKNIFE2)
{// 切刀2 角度
nf2r= absDataPtr->ar;
}
absDataPtr++;
}
absDataPtr = pData; //中间数据针步
for (int j = 0; j < stepsize; j++)
{
if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END))
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
if (j == 0)
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else if (absDataPtr->ctrl == DATA_EKNIFE1)
{// 切刀1 补偿
double dr = abs(absDataPtr->ar - nf1r);
if (dr >= cutRoudAng)
{// 判断夹角
absDataPtr--; // 前一针的位置(圆心)
double x = absDataPtr->ax;
double y = absDataPtr->ay;
absDataPtr++; // 当前针
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ax = x;
absItem.ay = y;
absItem.attr |= 0x20; // 临时增加拐点标志
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
nf1r = absDataPtr->ar;
}
else if (absDataPtr->ctrl == DATA_EKNIFE2)
{// 切刀2 补偿
double dr = abs(absDataPtr->ar - nf2r);
if (dr >= cutRoudAng)
{// 判断夹角
absDataPtr--; // 前一针的位置(圆心)
double x = absDataPtr->ax;
double y = absDataPtr->ay;
absDataPtr++; // 当前针
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ax = x;
absItem.ay = y;
absItem.attr |= 0x20; // 临时增加拐点标志
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
nf2r = absDataPtr->ar;
}
else
{//
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); // 保存当前针信息
}
}
absDataPtr++;
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
return 0;
}
// 偏心刀刀尖补偿(裁床专用代码)
int EmbData::setCutEccentricCompensation()
{
int cut1Radius = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cut1Radius").toInt();
int cut2Radius = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cut2Radius").toInt();
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
DsAbsItem absItem;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
// 数据区
for (int j = 0; j < stepsize; j++)
{
if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END))
{
cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem));
}
else
{
if (j == 0)
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else if (absDataPtr->ctrl == DATA_EKNIFE1)
{// 切刀1 补偿
double crt = cut1Radius*1.0; // 分割量
double r = (absDataPtr->ar) / 10000.0; // 角度(弧度制)
double cosr = (double)qCos(r);
double sinr = (double)qSin(r);
double tx = cosr * (crt*1.0);
double ty = sinr * (crt*1.0);
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ax += tx;
absItem.ay += ty;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else if (absDataPtr->ctrl == DATA_EKNIFE2)
{// 切刀2 补偿
double crt = cut2Radius*1.0; // 分割量
double r = (absDataPtr->ar) / 10000.0; // 角度(弧度制)
double cosr = (double)qCos(r);
double sinr = (double)qSin(r);
double tx = cosr * (crt*1.0);
double ty = sinr * (crt*1.0);
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ax += tx;
absItem.ay += ty;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{//
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
}
absDataPtr++;
}
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
return 0;
}
// 增加两端补偿
// 输入
int EmbData:: setCutAddCutterComption()
{
//int cutRnf1Comp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutRnf1Comp").toInt();
int cutRnf2Comp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutRnf2Comp").toInt();
if (cutRnf2Comp == 0)
{
return 0;
}
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
if (0)
{
pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
absDataPtr = pData; //中间数据针步
for (int j = 0; j < stepsize;j++)
{
qDebug()<<"3 idx:"<<j
<<" ctrl:"<<absDataPtr->ctrl
<<" attr:"<<absDataPtr->attr
<<" x:"<<absDataPtr->ax
<<" y:"<<absDataPtr->ay
;
absDataPtr++;
}
}
int begFlg = 0;
DsAbsItem absItem;
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
{
absDataPtr = pData; //中间数据针步
for (int j = 0; j < stepsize;j++)
{
if ((j == 0) ||
(absDataPtr->ctrl == DATA_OFFSET) || // 偏移
(absDataPtr->ctrl == DATA_NULL) ||
(absDataPtr->ctrl == DATA_END) ||
(absDataPtr->ctrl == DATA_DRAWING) || // 画笔
0 )
{// 找到起点
begFlg = 0;
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem));
}
else
{
if (begFlg == 0)
{// 增加起始补偿数据
begFlg = 1; // 起始点标志
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem));
}
else
{
absDataPtr++;
if ((absDataPtr->ctrl == DATA_NULL) ||
(absDataPtr->ctrl == DATA_END) ||
(absDataPtr->ctrl == DATA_OFFSET) || // 偏移
(absDataPtr->ctrl == DATA_DRAWING) || // 画笔
0 )
{// 增加收尾补偿数据
absDataPtr--;
double crt = cutRnf2Comp*1.0; // 补偿量
double r = (absDataPtr->ar) / 10000.0; // 角度(弧度制)
double cosr = (double)qCos(r);
double sinr = (double)qSin(r);
double tx = cosr * (crt*1.0);
double ty = sinr * (crt*1.0);
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ax += tx;
absItem.ay += ty;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
absDataPtr--;
// 复制当前针步
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem));
}
}
}
absDataPtr++;
}
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
if (0)
{
pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
absDataPtr = pData; //中间数据针步
for (int j = 0; j < newstepnum;j++)
{
qDebug()<<"4 idx:"<<j
<<" ctrl:"<<absDataPtr->ctrl
<<" attr:"<<absDataPtr->attr
<<" x:"<<absDataPtr->ax
<<" y:"<<absDataPtr->ay
;
absDataPtr++;
}
}
return 0;
}
// 增加转刀数据(裁床专用代码)
int EmbData::setCutRotaryCutterData()
{
int cutRoudStp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutRoudStp").toInt();
int cut1Radius = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cut1Radius").toInt();
int cut2Radius = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cut2Radius").toInt();
if (cutRoudStp == 0)
{
cutRoudStp = 10;
}
if (cut1Radius == 0)
{
return 0;
}
if (cut2Radius == 0)
{
return 0;
}
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
DsAbsItem absItem;
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
double nf1r = 0; // 切刀1角度
double nf2r = 0; // 切刀2角度
// 将数据中最后一段的角度赋值给起始角度
for (int j = 0; j < stepsize; j++)
{
if (absDataPtr->ctrl == DATA_EKNIFE1)
{// 切刀1 角度
nf1r= absDataPtr->ar;
}
else if (absDataPtr->ctrl == DATA_EKNIFE2)
{// 切刀2 角度
nf2r= absDataPtr->ar;
}
absDataPtr++;
}
if (0)
{
pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
absDataPtr = pData; //中间数据针步
for (int j = 0; j < 100;j++)
{
qDebug()<<"5 idx:"<<j
<<" ctrl:"<<absDataPtr->ctrl
<<" attr:"<<absDataPtr->attr
<<" x:"<<absDataPtr->ax
<<" y:"<<absDataPtr->ay
;
absDataPtr++;
}
}
double crt; // 分割量
double r; // 角度(弧度制)
double tx;
double ty;
double posX1,posY1; // 起点
double posX2,posY2; // 终点
double xc,yc,rc; // 圆心半径
double dr1,dr2; // 起始,终止角度
int step; // 针步
int num; // 增加针数
u8 ctrlold; //
absDataPtr = pData; //中间数据针步
// 数据区
for (int j = 0; j < stepsize; j++)
{
if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END))
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
if (j == 0)
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else if (absDataPtr->ctrl == DATA_EKNIFE1)
{// 切刀1 补偿
if ((absDataPtr->attr & 0x20) == 0x20)
{// 拐点位置针步
crt = cut1Radius*1.0; //
posX2 = absDataPtr->ax; // 终点
posY2 = absDataPtr->ay;
r = (absDataPtr->ar) / 10000.0; // 角度(弧度制)
tx = (double)qCos(r) * (crt*1.0);
ty = (double)qSin(r) * (crt*1.0);
xc = absDataPtr->ax - tx; // 圆心
yc = absDataPtr->ay - ty;
r = (nf1r) / 10000.0; // 角度(弧度制)
tx = (double)qCos(r) * (crt*1.0);
ty = (double)qSin(r) * (crt*1.0);
posX1 = xc + tx; // 起点
posY1 = yc + ty;
rc = cut1Radius*1.0; // 半径
dr1 = nf1r; // 起始角度
dr2 = absDataPtr->ar; // 终止角度
step = cutRoudStp*1.0; // 步长
if (ctrlold != DATA_EKNIFE1)
{// 在起点增加偏移数据
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ctrl = DATA_OFFSET;
absItem.attr = 0;
absItem.ax = posX1;
absItem.ay = posY1;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
num = splittingArc(posX1, posY1, posX2, posY2,
xc, yc, rc, dr1, dr2, step,
cutAbsData, absItem);
newstepnum += num;
}
else
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
nf1r = absDataPtr->ar;
}
else if (absDataPtr->ctrl == DATA_EKNIFE2)
{// 切刀2 补偿
if ((absDataPtr->attr & 0x20) == 0x20)
{// 拐点位置针步
crt = cut2Radius*1.0; //
posX2 = absDataPtr->ax; // 终点
posY2 = absDataPtr->ay;
r = (absDataPtr->ar) / 10000.0; // 角度(弧度制)
tx = (double)qCos(r) * (crt*1.0);
ty = (double)qSin(r) * (crt*1.0);
xc = absDataPtr->ax - tx; // 圆心
yc = absDataPtr->ay - ty;
r = (nf2r) / 10000.0; // 角度(弧度制)
tx = (double)qCos(r) * (crt*1.0);
ty = (double)qSin(r) * (crt*1.0);
posX1 = xc + tx; // 起点
posY1 = yc + ty;
rc = cut2Radius*1.0; // 半径
dr1 = nf2r; // 起始角度
dr2 = absDataPtr->ar; // 终止角度
step = cutRoudStp*1.0; // 步长
if (ctrlold != DATA_EKNIFE2)
{// 在起点增加偏移数据
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ctrl = DATA_OFFSET;
absItem.attr = 0;
absItem.ax = posX1;
absItem.ay = posY1;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
num = splittingArc(posX1, posY1, posX2, posY2,
xc, yc, rc, dr1, dr2, step,
cutAbsData, absItem);
newstepnum += num;
}
else
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
nf2r = absDataPtr->ar;
}
else
{//
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
}
ctrlold = absDataPtr->ctrl;
absDataPtr++;
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
if (0)
{
pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
absDataPtr = pData; //中间数据针步
for (int j = 0; j < 100;j++)
{
qDebug()<<"6 idx:"<<j
<<" ctrl:"<<absDataPtr->ctrl
<<" attr:"<<absDataPtr->attr
<<" x:"<<absDataPtr->ax
<<" y:"<<absDataPtr->ay
;
absDataPtr++;
}
}
return 0;
}
// 去掉拐点数据
int EmbData::setCutDecCornerStep()
{
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
if (0)
{
pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
absDataPtr = pData; //中间数据针步
for (int j = 0; j < stepsize;j++)
{
qDebug()<<"7 idx:"<<j
<<" ctrl:"<<absDataPtr->ctrl
<<" attr:"<<absDataPtr->attr
<<" x:"<<absDataPtr->ax
<<" y:"<<absDataPtr->ay
;
absDataPtr++;
}
absDataPtr = pData; //中间数据针步
}
DsAbsItem absItem;
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
for (int j = 0; j < stepsize; j++)
{
if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END))
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
if (1)// ((absDataPtr->ax != 0) || (absDataPtr->ay != 0)) // 不是第一针
{
if (absDataPtr->ctrl != DATA_EKNIFE1)
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absDataPtr++;
if ((absDataPtr->ctrl == DATA_EKNIFE1) &&
((absDataPtr->attr & 0x20) == 0x20) &&
1 )
{// 当前针是偏移,下一针是转刀补偿数据,将偏移数据的位置指向转刀补偿数据的起点
absItem.ax = absDataPtr->ax;
absItem.ay = absDataPtr->ay;
}
absDataPtr--;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else if (absDataPtr->ctrl != DATA_EKNIFE2)
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absDataPtr++;
if ((absDataPtr->ctrl == DATA_EKNIFE2) &&
((absDataPtr->attr & 0x20) == 0x20) &&
1 )
{// 当前针是偏移,下一针是转刀补偿数据,将偏移数据的位置指向转刀补偿数据的起点
absItem.ax = absDataPtr->ax;
absItem.ay = absDataPtr->ay;
}
absDataPtr--;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
}
}
absDataPtr++;
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
if (0)
{
pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
absDataPtr = pData; //中间数据针步
for (int j = 0; j < newstepnum;j++)
{
qDebug()<<"8 idx:"<<j
<<" ctrl:"<<absDataPtr->ctrl
<<" attr:"<<absDataPtr->attr
<<" x:"<<absDataPtr->ax
<<" y:"<<absDataPtr->ay
;
absDataPtr++;
}
}
return 0;
}
// 分割切刀数据
int EmbData::setCutFitSplitStep()
{
int cutLineMinStp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutLineMinStp").toInt();
int cutLineMaxStp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutLineMaxStp").toInt();
if (cutLineMinStp == 0)
{
cutLineMinStp = 10;
}
if (cutLineMaxStp == 0)
{
cutLineMaxStp = 10;
}
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
DsAbsItem absItem;
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
double begX; // 起始点
double begY;
// 数据区
{
for (int j = 0; j < stepsize; j++)
{
if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END))
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
if (j == 0)
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{// 分割针步
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum += splittingLine(begX, begY, absDataPtr->ax, absDataPtr->ay,
cutLineMaxStp, cutLineMaxStp,
cutAbsData, absItem); // 分割直线
}
begX = absDataPtr->ax;
begY = absDataPtr->ay;
}
absDataPtr++;
}
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
return 0;
}
// 拟合切刀数据(过滤小针步)
int EmbData::setCutFitStepData()
{
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
DsAbsItem absItem;
DsAbsItem absItemOld;
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
// 数据区
{
for (int j = 0; j < stepsize; j++)
{
if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END))
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
if (j == 0)
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.attr &= ~0x20; // 删除拐点标志
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
memcpy(&absItemOld,absDataPtr,sizeof(DsAbsItem));
}
else
{// 分割针步
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
// 线段长
double len = sqrt((absItem.ax-absItemOld.ax)*(absItem.ax-absItemOld.ax)+
(absItem.ay-absItemOld.ay)*(absItem.ay-absItemOld.ay));
if ((len <= CUT_MINST_STP) &&
(absItem.ctrl == absItemOld.ctrl ) &&
//(absItem.action == absItemOld.action ) &&
//(absItem.attr == absItemOld.attr ) &&
1)
{// 滤掉小针步
}
else
{
absItem.attr &= ~0x20; // 删除拐点标志
newstepnum++;
double tar = atan2(absItem.ay,absItem.ax);
absItem.ar = (tar * 10000+0.5*(tar>0?1:-1));
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
memcpy(&absItemOld,absDataPtr,sizeof(DsAbsItem));
}
}
}
absDataPtr++;
}
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
return 0;
}
// 飞行切割平板切割机补偿算法 coco
//#define CUT_CRUTCH_ANG (ANGLECORR) // 拐点转角判断度数,单位:10000弧度
//#define CUT_LINE_STP (3000) // 分割数据步长,单位0.01mm
//#define CUT_X_LENGH (500000) // X向可切割长度,单位0.01mm
//#define CUT_X_WINDOW (CUT_X_LENGH*3/10) // X向过窗长度:3/10
//#define CUT_X_EDGE (CUT_X_LENGH/10) // X向过窗边缘 1/10
//#define CUT_RNF_COMP (10.00) // 圆刀退刀补偿 ,单位0.01mm
#define CUT_OFFSET_SPD (80000) // 偏移速度 ,单位0.01mm/s
#define CUT_DRAWING_SPD (60000) // 画笔速度 ,单位0.01mm/s
#define CUT_CUTTING_SPD (40000) // 切割速度 ,单位0.01mm/s
#define CUT_LEFT_TIME (1) // 升降机头时间 ,单位s
#define CUT_SPD_ADJ (100) // 行进速度校准 ,范围50%~200% 单位%
#define CUT_SPD_MAX (30000) // 最大行进速度 ,单位0.01mm/s (1~65500)
//
// 增加拐点数据
int EmbData:: setCut2CornerStep()
{
int cutCrutchAng = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutCrutchAng").toInt();
if (cutCrutchAng == 0)
{
cutCrutchAng = 60;
}
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
DsAbsItem absItem;
DsAbsItem lastItem;
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
for (int j = 0; j < stepsize; j++)
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
if ((j == 0) ||
(absItem.ctrl == DATA_NULL) ||
(absItem.ctrl == DATA_END) ||
0 )
{
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else if (absItem.ctrl == DATA_OFFSET)
{// 偏移数据
memcpy(&lastItem,&absItem,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
#if(0)
double dr = abs(absItem.ar - lastItem.ar);
if ((dr >= CUT_CRUTCH_ANG) || //改成dr >= (31415/180*cutCrutchAng)
(absItem.ctrl != lastItem.ctrl) ||
0 )
{// 当两种控制字交替时,生成一个新数据(线迹起点)
if ((absItem.ctrl != DATA_OFFSET) &&
(lastItem.ctrl != DATA_OFFSET) &&
1 )
{// 如果前后两个控制字都不是偏移数据,插入一个偏移数据
absItem.ctrl = DATA_ANGLE_OLD;
absItem.ax = lastItem.ax;
absItem.ay = lastItem.ay;
absItem.ar = lastItem.ar;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
{// 新数据段起点
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ax = lastItem.ax;
absItem.ay = lastItem.ay;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
{// 新数据段
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
memcpy(&lastItem,&absItem,sizeof(DsAbsItem));
}
}
else
#endif
{
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
memcpy(&lastItem,&absItem,sizeof(DsAbsItem));
}
}
absDataPtr++;
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
return 0;
}
// 修改数据方向
int EmbData:: setCut2ModifyDataDir()
{
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
DsAbsItem * absDataPtrBuf = pData; //中间数据针步
DsAbsItem absItem;
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
double begX = 0.0 ,endX = 0.0; // 起始点/终止点X坐标
int begIdx,endIdx = 0; // 单个图元起始/终止点
// 数据区
{
absDataPtr = pData; //中间数据针步
for (int j = 0; j < stepsize;)
{
qDebug()<<"idx:"<<j <<" ctrl:"<<absDataPtr->ctrl <<" r:"<<absDataPtr->ar <<" x:"<<absDataPtr->ax <<" y:"<<absDataPtr->ay ;
if ((absDataPtr->ctrl == DATA_NULL) ||
(absDataPtr->ctrl == DATA_END) ||
0 )
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem));
j++;
absDataPtr++;
}
else if (absDataPtr->ctrl == DATA_ANGLE_OLD)
{// 找到起点拐点
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
j++;
absDataPtr++;
{//判断下一个数据
begIdx = j;
begX = absDataPtr->ax;
absDataPtrBuf = absDataPtr;
for (int i = j; i < stepsize;i++)
{
if ((absDataPtrBuf->ctrl == DATA_ANGLE_OLD) ||
(absDataPtrBuf->ctrl == DATA_NULL) ||
(absDataPtrBuf->ctrl == DATA_END) ||
0 )
{
i--;
endIdx = i;
absDataPtrBuf--;
endX = absDataPtrBuf->ax;
break;
}
absDataPtrBuf++;
}
if ((begIdx != endIdx) &&
(endX < begX) &&
1 )
{// 反转数据
for (int i = endIdx; i >= begIdx;i--)
{
memcpy(&absItem,absDataPtrBuf,sizeof(DsAbsItem));
absItem.attr |= 0x01; // 反向标志
absItem.ar += PI10000; // 方向反向
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
qDebug()<<"idx:"<<j <<" ctrl:"<<absDataPtr->ctrl <<" r:"<<absDataPtr->ar <<" x:"<<absDataPtr->ax <<" y:"<<absDataPtr->ay ;
j++;
absDataPtr++;
absDataPtrBuf--;
}
}
}
}
else
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
j++;
absDataPtr++;
}
}
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
if (0)
{
pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
absDataPtr = pData; //中间数据针步
for (int j = 0; j < stepsize;j++)
{
qDebug()<<"end idx:"<<j
<<" ctrl:"<<absDataPtr->ctrl
<<" r:"<<absDataPtr->ar
<<" x:"<<absDataPtr->ax
<<" y:"<<absDataPtr->ay
;
absDataPtr++;
}
}
return 0;
}
// 分割切刀数据
int EmbData:: setCut2FitSplitStep()
{
int cutLineStp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutLineStp").toInt();
if(cutLineStp == 0)
{
cutLineStp = 3000;
}
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
DsAbsItem absItem;
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
double begX; // 起始点
double begY;
// 数据区
{
for (int j = 0; j < stepsize; j++)
{
if ((absDataPtr->ctrl == DATA_NULL) || (absDataPtr->ctrl == DATA_END))
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
if (j == 0)
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{// 分割针步
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum += splittingLine(begX, begY, absDataPtr->ax, absDataPtr->ay,
cutLineStp, cutLineStp,
cutAbsData, absItem); // 分割直线
}
begX = absDataPtr->ax;
begY = absDataPtr->ay;
}
absDataPtr++;
}
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
if (0)
{
pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
absDataPtr = pData; //中间数据针步
for (int j = 0; j < stepsize;j++)
{
qDebug()<<"end idx:"<<j
<<" ctrl:"<<absDataPtr->ctrl
<<" r:"<<absDataPtr->ar
<<" x:"<<absDataPtr->ax
<<" y:"<<absDataPtr->ay
;
absDataPtr++;
}
}
return 0;
}
// 判断区间
// 输入
//#define CUT_X_LENGH (500000) // X向可切割长度
//#define CUT_X_WINDOW (CUT_X_LENGH*4/10) // X向过窗长度:4/10
//#define CUT_X_EDGE (CUT_X_LENGH/10) // X向过窗边缘 1/10
int EmbData:: setCut2JudgInterval()
{
int cutXWindow = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutXLengh").toInt();
if(cutXWindow == 0)
{
cutXWindow = 500000;
}
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
// 求花样X范围
double maxX = S32_MIN;
double minX = S32_MAX;
absDataPtr = pData; //中间数据针步
for (int j = 0; j < stepsize; j++)
{
if (//(j == 0) ||
(absDataPtr->ctrl == DATA_NULL) ||
(absDataPtr->ctrl == DATA_END) ||
(absDataPtr->ctrl == DATA_ANGLE_OLD) ||
(absDataPtr->ctrl == DATA_OFFSET) ||
0 )
{
}
else
{//
if(absDataPtr->ax > maxX)
{
maxX = absDataPtr->ax;
}
if(absDataPtr->ax < minX)
{
minX = absDataPtr->ax;
}
}
absDataPtr++;
}
// 分割窗口数量
int winNum,curWin,begFlg;
int maxWinX = 0; // 当前窗口最大值
int minWinX = 0; // 当前窗口最小值
curWin = 1;
begFlg = 0;
winNum = floor((maxX - minX) / (cutXWindow*3/10)) + 1;
qDebug()<<"maxx:"<<maxX<<" minx:"<<minX<<" winNum:"<<winNum;
DsAbsItem absItem;
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
{
absDataPtr = pData; //中间数据针步
for (int j = 0; j < stepsize;j++)
{
if ((absDataPtr->ctrl == DATA_NULL) ||
(absDataPtr->ctrl == DATA_END) ||
0 )
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem));
}
else if ((absDataPtr->ctrl == DATA_ANGLE_OLD) ||
(absDataPtr->ctrl == DATA_OFFSET) ||
0 )
{// 找到起点拐点
begFlg = 0;
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
double dtx = absDataPtr->ax - minX;
if (begFlg == 0)
{
begFlg = 1; // 起始点标志
curWin = floor(dtx / (cutXWindow*3/10));
maxWinX = (cutXWindow*3/10) * (curWin + 1) + (cutXWindow/10); // 当前窗口最大值
minWinX = (cutXWindow*3/10) * (curWin) - (cutXWindow/10); // 当前窗口最小值
if (0)
{
qDebug()<<"curWin:"<<curWin
<<" ax:"<<(absDataPtr->ax - minX)
<<" Win:"<<(cutXWindow*3/10)
<<" maxWinX:"<<maxWinX
<<" minWinX:"<<minWinX
;
}
}
if ((dtx < maxWinX) && (dtx >= minWinX))
{// 当前窗口
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.action = curWin;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else if (dtx >= maxWinX)
{// 下一个窗口
curWin++;
begFlg = 0;
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ctrl = DATA_ANGLE_OLD;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); // 增加一个拐点
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.action = curWin;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else if (dtx < minWinX)
{// 上一个窗口
curWin--;
begFlg = 0;
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ctrl = DATA_ANGLE_OLD;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem)); // 增加一个拐点
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.action = curWin;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
}
absDataPtr++;
}
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
if (0)
{
pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
absDataPtr = pData; //中间数据针步
for (int j = 0; j < newstepnum;j++)
{
qDebug()<<"end idx:"<<j
<<" ctrl:"<<absDataPtr->ctrl
<<" action:"<<absDataPtr->action
<<" x:"<<absDataPtr->ax
<<" y:"<<absDataPtr->ay
;
absDataPtr++;
}
}
return 0;
}
// 增加圆刀数据两端补偿
// 输入
//#define CUT_RNF_COMP (1000) // 圆刀退刀补偿 ,单位0.01mm
int EmbData:: setCut2AddCutterComption()
{
int cutRnfComp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutRnfComp").toInt();
if(cutRnfComp == 0)
{
return -1;
}
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
if (0)
{
pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
absDataPtr = pData; //中间数据针步
for (int j = 0; j < stepsize;j++)
{
qDebug()<<"123 idx:"<<j
<<" ctrl:"<<absDataPtr->ctrl
<<" x:"<<absDataPtr->ax
<<" y:"<<absDataPtr->ay
;
absDataPtr++;
}
}
bool isCuttingData = false;//上一针是切割数据
DsAbsItem absItem;
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
absDataPtr = pData; //中间数据针步
for (int j = 0; j < stepsize;j++)
{
if ((j == 0) ||
(absDataPtr->ctrl == DATA_NULL) ||
(absDataPtr->ctrl == DATA_END) ||
(absDataPtr->ctrl == DATA_ANGLE_OLD) || // 拐点
(absDataPtr->ctrl == DATA_OFFSET) || // 偏移
(absDataPtr->ctrl == DATA_DRAWING) ) // 画笔
{// 找到起点
isCuttingData = false;
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem));
}
else
{
if (!isCuttingData)//上一针不是切割数据
{// 增加起始补偿数据
isCuttingData = true; // 起始点标志
double crt = cutRnfComp*1.0; // 补偿量
double r = (absDataPtr->ar) / 10000.0; // 角度(弧度制)
double cosr = (double)qCos(r);
double sinr = (double)qSin(r);
double tx = cosr * (crt*1.0);
double ty = sinr * (crt*1.0);
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ax -= tx;
absItem.ay -= ty;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
// 复制当前针步
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
newstepnum++;
cutAbsData.append((char*)(absDataPtr), sizeof(DsAbsItem));
if (isCuttingData) //上一针是切割数据
{// 增加收尾补偿数据
absDataPtr++;
if ((absDataPtr->ctrl == DATA_NULL) ||
(absDataPtr->ctrl == DATA_END) ||
(absDataPtr->ctrl == DATA_ANGLE_OLD) || // 拐点
(absDataPtr->ctrl == DATA_OFFSET) || // 偏移
(absDataPtr->ctrl == DATA_DRAWING)) // 画笔
{
absDataPtr--;
double crt = cutRnfComp*1.0; // 补偿量
double r = (absDataPtr->ar) / 10000.0; // 角度(弧度制)
double cosr = (double)qCos(r);
double sinr = (double)qSin(r);
double tx = cosr * (crt*1.0);
double ty = sinr * (crt*1.0);
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
absItem.ax += tx;
absItem.ay += ty;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else
{
absDataPtr--;
}
}
}
absDataPtr++;
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
return 0;
}
//yct实现
int EmbData::setCut2AddCutterComption2()
{
qDebug()<<__FUNCTION__;
//补偿长度
int cutRnfComp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutRnfComp").toInt();
double comDistance = cutRnfComp*1.0 ; // 补偿量
//垂直补偿
int cutVertComp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutVertComp").toInt();
double comDistanceVert = cutVertComp*1.0 ; // 补偿量
//补偿最大角度
int cutCrutchAng = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutCrutchAng").toInt();
double cutMaxAng = (cutCrutchAng * PI / 180) * 10000; //转换为弧度
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
#if 0
pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
absDataPtr = pData; //中间数据针步
qDebug() << __FUNCTION__ << "PreCompensation Ptr stepsize+++++++++++++++++++++++++++++" << stepsize;
for (int j = 0; j < stepsize;j++)
{
qDebug()<<"idx:"<< j <<" x:"<<absDataPtr->ax <<" y:"<<absDataPtr->ay << "ar:" << absDataPtr->ar <<" ctrl:"<< QString::number(absDataPtr->ctrl,16);;
absDataPtr++;
}
#endif
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
absDataPtr = pData; //中间数据针步
DsAbsItem preAbsItem;//前一针
int firstCutData = 0; //第一帧数据
for (int j = 0; j < stepsize; j++)
{
// 复制当前针步
DsAbsItem curAbsItem;
memcpy(&curAbsItem,absDataPtr,sizeof(DsAbsItem));
if((firstCutData == 0) && (curAbsItem.ctrl == DATA_RKNIFE || curAbsItem.ctrl == DATA_SKNIFE)){
firstCutData = 1;
}
DsAbsItem * nextItemPtr = absDataPtr + 1;
DsAbsItem nextItem;
memcpy((char*)&nextItem,(char *)nextItemPtr,sizeof(DsAbsItem));
double dr = qAbs(nextItem.ar) - qAbs(curAbsItem.ar); //偏转角度
dr = qAbs(dr);
//倒数第一针 //结尾补偿
if((j == stepsize - 1) && isCutCtrl(curAbsItem.ctrl)){
cutDataEndCompensate(curAbsItem,preAbsItem,comDistance);
cutDataVertCut(curAbsItem, comDistanceVert, cutAbsData,newstepnum);
}
else if(j == 0){//第一针不处理
}
//结尾补偿
else if( isCutCtrl(curAbsItem.ctrl)
&& (nextItem.ctrl == DATA_NULL || nextItem.ctrl == DATA_END
|| nextItem.ctrl == DATA_ANGLE_OLD || nextItem.ctrl == DATA_OFFSET )
&& 1)
{
cutDataEndCompensate(curAbsItem,preAbsItem,comDistance);
cutDataVertCut(curAbsItem, comDistanceVert, cutAbsData,newstepnum);
}
//开头补偿
else if (isCutCtrl(nextItem.ctrl)
&& (curAbsItem.ctrl == DATA_NULL || curAbsItem.ctrl == DATA_END
|| curAbsItem.ctrl == DATA_ANGLE_OLD || curAbsItem.ctrl == DATA_OFFSET )
&& 1)
{
cutDataStartCompensate(curAbsItem,preAbsItem,nextItem,comDistance);
}
//切割数据中大角度分割
else if((isCutCtrl(preAbsItem.ctrl))
&& (isCutCtrl(curAbsItem.ctrl))
&& (dr > cutMaxAng)
&& (comDistance > 0.0)
&& ((curAbsItem.ay != nextItem.ay) || (curAbsItem.ax != nextItem.ax))
&& 1)
{
// qDebug()<< " cur double end :" << j << "x :" << curAbsItem.ax << "y :" << curAbsItem.ay << "dr:" << dr << "cutMaxAng :" <<cutMaxAng << " ctrl" <<QString::number(curAbsItem.ctrl,16);
//前一个针步延长
DsAbsItem endExItem; //结尾延长
endExItem = curAbsItem;
cutDataEndCompensate(endExItem,preAbsItem,comDistance);
//添加结尾补偿针
newstepnum++;
cutAbsData.append((char*)(&endExItem), sizeof(DsAbsItem));
//后一个针步起点补偿
curAbsItem.ctrl = DATA_OFFSET;
cutDataStartCompensate(curAbsItem,preAbsItem,nextItem,comDistance);
}
newstepnum++;
cutAbsData.append((char*)(&curAbsItem), sizeof(DsAbsItem));//添加这一针
preAbsItem = curAbsItem;//记录针
absDataPtr++;
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
return 0;
}
// 排序&组成新数据
int EmbData:: setCut2SortNewData()
{
qDebug()<<__FUNCTION__;
//是否启用画笔
//bool enableBrush = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutEnableBrush").toBool();
bool enableBrush = true;
int i,j;
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
int winNum = 0; // 窗口个数范围
int begFlg = 0;
DsAbsItem * absDataPtrWin = pData; //中间数据针步
for (j = 0; j < stepsize; j++)
{
if (winNum < absDataPtrWin->action)
{
winNum = absDataPtrWin->action;
}
absDataPtrWin++;
}
winNum++;
// 数据分类
QVector<QVector<QByteArray> > penVisited(winNum, QVector<QByteArray>(0)); // 画笔数据
QVector<QVector<QByteArray> > cutShakeVisited(winNum, QVector<QByteArray>(0)); // 震刀数据
QVector<QVector<QByteArray> > cutRountVisited(winNum, QVector<QByteArray>(0)); // 圆刀数据
#if 0
DsAbsItem * pData1 = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr1 = pData1; //中间数据针步
qDebug() << __FUNCTION__ << "stepsize+++++++++++++++++++++++++++++" << stepsize;
for (int j = 0; j < stepsize;j++)
{
qDebug()<<"idx:"<< j <<" x:"<<absDataPtr1->ax <<" y:"<<absDataPtr1->ay << "ar:" << absDataPtr1->ar <<" ctrl:"<< QString::number(absDataPtr1->ctrl,16);;
absDataPtr1++;
}
#endif
QByteArray ary;
DsAbsItem absItem;
DsAbsItem * preDataPtr; //前一步指针
DsAbsItem * absDataPtr = pData; //中间数据针步
//偏移数据和拐角数据的赋值策略不一样
double preAxData = absDataPtr->ax; //上一个切割数据X
double preAyData = absDataPtr->ay; //上一个切割数据Y
double preAxAngleOld = absDataPtr->ax; //上一个切割数据X
double preAyAngleOld = absDataPtr->ay; //上一个切割数据Y
bool offsetFlg = false;//偏移数据标志位
for (j = 0; j < stepsize; j++)
{
if ((absDataPtr->ctrl == DATA_NULL) ||
(absDataPtr->ctrl == DATA_END) ||
(absDataPtr->ctrl == DATA_ANGLE_OLD) ||
(absDataPtr->ctrl == DATA_OFFSET))
{
begFlg = 0;
//如果是偏移数据 则记录最后一针位置,
//然后赋值给拐角数据,这样在偏移的时候不会少第一针
if(absDataPtr->ctrl == DATA_OFFSET){
preAxAngleOld = absDataPtr->ax;
preAyAngleOld = absDataPtr->ay;
offsetFlg = true;
}
}
else if (begFlg == 0)
{
// 增加拐点
begFlg = 1; // 起始点标志
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
if(offsetFlg) //偏移数据 赋值上一拐角数据位置
{
absItem.ax = preAxAngleOld;
absItem.ay = preAyAngleOld;
offsetFlg = false;
}else{ //拐角数据 赋值上一针切割数据位置
absItem.ax = preAxData;
absItem.ay = preAyData;
}
absItem.ctrl = DATA_ANGLE_OLD;
ary.clear();
ary.append((char*)&absItem, sizeof(DsAbsItem));
if (absDataPtr->ctrl == DATA_DRAWING)
{// 画笔数据
penVisited[absItem.action].append(ary);
}
else if(absDataPtr->ctrl == DATA_SKNIFE)
{
cutShakeVisited[absItem.action].append(ary);
}
else if(absDataPtr->ctrl == DATA_RKNIFE)
{
cutRountVisited[absItem.action].append(ary);
}
}
//记录切割数据 拐角数据分割区域的时候需要赋值
if(absDataPtr->ctrl == DATA_DRAWING
|| absDataPtr->ctrl == DATA_SKNIFE
||absDataPtr->ctrl == DATA_RKNIFE)
{
preAxData = absDataPtr->ax;
preAyData = absDataPtr->ay;
}
if( (j!=0) //绝对位置没变化角度也要同前一个
&&(preDataPtr->ax == absDataPtr->ax)
&& (preDataPtr->ay == absDataPtr->ay)
&&(preDataPtr->ctrl == absDataPtr->ctrl))
{
absDataPtr->ar = preDataPtr->ar;
}
// 增加数据
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
ary.clear();
ary.append((char*)&absItem, sizeof(DsAbsItem));
if (absDataPtr->ctrl == DATA_DRAWING)
{// 画笔数据
penVisited[absItem.action].append(ary);
}
else if(absDataPtr->ctrl == DATA_SKNIFE)
{
cutShakeVisited[absItem.action].append(ary);
}
else if(absDataPtr->ctrl == DATA_RKNIFE)
{
cutRountVisited[absItem.action].append(ary);
}
preDataPtr = absDataPtr;
absDataPtr++;
}
//optimizationOrder(penVisited,absItem,winNum,DATA_DRAWING);//画笔不排序-注释
optimizationOrder(cutShakeVisited,absItem,winNum,DATA_SKNIFE);
optimizationOrder(cutRountVisited,absItem,winNum,DATA_RKNIFE);
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
// 合并数据
cutAbsData.clear();
s16 penFlag = 0;
for (i = 0; i<winNum;i++)
{
penFlag = 0;
if(enableBrush)
{
int penIndex = i;
int stepnumPen = penVisited[penIndex].size(); // 画笔数据
qDebug() << "stepnumPen" << stepnumPen;
if (stepnumPen > 0)
{
newstepnum += stepnumPen;
for (j = 0;j<stepnumPen;j++)
{
cutAbsData.append(penVisited[penIndex][j]);
memcpy((char*)&absItem, (char *)penVisited[penIndex][j].data(), sizeof(DsAbsItem));
}
penFlag = 1;
}
}
int stepCutShake = cutShakeVisited[i].size(); // 切刀数据
qDebug() << "stepCutShake" << stepCutShake;
if (stepCutShake > 0)
{
//画笔与切刀数据转换之间增加偏移属性
if(penFlag == 1)
{
DsAbsItem item;
memcpy(&item,cutShakeVisited[i][0].data(),sizeof(DsAbsItem));
if(item.ctrl != DATA_OFFSET)
{
item.ctrl = DATA_OFFSET;
}
cutAbsData.append((char*)&item,sizeof(DsAbsItem));
penFlag = 0;
}
newstepnum += stepCutShake;
for (j = 0;j < stepCutShake;j++)
{
cutAbsData.append(cutShakeVisited[i][j]);
memcpy((char*)&absItem, (char *)cutShakeVisited[i][j].data(), sizeof(DsAbsItem));
}
}
int stepCutRound = cutRountVisited[i].size(); // 圆刀数据
qDebug() << "stepCutRound" << stepCutRound;
if (stepCutRound > 0)
{
//画笔与切刀数据转换之间增加偏移属性
if(penFlag == 1)
{
DsAbsItem item;
memcpy(&item,cutRountVisited[i][0].data(),sizeof(DsAbsItem));
if(item.ctrl != DATA_OFFSET)
{
item.ctrl = DATA_OFFSET;
}
cutAbsData.append((char*)&item,sizeof(DsAbsItem));
penFlag = 0;
}
newstepnum += stepCutRound;
for (j = 0;j < stepCutRound;j++)
{
cutAbsData.append(cutRountVisited[i][j]);
memcpy((char*)&absItem, (char *)cutRountVisited[i][j].data(), sizeof(DsAbsItem));
}
}
}
//重新计算角度,因为线条进行了排序,所以要重新计算角度
DsAbsItem * ptr = (DsAbsItem *)(cutAbsData.data());
double prex = 0;
double prey = 0;
double curx = 0;
double cury = 0;
double ddx = 0;
double ddy = 0;
for(int i = 0; i < newstepnum; i++)
{
curx = ptr->ax;
cury = ptr->ay;
ddx = curx - prex;
ddy = cury - prey;
if(ddx == 0 && ddy == 0 && i > 0)
{
DsAbsItem * ptrPre = ptr;
ptrPre--;
ptr->ar = ptrPre->ar;
}
else
{
double tar = atan2(ddy,ddx);
ptr->ar = (tar * 10000+0.5*(tar>0?1:-1));
}
prex = curx;
prey = cury;
ptr++;
}
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
#if 0
DsAbsItem * cutAbsPtr = (DsAbsItem *)cutAbsData.data();
qDebug()<< "cutAbsData stepsize" << newstepnum;
for(int i = 0 ; i< newstepnum;i++){
qDebug()<<"cutAbsData printPtr:"<< "Index :" << i << " ax" << cutAbsPtr->ax << " ay" << cutAbsPtr->ay <<" ctrl" <<QString::number(cutAbsPtr->ctrl,16);
cutAbsPtr++;
}
#endif
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
return 0;
}
// 增加偏移数据,结束码
int EmbData:: setCut2AddOffsetData()
{
qDebug()<<__FUNCTION__;
int cutLineStp = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutLineStp").toInt();
if(cutLineStp == 0)
{
cutLineStp = 3000;
}
int size = m_embAbsData.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DataDs16FileHead * pHead = (DataDs16FileHead *)(m_embAbsData.data());
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
DsAbsItem absItem;
int newstepnum = 0;
QByteArray cutAbsData; // 切割临时数据
cutAbsData.clear();
#if 0
DsAbsItem * cutAbsPtr = absDataPtr;
qDebug()<< "Pre AddOffsetData stepsize+++++++++++++++++++++++++++++" << stepsize;
for(int i = 0 ; i< stepsize;i++){
qDebug()<<"AddOffsetDataAndEnd Ptr:"<< "Index :" << i << " ax" << cutAbsPtr->ax << " ay" << cutAbsPtr->ay <<" ctrl" <<QString::number(cutAbsPtr->ctrl,16) << "winNum" <<cutAbsPtr->action;
if(cutAbsPtr->ctrl == DATA_ANGLE_OLD)
qDebug()<<" == ";
cutAbsPtr++;
}
#endif
// 数据区
double begX = 0;// 起始点
double begY = 0;
for (int j = 0; j < stepsize; j++)
{
memcpy(&absItem,absDataPtr,sizeof(DsAbsItem));
if (j == 0)
{
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
else if (absItem.ctrl == DATA_ANGLE_OLD)
{// 分割偏移数据
absItem.ctrl = DATA_OFFSET;
absItem.attr = 0;
if ((begX != absDataPtr->ax) || (begY != absDataPtr->ay))
{
newstepnum += splittingLine(begX, begY, absDataPtr->ax, absDataPtr->ay,
cutLineStp, cutLineStp,
cutAbsData, absItem); // 分割直线
}
}
else
{
absItem.attr = 0;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
}
begX = absItem.ax;
begY = absItem.ay;
absDataPtr++;
}
//结束码
absItem.ctrl = DATA_NULL;
newstepnum++;
cutAbsData.append((char*)(&absItem), sizeof(DsAbsItem));
pHead->dataSize = newstepnum*sizeof(DsAbsItem); // 数据字节数
pHead->itemNums = newstepnum; // 数据项个数
cutAbsData.insert(0,(char*)pHead,sizeof(DataDs16FileHead)); // 插入文件头
m_embAbsData.clear();
m_embAbsData = cutAbsData;
m_editedflag = 1;
return 0;
}
// 计算最大行进速度 (返回值单位: 0.01mm/s)
// 输入
//#define CUT_OFFSET_SPD (100) // 偏移速度 ,单位0.01mm/s
//#define CUT_DRAWING_SPD (100) // 画笔速度 ,单位mm/s
//#define CUT_CUTTING_SPD (100) // 切割速度 ,单位mm/s
//#define CUT_LEFT_TIME (1) // 升降机头时间 ,单位s
//#define CUT_SPD_ADJ (100) // 行进速度校准 ,范围50%~200% 单位%
int EmbData:: setCut2CalMaxSpd()
{
int cutXWindow = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutXLengh").toInt();
if(cutXWindow == 0)
{
cutXWindow = 500000;
}
int j;
int size = m_embDs16Data.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(Ds16Item);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
else
{
qDebug()<<"stepsize"<<stepsize;
}
Ds16Item * pData = (Ds16Item *)(m_embDs16Data.data() + sizeof(DataDs16FileHead));
Ds16Item * embDataPtr = pData;
Ds16Item * curDataPtr;
// 数据区
{
int winNum;
winNum = 0; // 窗口个数范围
u16 curWin; // 当前窗口
curDataPtr = embDataPtr;
for (j = 0; j < stepsize; j++)
{
curWin = MAKEWORD(curDataPtr->action[0],curDataPtr->action[1]);
if (winNum < curWin)
{
winNum = curWin;
}
curDataPtr++;
}
winNum++;
double winSpd[winNum]; // 窗口速度
double penlen[winNum]; // 画笔长度
double cutlen[winNum]; // 裁切长度
double ofstlen[winNum]; // 偏移长度
u32 leftTim[winNum]; // 升降次数
for (j = 0; j < winNum; j++)
{
winSpd[j] = 0; // 窗口速度
penlen[j] = 0; // 画笔长度
cutlen[j] = 0; // 裁切长度
ofstlen[j] = 0; // 偏移长度
leftTim[j] = 0; // 升降次数
}
// 数据区
{
double lastX = 0;
double lastY = 0;
double curX = 0;
double curY = 0;
double len = 0;
u8 laetCtrl = DATA_OFFSET;
curDataPtr = embDataPtr;
for (j = 0; j < stepsize; j++)
{
if (j == 0)
{
}
else if (curDataPtr->ctrl == DATA_OFFSET)
{// 偏移数据
curX = curDataPtr->dx;
curY = curDataPtr->dy;
len = sqrt((lastX-curX)*(lastX-curX)+(lastY-curY)*(lastY-curY));
curWin = MAKEWORD(curDataPtr->action[0],curDataPtr->action[1]);
ofstlen[curWin] += len;
}
else if (curDataPtr->ctrl == DATA_DRAWING)
{// 画笔数据
curX = curDataPtr->dx;
curY = curDataPtr->dy;
len = sqrt((lastX-curX)*(lastX-curX)+(lastY-curY)*(lastY-curY));
curWin = MAKEWORD(curDataPtr->action[0],curDataPtr->action[1]);
penlen[curWin] += len;
}
else
{// 裁切数据
curX = curDataPtr->dx;
curY = curDataPtr->dy;
len = sqrt((lastX-curX)*(lastX-curX)+(lastY-curY)*(lastY-curY));
cutlen[curDataPtr->action[0]] += len;
}
if (laetCtrl != curDataPtr->ctrl)
{
laetCtrl = curDataPtr->ctrl;
curWin = MAKEWORD(curDataPtr->action[0],curDataPtr->action[1]);
leftTim[curWin] += 2; // 升降次数+2
}
lastX = curDataPtr->dx;
lastY = curDataPtr->dy;
curDataPtr++;
}
for (j = 0; j < winNum; j++)
{// 计算过窗传送电机最大行进速度
double time = 0;
time += cutlen[j] / CUT_CUTTING_SPD; // 裁切时间(单位:s)
time += penlen[j] / CUT_DRAWING_SPD; // 画笔时间(单位:s)
time += ofstlen[j] / CUT_OFFSET_SPD; // 偏移时间(单位:s)
time += leftTim[j] * CUT_LEFT_TIME; // 升降时间(单位:s)
if (time == 0)
{
winSpd[j] = CUT_SPD_MAX;
}
else
{
winSpd[j] = ((cutXWindow*3/10) * CUT_SPD_ADJ / 100 / time);
}
if (winSpd[j] > CUT_SPD_MAX)
{
winSpd[j] = CUT_SPD_MAX;
}
if (winSpd[j] == 0)
{
winSpd[j] = 1;
}
qDebug()<<"winSpd["<<j<<"]="<<winSpd[j];
}
{// 将最大速度保存到针步中
U32ToU8 curmaxpps;
for (j = 0; j < stepsize; j++)
{
curWin = MAKEWORD(embDataPtr->action[0],curDataPtr->action[1]);
curmaxpps.buf32 = (u32)(winSpd[curWin]);
memcpy(&embDataPtr->rev,&curmaxpps.buf32,4);
embDataPtr++;
}
}
}
}
return 0;
}
void EmbData::recalculateAngles()
{
qDebug()<<__FUNCTION__;
u32 size = m_embAbsData.size();
if (size < sizeof(DataDs16FileHead))
{
return ;
}
DsAbsItem * pData = (DsAbsItem *)(m_embAbsData.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
int stepsize = (size - sizeof(DataDs16FileHead))/sizeof(DsAbsItem);
DsAbsItem * lastItem;
memset(&lastItem,0,sizeof(DsAbsItem));
qDebug() <<__FUNCTION__<< "stepsize:" <<stepsize;
for (int j = 0; j < stepsize - 1; j++)
{
#if 0
qDebug()<< "index "<< j<<" ax" << absDataPtr->ax << "ay" << absDataPtr->ay << "ctrl" <<QString::number(absDataPtr->ctrl,16);
#endif
if (j == 0)
{
lastItem->ax = 0;
lastItem->ay = 0;
}
s32 ar = calculateAngles(absDataPtr->ax, absDataPtr->ay, lastItem->ax, lastItem->ay);
absDataPtr->ar = ar;
//先赋值再递增
lastItem = absDataPtr++;
}
}
s32 EmbData::calculateAngles(double endX, double endY, double beginX, double beginY)
{
double Dx = endX - beginX ;
double Dy = endY - beginY ;
double tar = atan2(Dy,Dx);
s32 ar = (tar * 10000+0.5*(tar>0?1:-1));
return ar;
}
//切割数据结尾的补偿 移动结尾切割点的方法
void EmbData::cutDataEndCompensate(DsAbsItem &curItem,DsAbsItem &preItem, double comDistance)
{
if(comDistance <= 0.0)
return;
// curItem.ar = calculateAngles(curItem.ax,curItem.ay,preItem.ax,preItem.ay);
double preR = curItem.ar / 10000.0;
double comDisX = qCos(preR) * comDistance;
double comDisY = qSin(preR) * comDistance;
//切割数据正向移动
curItem.ax += comDisX;
curItem.ay += comDisY;
if(preItem.ctrl == 0){}//为了去掉警告
}
//添加切割数据结尾 垂直补偿
void EmbData::cutDataVertCut(DsAbsItem &curItem, double comDistance, QByteArray &cutAbsData,int &newstepnum)
{
if(comDistance <= 0.0)
return;
//添加原始切割终点
newstepnum++;
cutAbsData.append((char*)(&curItem), sizeof(DsAbsItem));
qDebug()<<"CrossCut ADD Point:" <<" x:"<<curItem.ax <<" y:"<<curItem.ay<< "ar:" << curItem.ar <<" ctrl:"<< QString::number(curItem.ctrl,16);
int angle = 45;//45度夹角
double includedAngle = (angle * PI / 180) * 10000; //转换为弧度
//新增偏移点 移动到小横切起始点
double arOffsetPoint = curItem.ar +includedAngle ;
double offsetX = qCos(arOffsetPoint / 10000.0) * comDistance;
double offsetY = qSin(arOffsetPoint / 10000.0) * comDistance;
DsAbsItem offsetPoint;
memcpy((char*)&offsetPoint, (char*)&curItem, sizeof(DsAbsItem));
offsetPoint.ctrl = DATA_OFFSET;
offsetPoint.ax -= offsetX;
offsetPoint.ay -= offsetY;
offsetPoint.ar = calculateAngles(offsetPoint.ax,offsetPoint.ay,curItem.ax,curItem.ay);
newstepnum++;
cutAbsData.append((char*)(&offsetPoint), sizeof(DsAbsItem));
qDebug()<<"CrossCut ADD offsetPoint:" <<" x:"<<offsetPoint.ax <<" y:"<<offsetPoint.ay<< "ar:" << offsetPoint.ar <<" ctrl:"<< QString::number(offsetPoint.ctrl,16);;
//小横切针步
//此针会在调用函数的循环中被添加
double arCutPoint = curItem.ar - includedAngle;
offsetX = qCos(arCutPoint / 10000.0) * comDistance;
offsetY = qSin(arCutPoint / 10000.0) * comDistance;
curItem.ax -= offsetX;
curItem.ay -= offsetY;
curItem.ar = calculateAngles(curItem.ax,curItem.ay,offsetPoint.ax,offsetPoint.ay);
qDebug()<<"cur Point:" <<" x:"<<curItem.ax <<" y:"<<curItem.ay<< "ar:" << curItem.ar <<" ctrl:"<< QString::number(curItem.ctrl,16);;
}
//切割数据开头的补偿 移动切割起始点
void EmbData::cutDataStartCompensate(DsAbsItem &curItem, DsAbsItem &preItem, DsAbsItem &nextItem, double comDistance)
{
if(comDistance <= 0)
return;
double nextR = nextItem.ar / 10000.0; //下一针的绝对角度
double comDisX = qCos(nextR) * comDistance;
double comDisY = qSin(nextR) * comDistance;
//跨步数据反向移动
curItem.ax -= comDisX;
curItem.ay -= comDisY;
//计算偏移角度
curItem.ar = calculateAngles(curItem.ax, curItem.ay, preItem.ax, preItem.ay);
}
bool EmbData::isCutCtrl(u8 &ctrl)
{
return (ctrl == DATA_RKNIFE || ctrl == DATA_SKNIFE );
}
void EmbData::optimizationOrder(QVector<QVector<QByteArray> > &visited, DsAbsItem &absItem,int winNum,u8 ctrl)
{
if(winNum <= 1)
{
return;
}
if(absItem.ctrl == 0){}//为了去掉警告
int stepnum = 0;
QVector<QVector<QByteArray> > cpvisited;
cpvisited = visited;
int flag = 0;
double ax,ay;
ax = ay = 0;
for (int i=0;i<winNum;i++)
{
int duan = 0; // 数据段
DsAbsItem * tmpDataPtr; //数据针步
stepnum = visited[i].size(); // 数据
for (int j = 0;j<stepnum;j++)
{// 判断段数
tmpDataPtr = (DsAbsItem *)(visited[i][j].data());
if (tmpDataPtr->ctrl == DATA_ANGLE_OLD)
{
duan++;
}
}
// qDebug()<< "optimizationOrder :duan :" <<duan;
if (duan < 0)
{
return;
}
QVector<QVector<QByteArray> > duanData(duan, QVector<QByteArray>(0)); // 临时数据 (正向)
// qDebug()<< "optimizationOrder :stepnum :" <<stepnum;
int k = -1;
for (int j = 0;j<stepnum;j++)
{// 拆分段,给临时数据赋值
tmpDataPtr = (DsAbsItem *)(visited[i][j].data());
if (tmpDataPtr->ctrl == DATA_ANGLE_OLD)
{
k++;
tmpDataPtr->ctrl = ctrl;
duanData[k].append(QByteArray((char*)tmpDataPtr, sizeof(DsAbsItem))); // 保存正向数据
}
else
{
duanData[k].append(QByteArray((char*)tmpDataPtr, sizeof(DsAbsItem))); // 保存正向数据
}
}
//重组数据
cpvisited[i].clear();
QVector<QVector<QByteArray> > cpduanData;
cpduanData = duanData;
for (k=0;k<duan;k++)
{
if (duanData[k].size() != 0)
{
for(int m = 0; m < duanData[k].size(); m++)
{
tmpDataPtr = (DsAbsItem *)(duanData[k][m].data());
if(tmpDataPtr->ctrl != DATA_SKNIFE && tmpDataPtr->ctrl != DATA_RKNIFE)
{
cpvisited[i].append(QByteArray((char*)tmpDataPtr, sizeof(DsAbsItem))); // 增加数据
}
else
{
if(flag == 0)
{
ax = tmpDataPtr->ax;
ay = tmpDataPtr->ay;//终点坐标
cpvisited[i].append(QByteArray((char*)tmpDataPtr, sizeof(DsAbsItem))); // 增加数据
}
else
{
int idx = -1;//索引
QList<int> dirList;//方向0为正向
dirList.clear();
u32 len = U32_MAX;
int dir = 0;
//扫描哪个段的起点离上个段的终点最近
for(int p=0;p<cpduanData.size();p++)
{
dir = 0;
if (cpduanData[p].size() != 0)
{
DsAbsItem *tmpDataPtr1 = (DsAbsItem *)(cpduanData[p][0].data());
DsAbsItem *tmpDataPtr2 = (DsAbsItem *)(cpduanData[p][cpduanData[p].size()-1].data());
u32 len1 = sqrt((tmpDataPtr1->ax-ax)*(tmpDataPtr1->ax-ax)+(tmpDataPtr1->ay-ay)*(tmpDataPtr1->ay-ay));
u32 len2 = sqrt((tmpDataPtr2->ax-ax)*(tmpDataPtr2->ax-ax)+(tmpDataPtr2->ay-ay)*(tmpDataPtr2->ay-ay));
if(len1 > len2)
{
dir = 1;//反向
}
dirList.append(dir);
if(len > len1)
{
idx = p;
len = len1;
}
if(len > len2)
{
idx = p;
len = len2;
}
}
}
//将idx的段加入到cpvisited中
if(idx < dirList.size() && idx >= 0)
{
dir = dirList[idx];
if(dir == 0)
{
for(int p=0;p<cpduanData[idx].size();p++)
{
DsAbsItem *tmpPtr = (DsAbsItem *)(cpduanData[idx][p].data());
//添加偏移
if(p == 0)
{
DsAbsItem *oftTmpPtr = (DsAbsItem *)(cpduanData[idx][p].data());
oftTmpPtr->ctrl = DATA_OFFSET;
cpvisited[i].append(QByteArray((char*)oftTmpPtr, sizeof(DsAbsItem))); // 增加偏移
}
cpvisited[i].append(QByteArray((char*)tmpPtr, sizeof(DsAbsItem))); // 增加数据
if(p == cpduanData[idx].size()-1)
{
ax = tmpPtr->ax;
ay = tmpPtr->ay;
}
}
}
else
{
for(int p=cpduanData[idx].size()-1;p>=0;p--)
{
DsAbsItem *tmpPtr = (DsAbsItem *)(cpduanData[idx][p].data());
//添加偏移
if(p == cpduanData[idx].size()-1)
{
DsAbsItem *oftTmpPtr = (DsAbsItem *)(cpduanData[idx][p].data());
oftTmpPtr->ctrl = DATA_OFFSET;
cpvisited[i].append(QByteArray((char*)oftTmpPtr, sizeof(DsAbsItem))); // 增加偏移
}
cpvisited[i].append(QByteArray((char*)tmpPtr, sizeof(DsAbsItem))); // 增加数据
if(p == 0)
{
ax = tmpPtr->ax;
ay = tmpPtr->ay;
}
}
}
cpduanData.remove(idx);
break;
}
else
{
break;
}
}
}
}
if(flag == 0)
{
cpduanData.remove(k);
}
flag = 1;
}
}
#if(0) //dr 出的问题 coco
double lastX,lastY,curX,curY,len,minlen;
lastX = 0;
lastY = 0;
{// 重组数据
int nearDuan; // 最近的段
visited[i].clear();
for (int j=0;j<duan;j++)
{// 正反方向,判断最近的点
minlen = S32_MAX;
nearDuan = 0; // 最近的段
for (k=0;k<duan;k++)
{// 正反方向,判断最近的点
if (duanData[k].size() != 0) // 未判断过的段
{
tmpDataPtr = (DsAbsItem *)(duanData[k][0].data());
// 起点距离
curX = tmpDataPtr->ax;
curY = tmpDataPtr->ay;
len = sqrt((lastX-curX)*(lastX-curX)+(lastY-curY)*(lastY-curY));
if (minlen >= len)
{
minlen = len;
nearDuan = (k+1); // 最近的段
}
// 终点距离
tmpDataPtr = (DsAbsItem *)(duanData[k][duanData[k].size()-1].data());
curX = tmpDataPtr->ax;
curY = tmpDataPtr->ay;
len = sqrt((lastX-curX)*(lastX-curX)+(lastY-curY)*(lastY-curY));
if (minlen >= len)
{
minlen = len;
nearDuan = (k+1)*(-1); // 最近的段
}
}
}
qDebug()<< "nearDuan " <<nearDuan;
if (nearDuan > 0)
{// 正向赋值
nearDuan--;
tmpDataPtr = (DsAbsItem *)(duanData[nearDuan][0].data());
absItem.ctrl = DATA_ANGLE_OLD;
visited[i].append(QByteArray((char*)tmpDataPtr, sizeof(DsAbsItem))); // 增加拐点数据
for (int k=0;k<duanData[nearDuan].size();k++)
{
tmpDataPtr = (DsAbsItem *)(duanData[nearDuan][k].data());
visited[i].append(QByteArray((char*)tmpDataPtr, sizeof(DsAbsItem))); // 增加拐点数据
}
lastX = absItem.ax;
lastY = absItem.ay;
duanData[nearDuan].clear();
}
else
{// 反向赋值
nearDuan = (nearDuan*(-1))-1;
int l = duanData[nearDuan].size();
tmpDataPtr = (DsAbsItem *)(duanData[nearDuan][l-1].data());
memcpy(&absItem,tmpDataPtr,sizeof(DsAbsItem));
absItem.ctrl = DATA_ANGLE_OLD;
visited[i].append(QByteArray((char*)&absItem, sizeof(DsAbsItem))); // 增加拐点数据
for (k=0;k<l;k++)
{
tmpDataPtr = (DsAbsItem *)(duanData[nearDuan][l-1-k].data());
if (absItem.ar >= 0)
{
absItem.ar -= PI10000;
}
else
{
absItem.ar += PI10000;
}
visited[i].append(QByteArray((char*)tmpDataPtr, sizeof(DsAbsItem))); // 增加拐点数据
}
lastX = absItem.ax;
lastY = absItem.ay;
duanData[nearDuan].clear();
}
}
}
#endif
}
visited.clear();
visited = cpvisited;
}
// 主控参数(与主板参数同步更改)
//#define CUT_SPD_MINPPS (10) // 最小切割速度, 范围 1--100单位mm/s默认 10
//#define CUT_SPD_MAXPPS (600) // 最大切割速度, 范围 1--1200单位mm/s默认 1000
//#define CUT_ADD_PPSG (1000) // 切割加速度, 范围 1--4000单位mm/s2默认 500
//#define CUT_SLOW_ANGLE (6000) // 切割降速最小偏差角度,范围 0--18000单位 0.01度,默认 3000
//#define CUT_WORK_MINADD (1) // 工作最小加速度
#define CUTTINGVX_MUTI (5) // 切割虚轴脉冲倍数
#define PULSE_PER_MM (100) // 每毫米脉冲数
#define RADIAN_ACCURACY (10000) // 万分之一弧度
#define N1_FPGA_CLK (72000000L) // N1主板FPGA主频
#define DEG_PER_CIRCLE (360) // 每圈的度数(单位 度)
#define DEG001_PER_DEG (100)
#define DEG001_PER_CIRCLE (DEG_PER_CIRCLE*DEG001_PER_DEG) // 每圈的度数(单位 0.01度)
#define MMPS_TO_PPS(mmps) ((mmps)*PULSE_PER_MM) // 单位转换,由“毫米每秒”转换为“脉冲个数每秒”
#define MMPSS_TO_PPSG(mmpss) (N1_FPGA_CLK/(PULSE_PER_MM)/(mmpss)) // 单位转换由“毫米每秒平方”转换为“脉冲个数每秒间隔”间隔单位为1/72000000秒
#define ROT_001DEG_TO_PITK(deg) ((double)(deg)*2*PI*RADIAN_ACCURACY/DEG001_PER_CIRCLE) // 单位转换由“0.01度”转换为“万分之一弧度”
#define VAxisMMPSToPPS(mmps) (MMPS_TO_PPS(mmps) * CUTTINGVX_MUTI) // 虚轴速度加快
#define VAxisMMPSSToPPSG(mmpss) (MMPSS_TO_PPSG(mmpss) / CUTTINGVX_MUTI) // 加速度增大
//fillctrl.minchgpps = VAxisMMPSToPPS(g_pCuttingMcPara->workMinAdd*1.0);
u32 EmbData::CalcDisplacement(u32 pps1, u32 pps2, u32 calcTime)
{
double temp;
if (pps1 < pps2)
{
temp = (pps2-pps1);
}
else
{
temp = (pps1-pps2);
}
temp *= (pps1+pps2);
temp *= calcTime;
temp /= (2*N1_FPGA_CLK);
return (u32)(temp+0.5);
}
s16 EmbData::Rot001ToPitk(s32 ang001)
{
double temp = ang001;
temp = ROT_001DEG_TO_PITK(temp);
return (s16)temp;
}
// 计算切刀运动参数
// 输入:m_embDs16Data
// 输出:m_embDs16Data (在保留数据中增加最大速度)
int EmbData::setCutMoveParameters()
{
int cutSpdMinpps = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutSpdMinpps").toInt();
int cutSpdMaxpps = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutSpdMaxpps").toInt();
int cutAddPpsg = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutAddPpsg").toInt();
int cutSlowAngle = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutSlowAngle").toInt();
int cutWorkMinadd = g_pSettings->readFromIniFile("FlatPanelAlgorithm/cutWorkMinadd").toInt();
int size = m_embDs16Data.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(Ds16Item);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
else
{
qDebug()<<"stepsize"<<stepsize;
}
Ds16Item * pData = (Ds16Item *)(m_embDs16Data.data() + sizeof(DataDs16FileHead));
Ds16Item * embDataPtr = pData;
Ds16Item * curDataPtr;
// 数据区
u32 minpps = VAxisMMPSToPPS(cutSpdMinpps); // 最小速度
u32 maxpps = VAxisMMPSToPPS(cutSpdMaxpps); // 最大速度
u32 addppsg = VAxisMMPSSToPPSG(cutAddPpsg);
u32 minchgpps = VAxisMMPSToPPS(cutWorkMinadd);
u32 decCount = CalcDisplacement(maxpps, 0, addppsg); // 最大速度降速到0所需要的位移
s16 slowAngle = Rot001ToPitk(cutSlowAngle);
qDebug()<<"minpps"<<minpps;
qDebug()<<"maxpps"<<maxpps;
qDebug()<<"addppsg"<<addppsg;
qDebug()<<"minchgpps"<<minchgpps;
qDebug()<<"decCount"<<decCount;
qDebug()<<"slowAngle"<<slowAngle;
qDebug()<<"---------------------";
U32ToU8 curmaxpps;
u32 mintpps; // 最小速度
u32 temp; // 临时速度
int i,j;
int geted = 0;
s32 dx, dy, len, odx, ody, olen, mdx, mdy, mdxy;
for (j = 0; j < stepsize; j++)
{
curmaxpps.buf32 = 0;
mintpps = maxpps; // 最小速度初值为最大切割速度
if ((embDataPtr->ctrl == DATA_NULL) || (embDataPtr->ctrl == DATA_END))
{
break;
}
else
{
curDataPtr = embDataPtr;
for (i=j; i<stepsize; i++)
{
if ((curDataPtr->ctrl == DATA_NULL) || (curDataPtr->ctrl == DATA_END))
{
mintpps = minpps; // 简化处理,直接降速到最低
break;
}
temp = mintpps;
// 得到当前数据需要的速度
if (curDataPtr->ctrl == embDataPtr->ctrl) // 数据类型相同
{
if (abs(curDataPtr->dr) > slowAngle) // 角度差大于降速角度,需要降速
{
temp = minpps; // 简化处理,直接降速到最低
}
else
{
// 计算本针步最大允许速度
// 用XY的速度变化差值限制
if (curDataPtr->len != 0)
{
if (geted != 0)
{
odx = dx;
ody = dy;
olen = len;
}
dx = curDataPtr->dx;
dy = curDataPtr->dy;
len = curDataPtr->len;
if (geted == 0)
{
odx = dx;
ody = dy;
olen = len;
geted = 1;
}
mdx = abs(dx*olen - odx*len);
mdy = abs(dy*olen - ody*len);
mdxy = mdx;
if (mdxy < mdy)
{
mdxy = mdy;
}
if (mdxy != 0)
{
temp = minchgpps * len * olen / mdxy;
}
}
}
}
else
{
// 不同类型,直接降速到最低
mintpps = minpps; // 目标速度
break;
}
if (mintpps > temp) // 最小速度大于当前计算速度
{
mintpps = temp; // 开始降速
}
if (mintpps < minpps)
{
mintpps = minpps;
break;
}
if (decCount > curDataPtr->len)
{
decCount -= curDataPtr->len;
}
else
{
decCount = 0;
break;
}
curDataPtr++;
}
}
curmaxpps.buf32 = mintpps;
memcpy(&embDataPtr->rev,&curmaxpps.buf32,4);
embDataPtr++;
}
return 0;
}
//-----------------------------------------------------
int EmbData::setRotate(int dr)
{
double rr = (dr * PI / 180) * 10000; //转换为弧度
if (dr == 0 || dr == 360)
{
return 0;
}
double angle, sina, cosa;
#if (1)
// 因为计算三角函数有问题,现在只支持 1度10度90度
switch(dr)
{
case 1:
sina = 0.01745240643728351281941897851632;
cosa = 0.99984769515639123915701155881391;
break;
case 10:
sina = 0.17364817766693034885171662676931;
cosa = 0.98480775301220805936674302458952;
break;
case 90:
sina = 1;
cosa = 0;
break;
case -1:
sina = -0.01745240643728351281941897851632;
cosa = 0.99984769515639123915701155881391;
break;
case -10:
sina = -0.17364817766693034885171662676931;
cosa = 0.98480775301220805936674302458952;
break;
case -90:
sina = -1;
cosa = 0;
break;
default:
angle = (dr * PI) / 180.0;
sina = (double)qSin(angle);
cosa = (double)qCos(angle);
break;
}
#else
angle = (dr * PI) / 180.0;
sina = (double)qSin(angle);
cosa = (double)qCos(angle);
#endif
// 文件头
const QByteArray & ary = m_embAbsData;
int size = ary.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
int datasize = size - sizeof(DataDs16FileHead);
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("dat data size err");
return -1;
}
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ary.data());
//beginR的旋转
double br = pDsHead->beginR + rr;
while (br > 2*PI * 10000)
{
br -= 2*PI * 10000;
}
while (br < -2*PI * 10000)
{
br += 2*PI * 10000;
}
pDsHead->beginR = br;
DsAbsItem * pData = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData;
// 数据旋转
for (int j = 0; j < stepsize; j++)
{
// 变换前点坐标
double ax = absDataPtr->ax;
double ay = absDataPtr->ay;
double ar = absDataPtr->ar + rr;
while (ar > 2*PI * 10000)
{
ar -= 2*PI * 10000;
}
while (ar < -2*PI * 10000)
{
ar += 2*PI * 10000;
}
// 变换后点的坐标
double rax = (ax*cosa - ay*sina);
double ray = (ax*sina + ay*cosa);
absDataPtr->ax = rax;
absDataPtr->ay = ray;
absDataPtr->ar = ar;
absDataPtr++;
}
m_editedflag = 1;
return 1;
}
//此函数转换传入的绝对坐标值,是否取镜像及反复时数据之间的间距
void EmbData::convertAbsDat(QByteArray &dat, int mirror)
{
//无镜像、xy间距、角度旋转、缩放比例都为0时数据无需转换
if(mirror == 0 &&
m_spaceX == 0 &&
m_spaceY == 0 )
{
return;
}
int size = dat.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("data less then head size");
return;
}
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(dat.data());
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("dat dataBegin err");
return;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("dat data size err");
return;
}
DsAbsItem * pData = (DsAbsItem *)(dat.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData;
//--------
//镜像数值不为0---开始
// mirror 0, 无镜像; 1, 水平镜像; 2, 垂直镜像; 3, 水平和垂直镜像
int mirrorx = 1;
int mirrory = 1;
int mirrorr = 1;
if(mirror == 1 || mirror == 3)
{
mirrorx = -1;
mirrorr = -1;
}
if(mirror == 2 || mirror == 3)
{
mirrory = -1;
mirrorr = -1;
}
// 镜像文件头转换
if(mirror != 0)
{
pDsHead->beginX = pDsHead->beginX * mirrorx;
pDsHead->beginY = pDsHead->beginY * mirrory;
}
// 镜像或列表间距不为0
if(mirror != 0 || m_spaceX != 0 || m_spaceY != 0)
{
//图形先居中,起始点在加上偏移
int centerx = (m_maxX + m_minX)/2;
int centery = (m_maxY + m_minY)/2;
int rx = (pDsHead->beginX - centerx) * mirrorx;
int ry = (pDsHead->beginY - centery) * mirrory;
int beginx = rx + centerx;
int beginy = ry + centery;
//用下面两行代码否则反复方式为Y轴对称或XY对称时不对
pDsHead->beginX = beginx + m_spaceX;
pDsHead->beginY = beginy + m_spaceY;
}
//镜像数值不为0---结束
absDataPtr = pData;
//镜像有变换时运动步才转换
double dx, dy, dr;
if(mirror != 0)
{
for (int i = 0; i < stepsize; i++)
{
// 读入一个针步数据
dx = absDataPtr->ax;
dy = absDataPtr->ay;
dr = absDataPtr->ar;
//镜像不为0
if(mirror != 0)
{
dx = dx * mirrorx;
dy = dy * mirrory;
dr = dr * mirrorr;
}
absDataPtr->ax = dx;
absDataPtr->ay = dy;
absDataPtr->ar = dr;
absDataPtr++;
}
}
return;
}
int EmbData::calcLine(double x0, double y0, double x1, double y1, s16 step, QByteArray &absAry, DsAbsItem item)
{
DsAbsItem absItem;
memcpy(&absItem,&item,sizeof(DsAbsItem));
s32 dx, dy;
double length;
double tmp;
int count;
int i;
double stepx, stepy;
double sx, sy;
int actx, acty;
double k;
if(x0 == x1 && y0 == y1)
{
return 0;
}
if(x0 > x1)
{
sx = -1.0; // x反向
}
else
{
sx = 1.0;
}
if(y0 > y1)
{
sy = -1.0; // y反向
}
else
{
sy = 1.0;
}
// 开始分割针步
length = sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));
tmp = length/step; /* 实际针步数 */
count = floor(tmp); /* 最少整针步数 */
if (tmp - count > 0.01)
{
count += 1;
}
if (count == 0 && length > 0) // 短直线
{
count = 1;
}
tmp = 0;
actx = x0;
acty = y0;
if (x1 != x0 && y1 == y0) // 横直线
{
for (i = 0; i < count; i++)
{
tmp = ((i+1)*(length)/count)*sx+x0; // 实际针步
stepx = tmp - actx;
dx = (s32)(stepx+0.5*sx);
dy = 0;
actx += dx;
absItem.ax = actx;
absItem.ay = y0;
absAry.append((char*)&absItem,sizeof(DsAbsItem));
}
}
else if (x1 == x0 && y1 != y0) // 竖直线
{
for (i = 0; i < count; i++)
{
tmp = ((i+1)*(length)/count)*sy + y0; // 实际针步
stepy = tmp - acty;
dx = 0;
dy = (s32)(stepy+0.5*sy);
acty += dy;
absItem.ax = x0;
absItem.ay = acty;
absAry.append((char*)&absItem,sizeof(DsAbsItem));
}
}
else if(x1 != x0 && y1 != y0) // 任意斜线
{
k = (y1-y0)/(x1-x0);
for (i = 0; i < count; i++)
{
tmp = ((i+1)*(length)/count);
stepx = fabs(tmp*cos(atan(k)))*sx + x0; // 实际针步x
stepy = fabs(tmp*sin(atan(k)))*sy + y0; // 实际针步y
dx = (s32)(stepx-actx+0.5*sx);
dy = (s32)(stepy-acty+0.5*sy);
actx += dx;
acty += dy;
absItem.ax = actx;
absItem.ay = acty;
absAry.append((char*)&absItem,sizeof(DsAbsItem));
}
}
else
{
printf("what's this?\n");
}
return count;
}
//花版的定位点为绝对坐标数据点,起始点为相对于定位点的相对坐标点,第一针为相对于起始点的坐标点
//有的花版起始点有偏移量第一针偏移量为0有的花版起始点偏移量为0第一针有偏移量
//所以ds16文件头定位点坐标就是花版中的定位点起始点坐标为花版中的定位点坐标+起始点坐标+第一针的坐标同时ds16数据的第一针坐标偏移应置为0
//生成DS16数据
int EmbData::createEmbDs16FromAbs()
{
if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI)
{
createEmbDs16FromAbsDoubleHeadComb();
return 0;
}
if (m_editedflag != 0)
{
m_minX = S32_MAX;
m_maxX = S32_MIN;
m_minY = S32_MAX;
m_maxY = S32_MIN;
m_embDs16Data.clear();
char fileName[32];
memset(fileName,0,sizeof(fileName));
QByteArray tgtdsdat;
tgtdsdat.clear();
int colornum = 1;
int jumpNeedleNum = 0;//跳针数
int totalstepsize = 0;
memset(m_pEmbDs16Head,0,sizeof(DataDs16FileHead));
const QByteArray & ary = m_embAbsData;
int size = ary.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ary.data());
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DsAbsItem * pData = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
// 文件名称
QString str = QString::fromLocal8Bit(pDsHead->fileName);
QTextCodec * gbkCodec = QTextCodec::codecForName("GBK");
QByteArray name;
if (gbkCodec != NULL)
{
name = gbkCodec->fromUnicode(str);
}
else
{
name = str.toLocal8Bit();
}
//memcpy(fileName,pDsHead->fileName,sizeof(pDsHead->fileName));
memcpy(fileName,name,name.size());
int minx = absDataPtr->ax;
int maxx = absDataPtr->ax;
int miny = absDataPtr->ay;
int maxy = absDataPtr->ay;
int actx = 0;
int acty = 0;
int actr = 0;
int beginx = 0;
int beginy = 0;
int beginr = 0;
double absAr = 0;
// 数据区
qDebug()<<"stepsize:"<<stepsize;
//static bool firstStep = true;
//int firstXYFlag = 0;
for (int j = 0; j < stepsize; j++)
{
u16 len;
int ddx, ddy, ddr;
Ds16Item ds16Item;
memset(&ds16Item,0,sizeof(Ds16Item));//清空ds16针步
u8 ctrlByte = absDataPtr->ctrl;
u8 attrByte = absDataPtr->attr;//绝对数据的属性字节
WORD actionWord = absDataPtr->action;
double ax = absDataPtr->ax;//绝对数据的X位置
double ay = absDataPtr->ay;
double ar = absDataPtr->ar;
// qDebug()<< " index(absDataPtr->ar j ) : " << j << " : "<< absDataPtr->ar;
// 轮廓
if (minx > ax) { minx = ax; }
if (maxx < ax) { maxx = ax; }
if (miny > ay) { miny = ay; }
if (maxy < ay) { maxy = ay; }
if (j == 0)//第一针
{
beginx = ax;
beginy = ay;
beginr = ar;
absAr += beginr;
//qDebug()<<"absAr"<<absAr<<totalstepsize;
actx = ax;
acty = ay;
actr = ar;
ddx = 0;
ddy = 0;
//让ddr等于0因为在datafiledsr中将beginR置为0而非第一针的角度所以不应该用 absDataPtr->ar - pDsHead->beginR
//如果beginR等于第一针的角度那么第一针的ddr就应该是0
ddr = 0;
//过滤掉空针
// if(ddx == 0 && ddy == 0 && ddr == 0)
// {
// absDataPtr++;
// continue;
// }
}
else
{
ddx = ax - actx;
ddy = ay - acty;
ddr = ar - actr;
//起始角度因为切刀的最初角度是0如果第一个数据有坐标值变化要算起始角度
// if(firstXYFlag == 0 && (ddx != 0 || ddy != 0) && g_emMacType == MACHINE_CUTTINGWALK)
// {
// double tar = atan2(ddy,ddx);
// beginr = (tar * 10000+0.5*(tar>0?1:-1));
// firstXYFlag = 1;
// }
}
if( ctrlByte == DATA_END ||
ctrlByte == DATA_PAUSE ||
ctrlByte == DATA_CHGND ||
ctrlByte == DATA_CUTTRD ||
ctrlByte == DATA_ANGLE ||
ctrlByte == DATA_SYNCOFST ||
0 )
{
ddx = 0;
ddy = 0;
ddr = 0;
}
s32 dx = ddx;
s32 dy = ddy;
s32 dr = ddr;
actx += ddx;
acty += ddy;
actr += ddr;
while (dr < -PI10000)
{
dr += PI20000;
}
while (dr > PI10000)
{
dr -= PI20000;
}
//剪线码必须有
if (ctrlByte == DATA_END || ctrlByte == DATA_NULL)
{
dx = dy = dr = len = 0;
// 增加剪线
ds16Item.ctrl = DATA_CUTTRD;
ds16Item.attr = 0;
ds16Item.action[0] = 0;
ds16Item.action[1] = 0;
ds16Item.dx = 0;
ds16Item.dy = 0;
ds16Item.dr = 0;
ds16Item.len = 0;
memset(ds16Item.rev,0,sizeof(ds16Item.rev));
tgtdsdat.append((char*)(&ds16Item), sizeof(Ds16Item));
totalstepsize++;
absAr += ds16Item.dr;
//qDebug()<<"absAr"<<absAr<<dr<<totalstepsize;
}
//分割针步
double maxStep = 2200.0;
//多针机大于拟合针步大小加100时再分割因为拐角补偿后针步可能会很大需要分割
//这里加100是因为如果不加100很多超出一点的针步都会被分割
if(g_emMacType == MACHINE_HIGHSPEEDSINGLEQUI || g_emMacType == MACHINE_FLYSHUTTLE ||
g_emMacType == MACHINE_SINGLE_MUTIL_NEEDLE || g_emMacType == MACHINE_L2000_MULTI)
{
if(m_ritStepSize > 0)
{
maxStep = m_ritStepSize + 100.0;
}
}
//如果dx或dy数值太大时平方会超出double范围所以先都除以100再乘以10000
double xyLen = sqrt((dx/100.0*dx/100.0)*10000.0+ (dy/100.0*dy/100.0)*10000.0);
//if( 0 && xyLen > maxStep && ctrlByte == DATA_SEWING)
if(xyLen > maxStep)
{
int addx{0},addy{0};
//分割针步
double splitVal = 400.0;//分割针步为400
if(m_ritStepSize > 0)
{
splitVal = m_ritStepSize;
}
s32 stepNum = xyLen / splitVal;//拆分几步
double lastStep = (double)((int)xyLen % (int)splitVal);
if(lastStep != 0)
{
stepNum += 1;
splitVal = xyLen / stepNum;
}
for(int m = 0; m < stepNum; m++)
{
double stepX = 0;
double stepY = 0;
double stepDr = 0;
memset(&ds16Item,0,sizeof(Ds16Item));//初始化结构体
stepX = dx * splitVal / xyLen;
stepY = dy * splitVal / xyLen;
if(m == 0)
{
stepDr = dr;
}
ds16Item.dx = qRound(stepX);//四舍五入
ds16Item.dy = qRound(stepY);
if (m == stepNum-1)
{// 最后一针,消除累计误差
ds16Item.dx = dx - addx;
ds16Item.dy = dy - addy;
}
addx += ds16Item.dx;
addy += ds16Item.dy;
ds16Item.ctrl = ctrlByte;
len = sqrt(ds16Item.dx*ds16Item.dx + ds16Item.dy*ds16Item.dy);
ds16Item.attr = attrByte;
ds16Item.action[0] = 0;
ds16Item.action[1] = 0;
ds16Item.dr = stepDr;
ds16Item.len = len;
memset(ds16Item.rev,0,sizeof(ds16Item.rev));
tgtdsdat.append((char*)(&ds16Item), sizeof(Ds16Item));
totalstepsize++;
absAr += ds16Item.dr;
//qDebug()<<"absAr"<<ds16Item.ctrl<<absAr<<ds16Item.dr<<totalstepsize;
}
}
else
{
//粗线布线机,赋len的长度
if((ctrlByte == DATA_SYNCOFST) && (g_emMacType == MACHINE_THICK_WIRING))
{
memset((char*)&ds16Item,0,sizeof(ds16Item));
ds16Item.ctrl = DATA_SYNCOFST;
ds16Item.len = m_splitLen;
}
else
{
len = sqrt(dx*dx + dy*dy);
ds16Item.ctrl = ctrlByte;
ds16Item.attr = attrByte;
memcpy(ds16Item.action,&actionWord,sizeof(actionWord));
ds16Item.dx = dx;
ds16Item.dy = dy;
ds16Item.dr = dr;
ds16Item.len = len;
memset(ds16Item.rev,0,sizeof(ds16Item.rev));
}
if(dx == 0 && dy == 0 && ctrlByte == DATA_MILLING)
{
}
else
{
tgtdsdat.append((char*)(&ds16Item), sizeof(Ds16Item));//ds16针步
totalstepsize++;
absAr += ds16Item.dr;
//qDebug()<<"absAr"<<ds16Item.ctrl<<absAr<<ds16Item.dr<<totalstepsize;
}
}
if (ctrlByte == DATA_CHGND)
{
colornum++;
}
if (ctrlByte == DATA_OFFSET)
{
jumpNeedleNum++;//跨步总数加1
}
absDataPtr++;
}
if (m_minX > minx) { m_minX = minx; }
if (m_minX > maxx) { m_minX = maxx; }
if (m_maxX < minx) { m_maxX = minx; }
if (m_maxX < maxx) { m_maxX = maxx; }
if (m_minY > miny) { m_minY = miny; }
if (m_minY > maxy) { m_minY = maxy; }
if (m_maxY < miny) { m_maxY = miny; }
if (m_maxY < maxy) { m_maxY = maxy; }
// 针数
int newstepnum = tgtdsdat.size() / sizeof(Ds16Item);
if (newstepnum > 0)
{
// 修改文件头
// int namelen = name.size();
// if (namelen > HEAD_NAME_STR_LEN)
// {
// namelen = HEAD_NAME_STR_LEN;
// }
// QByteArray array = name.toLocal8Bit().data();
// int asize = array.length();
memcpy(m_pEmbDs16Head->fileName, fileName, sizeof(m_pEmbDs16Head->fileName)); // 文件名称
m_pEmbDs16Head->dataSize = newstepnum*sizeof(Ds16Item); // 数据字节数
m_pEmbDs16Head->itemNums = newstepnum; // 数据项个数
m_pEmbDs16Head->bytesPerItem = sizeof(Ds16Item); // 每项占的字节数
m_pEmbDs16Head->bytesPerBlk = MAX_EXDP_LEN; // 数据内容划分块大小
m_pEmbDs16Head->dataChecksum = calcCheckSum32((u8 *)(tgtdsdat.data()) , m_pEmbDs16Head->dataSize); // 数据累加校验和
m_pEmbDs16Head->checkCrc = calcCrc16((u8 *)(m_pEmbDs16Head), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验6个字段分别为文件名称字节数项个数每项字节数每块字节数数据累加和的CRC校验值
m_pEmbDs16Head->fileid = m_pEmbDs16Head->checkCrc;
m_pEmbDs16Head->anchorX = pDsHead->anchorX; // 定位点坐标X
m_pEmbDs16Head->anchorY = pDsHead->anchorY; // 定位点坐标Y, 设置为0作为基准
m_pEmbDs16Head->beginX = beginx; // 数据起点坐标X
m_pEmbDs16Head->beginY = beginy; // 数据起点坐标Y
m_pEmbDs16Head->beginR = beginr; // 数据起点坐标R //-rq
m_pEmbDs16Head->minX = minx;
m_pEmbDs16Head->maxX = maxx;
m_pEmbDs16Head->minY = miny;
m_pEmbDs16Head->maxY = maxy; // 轮廓范围,使用重新计算之后的值
qDebug() << "m_pEmbDs16Head->beginR " << m_pEmbDs16Head->beginR ;
qDebug() << "--------m_pEmbDs16Head->beginX = beginx " << m_pEmbDs16Head->beginX ;
qDebug() << "--------m_pEmbDs16Head->beginY = beginy " << m_pEmbDs16Head->beginY ;
qDebug() << "--------m_pEmbDs16Head->minX = minx; " << m_pEmbDs16Head->minX ;
qDebug() << "--------m_pEmbDs16Head->maxX = maxx; " << m_pEmbDs16Head->maxX ;
qDebug() << "--------m_pEmbDs16Head->minY = miny; " << m_pEmbDs16Head->minY ;
qDebug() << "--------m_pEmbDs16Head->maxY = maxy; " << m_pEmbDs16Head->maxY ;
//中间数据的文件头
// 添加文件头
m_embDs16Data.append((char*)m_pEmbDs16Head, sizeof(DataDs16FileHead));//ds16头文件存在ds16中
// 添加文件数据
m_embDs16Data.append(tgtdsdat);
}
#if(1)
if(m_filePath.length() > 0)
{
//保存成ds16文件
QString ds16FilePath = m_filePath + ".ds16";
QFile file(ds16FilePath);
if(file.exists())//存在ds16文件
{
QFile::remove(ds16FilePath);
}
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
qDebug() << "open file fail when wirte, path =" << m_filePath;
return -1;
}
else
{
file.write(m_embDs16Data);
file.close();
}
}
#endif
}
m_editedflag = 0;
return 0;
}
int EmbData::createEmbDs16FromAbsDoubleHeadComb()
{
if (m_editedflag != 0)
{
m_embDs16Data.clear();
QByteArray tgtdsdat;
tgtdsdat.clear();
int colornum = 1;
int jumpNeedleNum = 0;//跳针数
int totalstepsize = 0;
memset(m_pEmbDs16Head,0,sizeof(DataDs16FileHead));
const QByteArray & ary = m_embAbsData;
int size = ary.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return -1;
}
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ary.data());
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("absdat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("absdat data size err");
return -1;
}
DsAbsItem * pData = (DsAbsItem *)(ary.data() + sizeof(DataDs16FileHead));
DsAbsItem * absDataPtr = pData; //中间数据针步
// 文件名称
QString name = QString::fromLocal8Bit(pDsHead->fileName);
//机头2与机头1的偏差
double secOftX = pDsHead->beginX2 - pDsHead->beginX;
double secOftY = pDsHead->beginY2 - pDsHead->beginY;
int actx = 0;
int acty = 0;
int actr = 0;
int actx2 = 0;
int acty2 = 0;
u8 preCtrlLeft,preCtrlRight;
preCtrlLeft = preCtrlRight = 0;
// 数据区
qDebug()<<"stepsize:"<<stepsize;
for (int j = 0; j < stepsize; j++)
{
u16 len;
int ddx, ddy, ddr;
Ds16Item ds16Item;
memset(&ds16Item,0,sizeof(Ds16Item));//清空ds16针步
u8 ctrlByte = absDataPtr->ctrl;
u8 attrByte = absDataPtr->attr;//绝对数据的属性字节
WORD actionWord = absDataPtr->action;
double ax = absDataPtr->ax;//绝对数据的X位置
double ay = absDataPtr->ay;
double ar = absDataPtr->ar;
#if(0)
if(j >= 1150)
{
int a = 0;
a = 1;
}
#endif
#if(0)
if(ctrlByte == DATA_CUTTRD || ctrlByte == DATA_CUTTER_SEC || ctrlByte == DATA_SYNC_CUTTER || ctrlByte == DATA_MIRROR_OFT_SEC)
{
int a = 0;
a = 1;
}
#endif
#if(0)
if(totalstepsize >= 2960)
{
int a = 0;
a = 1;
}
#endif
if (j == 0)//第一针
{
//起始为第二机头数据
if(ctrlByte == DATA_OFFSET_SEC || ctrlByte == DATA_SEWING_R)
{
actx2 = ax;
acty2 = ay;
actx = ax - secOftX;//反着来
acty = ay + secOftY;
}
else
{
actx = ax;
acty = ay;
actx2 = ax + secOftX;
acty2 = ay - secOftY;//因为双头组合机型Y数据方向取反了所以这里用减
}
actr = ar;
ddx = 0;
ddy = 0;
//让ddr等于0因为在datafiledsr中将beginR置为0而非第一针的角度所以不应该用 absDataPtr->ar - pDsHead->beginR
//如果beginR等于第一针的角度那么第一针的ddr就应该是0
ddr = 0;
//过滤掉空针
if(ddx == 0 && ddy == 0)
{
absDataPtr++;
actr = absDataPtr->ar;
continue;
}
}
else
{
ddx = ax - actx;
ddy = ay - acty;
ddr = ar - actr;
}
int flag = 0;
//左机头当前针步属性不为缝纫,且上一针步属性为缝纫时插入剪线码
if(ctrlByte == DATA_OFFSET || ctrlByte == DATA_OFFSET_SEC || ctrlByte == DATA_SYNCOFST || ctrlByte == DATA_MIRROR_OFT_SEC)
{
if(preCtrlLeft == DATA_SEWING || preCtrlLeft == DATA_SYNCSEW || preCtrlLeft == DATA_MIRROR_SEC)
{
Ds16Item *firstDs16Ptr = (Ds16Item*)(tgtdsdat.data());
Ds16Item *ds16Ptr = (Ds16Item*)(tgtdsdat.data() + tgtdsdat.size() - sizeof(Ds16Item));
int idx = 0;
while(1)
{
if(ds16Ptr <= firstDs16Ptr)
{
break;
}
if(ds16Ptr->ctrl == DATA_CUTTRD)
{
break;
}
if(ds16Ptr->ctrl == DATA_SEWING || ds16Ptr->ctrl == DATA_SYNCSEW || ds16Ptr->ctrl == DATA_MIRROR_SEC)
{
Ds16Item item;
memset(&item,0,sizeof(Ds16Item));
item.ctrl = DATA_CUTTRD;
tgtdsdat.insert(tgtdsdat.size()-idx*sizeof(Ds16Item),(char*)&item,sizeof(Ds16Item));
totalstepsize++;
flag |= 0x01;
break;
}
ds16Ptr--;
idx++;
}
}
}
//右机头当前针步属性不为缝纫,且上一针步属性为缝纫时插入剪线码
if(ctrlByte == DATA_OFFSET || ctrlByte == DATA_OFFSET_SEC || ctrlByte == DATA_SYNCOFST || ctrlByte == DATA_MIRROR_OFT_SEC)
{
if(preCtrlRight == DATA_SEWING_R || preCtrlRight == DATA_SYNCSEW || preCtrlRight == DATA_MIRROR_SEC)
{
Ds16Item *firstDs16Ptr = (Ds16Item*)(tgtdsdat.data());
Ds16Item *ds16Ptr = (Ds16Item*)(tgtdsdat.data() + tgtdsdat.size() - sizeof(Ds16Item));
int idx = 0;
while(1)
{
if(ds16Ptr <= firstDs16Ptr)
{
break;
}
if(ds16Ptr->ctrl == DATA_CUTTER_SEC)
{
break;
}
if(ds16Ptr->ctrl == DATA_SEWING_R || ds16Ptr->ctrl == DATA_SYNCSEW || ds16Ptr->ctrl == DATA_MIRROR_SEC)
{
flag |= 0x02;
//都插入了剪线码
if(flag == 0x03)
{
Ds16Item *item = (Ds16Item *)(tgtdsdat.data() + tgtdsdat.size()-sizeof(Ds16Item));
while(1)
{
if(item <= firstDs16Ptr)
{
break;
}
if(item->ctrl == DATA_SYNC_CUTTER)
{
break;
}
if(item->ctrl == DATA_CUTTRD)
{
item->ctrl = DATA_SYNC_CUTTER;
preCtrlLeft = DATA_SYNC_CUTTER;
preCtrlRight = DATA_SYNC_CUTTER;
break;
}
item--;
}
}
else
{
Ds16Item item;
memset(&item,0,sizeof(Ds16Item));
item.ctrl = DATA_CUTTER_SEC;
tgtdsdat.insert(tgtdsdat.size()-idx*sizeof(Ds16Item),(char*)&item,sizeof(Ds16Item));
totalstepsize++;
}
break;
}
ds16Ptr--;
idx++;
}
}
}
//第一机头偏移
if(ctrlByte == DATA_OFFSET)
{
ddx = ax - actx;
ddy = ay - acty;
}
//第一机头缝纫
if(ctrlByte == DATA_SEWING)
{
ddx = ax - actx;
ddy = ay - acty;
}
//第二机头偏移
if(ctrlByte == DATA_OFFSET_SEC)
{
// actx2 = ax;
// acty2 = ay;
ddx = ax - actx2;
ddy = ay - acty2;
}
//第二机头缝纫
if(ctrlByte == DATA_SEWING_R)
{
ddx = ax - actx2;
ddy = ay - acty2;
}
ddr = ar - actr;
if( ctrlByte == DATA_END ||
ctrlByte == DATA_PAUSE ||
ctrlByte == DATA_CHGND ||
ctrlByte == DATA_CUTTRD ||
ctrlByte == DATA_SYNC_CUTTER ||
ctrlByte == DATA_CUTTER_SEC ||
ctrlByte == DATA_ANGLE ||
0 )
{
if( ctrlByte == DATA_CUTTRD ||
ctrlByte == DATA_SYNC_CUTTER ||
ctrlByte == DATA_CUTTER_SEC ||
0 )
{
#if(0)
//这段代码要注意,因为可能打版就打了剪线码,则这个剪线码就不能去掉
int rmFlag = 0;
DsAbsItem * tempPtr = absDataPtr;
while(1)
{
if(tempPtr->ctrl != DATA_CUTTRD && tempPtr->ctrl != DATA_SYNC_CUTTER && tempPtr->ctrl != DATA_CUTTER_SEC)
{
tempPtr++;
if(tempPtr->ctrl != DATA_OFFSET && tempPtr->ctrl != DATA_SECF_OFST &&
tempPtr->ctrl != DATA_SYNCOFST && tempPtr->ctrl != DATA_MIRROR_OFT_SEC)
{
rmFlag = 1;
}
break;
}
tempPtr++;
}
if(rmFlag == 1)
{
//如果为剪线码判断距离上一个点是否很接近如果很接近就不要把这个剪线码添加到ds16数据中
//因为打版时会有左右机头打断的操作,就会插入剪线码,其实这个地方不需要剪线
double xyLen = sqrt((ddx/100.0*ddx/100.0)*10000.0+ (ddy/100.0*ddy/100.0)*10000.0);
if(xyLen <= 100)//小于等于1mm
{
absDataPtr++;
continue;
}
}
#endif
}
ddx = 0;
ddy = 0;
ddr = 0;
}
s32 dx = ddx;
s32 dy = ddy;
s32 dr = ddr;
if(ctrlByte != DATA_OFFSET_SEC && ctrlByte != DATA_SEWING_R)
// if(ctrlByte == DATA_SEWING || ctrlByte == DATA_OFFSET ||
// ctrlByte == DATA_SYNCOFST || ctrlByte == DATA_MIRROR_SEC ||
// ctrlByte == DATA_MIRROR_OFT_SEC || ctrlByte == DATA_SYNCSEW)//左机头
{
actx += ddx;
acty += ddy;
actr += ddr;
}
if(ctrlByte != DATA_OFFSET && ctrlByte != DATA_SEWING)
// if(ctrlByte == DATA_SEWING_R || ctrlByte == DATA_OFFSET_SEC ||
// ctrlByte == DATA_SYNCOFST || ctrlByte == DATA_MIRROR_SEC ||
// ctrlByte == DATA_MIRROR_OFT_SEC || ctrlByte == DATA_SYNCSEW)//右机头
{
if(ctrlByte == DATA_MIRROR_SEC || ctrlByte == DATA_MIRROR_OFT_SEC)
{
actx2 -= ddx;
}
else
{
actx2 += ddx;
}
acty2 += ddy;
}
while (dr < -PI10000)
{
dr += PI20000;
}
while (dr > PI10000)
{
dr -= PI20000;
}
//如果为偏移针步dx和dy都接近于0则ds16数据不添加此针步
if(ctrlByte == DATA_OFFSET || ctrlByte == DATA_OFFSET_SEC)
{
double xyLen = sqrt((dx/100.0*dx/100.0)*10000.0+ (dy/100.0*dy/100.0)*10000.0);
if(xyLen <= m_oftNeedleSize)//小于等于
{
absDataPtr++;
continue;
}
}
//剪线码必须有-判断前一针不为剪线码时才加剪线码
if (ctrlByte == DATA_END || ctrlByte == DATA_NULL)
{
absDataPtr--;
u8 preCtrlByte = absDataPtr->ctrl;
if(g_emMacType == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI)
{
if(preCtrlByte != DATA_SYNC_CUTTER)
{
dx = dy = dr = len = 0;
// 增加剪线
ds16Item.ctrl = DATA_SYNC_CUTTER;
ds16Item.attr = 0;
ds16Item.action[0] = 0;
ds16Item.action[1] = 0;
ds16Item.dx = 0;
ds16Item.dy = 0;
ds16Item.dr = 0;
ds16Item.len = 0;
memset(ds16Item.rev,0,sizeof(ds16Item.rev));
tgtdsdat.append((char*)(&ds16Item), sizeof(Ds16Item));
totalstepsize++;
}
}
else
{
if(preCtrlByte != DATA_CUTTRD)
{
dx = dy = dr = len = 0;
// 增加剪线
ds16Item.ctrl = DATA_CUTTRD;
ds16Item.attr = 0;
ds16Item.action[0] = 0;
ds16Item.action[1] = 0;
ds16Item.dx = 0;
ds16Item.dy = 0;
ds16Item.dr = 0;
ds16Item.len = 0;
memset(ds16Item.rev,0,sizeof(ds16Item.rev));
tgtdsdat.append((char*)(&ds16Item), sizeof(Ds16Item));
totalstepsize++;
}
}
absDataPtr++;
}
//分割针步
double maxStep = 800.0;
//如果dx或dy数值太大时平方会超出double范围所以先都除以100再乘以10000
double xyLen = sqrt((dx/100.0*dx/100.0)*10000.0+ (dy/100.0*dy/100.0)*10000.0);
//if( 0 && xyLen > maxStep && ctrlByte == DATA_SEWING)
if(xyLen > maxStep)
{
int addx{0},addy{0};
//分割针步
double splitVal = 400.0;//分割针步为400
s32 stepNum = xyLen / splitVal;//拆分几步
double lastStep = (double)((int)xyLen % (int)splitVal);
double addStep = lastStep / stepNum;
for(int m = 0; m < stepNum; m++)
{
double stepX = 0;
double stepY = 0;
double stepDr = 0;
memset(&ds16Item,0,sizeof(Ds16Item));//初始化结构体
stepX = dx * splitVal / xyLen + dx * addStep / xyLen;
stepY = dy * splitVal / xyLen + dy * addStep / xyLen;
if(m == 0)
{
stepDr = dr;
}
ds16Item.dx = qRound(stepX);//四舍五入
ds16Item.dy = qRound(stepY);
if (m == stepNum-1)
{// 最后一针,消除累计误差
ds16Item.dx = dx - addx;
ds16Item.dy = dy - addy;
}
addx += ds16Item.dx;
addy += ds16Item.dy;
ds16Item.ctrl = ctrlByte;
len = sqrt(ds16Item.dx*ds16Item.dx + ds16Item.dy*ds16Item.dy);
ds16Item.attr = attrByte;
ds16Item.action[0] = 0;
ds16Item.action[1] = 0;
ds16Item.dr = stepDr;
ds16Item.len = len;
memset(ds16Item.rev,0,sizeof(ds16Item.rev));
tgtdsdat.append((char*)(&ds16Item), sizeof(Ds16Item));
totalstepsize++;
}
}
else
{
len = sqrt(dx*dx + dy*dy);
ds16Item.ctrl = ctrlByte;
ds16Item.attr = attrByte;
memcpy(ds16Item.action,&actionWord,sizeof(actionWord));
ds16Item.dx = dx;
ds16Item.dy = dy;
ds16Item.dr = dr;
ds16Item.len = len;
memset(ds16Item.rev,0,sizeof(ds16Item.rev));
if(dx == 0 && dy == 0 && ctrlByte == DATA_MILLING)
{
}
else
{
tgtdsdat.append((char*)(&ds16Item), sizeof(Ds16Item));//ds16针步
totalstepsize++;
}
}
if (ctrlByte == DATA_CHGND)
{
colornum++;
}
if (ctrlByte == DATA_OFFSET || ctrlByte == DATA_SYNCOFST)
{
jumpNeedleNum++;//跨步总数加1
}
//第一机头的属性
if(ctrlByte == DATA_SEWING || ctrlByte == DATA_OFFSET
|| ctrlByte == DATA_SYNCSEW || ctrlByte == DATA_SYNCOFST ||
ctrlByte == DATA_MIRROR_SEC || ctrlByte == DATA_MIRROR_OFT_SEC || ctrlByte == DATA_SYNC_CUTTER || ctrlByte == DATA_CUTTRD)
{
preCtrlLeft = ctrlByte;
}
//第二机头的属性
if(ctrlByte == DATA_SEWING_R || ctrlByte == DATA_OFFSET_SEC
|| ctrlByte == DATA_SYNCSEW || ctrlByte == DATA_SYNCOFST ||
ctrlByte == DATA_MIRROR_SEC || ctrlByte == DATA_MIRROR_OFT_SEC || ctrlByte == DATA_SYNC_CUTTER || ctrlByte == DATA_CUTTER_SEC)
{
preCtrlRight = ctrlByte;
}
absDataPtr++;
}
// 针数
int newstepnum = tgtdsdat.size() / sizeof(Ds16Item);
if (newstepnum > 0)
{
// 修改文件头
int namelen = name.size();
if (namelen > HEAD_NAME_STR_LEN)
{
namelen = HEAD_NAME_STR_LEN;
}
QByteArray array = name.toLocal8Bit().data();
int asize = array.length();
memcpy(m_pEmbDs16Head->fileName, array, asize); // 文件名称
m_pEmbDs16Head->dataSize = newstepnum*sizeof(Ds16Item); // 数据字节数
m_pEmbDs16Head->itemNums = newstepnum; // 数据项个数
m_pEmbDs16Head->bytesPerItem = sizeof(Ds16Item); // 每项占的字节数
m_pEmbDs16Head->bytesPerBlk = MAX_EXDP_LEN; // 数据内容划分块大小
m_pEmbDs16Head->dataChecksum = calcCheckSum32((u8 *)(tgtdsdat.data()) , m_pEmbDs16Head->dataSize); // 数据累加校验和
m_pEmbDs16Head->checkCrc = calcCrc16((u8 *)(m_pEmbDs16Head), HEAD_FIX_INFO_LEN); // 前面6个字段的CRC校验6个字段分别为文件名称字节数项个数每项字节数每块字节数数据累加和的CRC校验值
m_pEmbDs16Head->fileid = m_pEmbDs16Head->checkCrc;
m_pEmbDs16Head->anchorX = pDsHead->anchorX; // 定位点坐标X
m_pEmbDs16Head->anchorY = pDsHead->anchorY; // 定位点坐标Y, 设置为0作为基准
m_pEmbDs16Head->beginX = pDsHead->beginX; // 数据起点坐标X
m_pEmbDs16Head->beginY = pDsHead->beginY; // 数据起点坐标Y
m_pEmbDs16Head->beginR = pDsHead->beginR; // 数据起点坐标R
m_pEmbDs16Head->beginX2 = pDsHead->beginX2; // 数据起点坐标X
m_pEmbDs16Head->beginY2 = pDsHead->beginY2; // 数据起点坐标Y
m_pEmbDs16Head->beginR2 = pDsHead->beginR2; // 数据起点坐标R
// 添加文件头
m_embDs16Data.append((char*)m_pEmbDs16Head, sizeof(DataDs16FileHead));//ds16头文件存在ds16中
// 添加文件数据
m_embDs16Data.append(tgtdsdat);
}
//求边界范围
calRange();
//重新计算角度
//求dr
Ds16Item * ds16DataPtr;
Ds16Item * pDsData = (Ds16Item *)(tgtdsdat.data());
ds16DataPtr = pDsData;
int dx,dy;
double tar,ar;
ar = 0;
QList<double> arList;
arList.clear();
for (int i = 0; i < newstepnum; i++)
{
dx = ds16DataPtr->dx;
dy = ds16DataPtr->dy;
if(dx == 0 && dy == 0)
{
arList.append(ar);
}
else
{
tar = atan2(dy,dx);
ar = (tar*10000+0.5*(tar>0?1:-1));
arList.append(ar);
}
ds16DataPtr++;
}
double ar2,ar1;
ar2 = ar1 = 0;
ds16DataPtr = pDsData;
for (int i = 0; i < newstepnum; i++)
{
ar2 = arList[i];
if(i >= 1)
{
ar1 = arList[i-1];
}
if(i == 0)
{
ds16DataPtr->dr = ar2;
}
else
{
ds16DataPtr->dr = ar2-ar1;
}
if(ds16DataPtr->dx == 0 && ds16DataPtr->dy == 0)
{
ds16DataPtr->dr = 0;
}
while (ds16DataPtr->dr < -PI10000)
{
ds16DataPtr->dr += PI20000;
}
while (ds16DataPtr->dr > PI10000)
{
ds16DataPtr->dr -= PI20000;
}
ds16DataPtr++;
}
m_pEmbDs16Head->maxX = m_maxX;
m_pEmbDs16Head->minX = m_minX;
m_pEmbDs16Head->maxY = m_maxY;
m_pEmbDs16Head->minY = m_minY;
m_embDs16Data.clear();
m_embDs16Data.append((char*)m_pEmbDs16Head, sizeof(DataDs16FileHead));//ds16头文件存在ds16中
m_embDs16Data.append(tgtdsdat);
#if(1)
if(m_filePath.length() > 0)
{
//保存成ds16文件
QString ds16FilePath = m_filePath + ".ds16";
QFile file(ds16FilePath);
if(file.exists())//存在ds16文件
{
QFile::remove(ds16FilePath);
}
if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
qDebug() << "open file fail when wirte, path =" << m_filePath;
return -1;
}
else
{
file.write(m_embDs16Data);
file.close();
}
}
#endif
}
m_editedflag = 0;
return 0;
}
void EmbData::calRange()
{
//求最大最小值范围
m_minX = S32_MAX;
m_maxX = S32_MIN;
m_minY = S32_MAX;
m_maxY = S32_MIN;
const QByteArray & arry = m_embDs16Data;
int size = arry.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("16 data less then head size");
return;
}
DataDs16FileHead *pDsHead = (DataDs16FileHead *)(arry.data());
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("dat dataBegin err");
return;
}
int stepsize = datasize/sizeof(Ds16Item);
if (stepsize <= 0)
{
qDebug("ds16 data size err");
return;
}
Ds16Item * ds16DataPtr;
Ds16Item * pDsData = (Ds16Item *)(arry.data() + sizeof(DataDs16FileHead));
ds16DataPtr = pDsData;
int secOftX = pDsHead->beginX2 - pDsHead->beginX;
int secOftY = pDsHead->beginY2 - pDsHead->beginY;
u8 ctrl = 0;
double ax,ay,ax2,ay2;
ax = ay = 0;
ax2 = secOftX;
ay2 = 0 - secOftY;//因为双头组合机型Y数据方向取反了所以这里用减
for (int i = 0; i < stepsize; i++)
{
ctrl = ds16DataPtr->ctrl;
if(ctrl == DATA_NULL)
{
break;
}
if(ctrl != DATA_OFFSET_SEC && ctrl != DATA_SEWING_R)
{
ax += ds16DataPtr->dx;
ay += ds16DataPtr->dy;
}
if(ctrl != DATA_OFFSET && ctrl != DATA_SEWING)
{
if(ctrl == DATA_MIRROR_SEC || ctrl == DATA_MIRROR_OFT_SEC)
{
ax2 = ax2 + (ds16DataPtr->dx * -1);
ay2 += ds16DataPtr->dy;
}
else
{
ax2 += ds16DataPtr->dx;
ay2 += ds16DataPtr->dy;
}
}
if (m_minX > ax) { m_minX = ax; }
if (m_maxX < ax) { m_maxX = ax; }
if (m_minX > ax2) { m_minX = ax2; }
if (m_maxX < ax2) { m_maxX = ax2; }
if (m_minY > ay) { m_minY = ay; }
if (m_maxY < ay) { m_maxY = ay; }
if (m_minY > ay2) { m_minY = ay2; }
if (m_maxY < ay2) { m_maxY = ay2; }
ds16DataPtr++;
}
}
int EmbData::reCalcDataChecksum()
{
return 0;
}
//绘制针数索引的跟踪笔
void EmbData::drawNeedleIdxPen(int x, int y, QPainter &painter)
{
//贴图的xy和画笔的xy值相同
m_penX = x;
m_penY = y;
m_penPix = m_canvas.copy(x-20,y-30,40,40);//复制画笔区域未绘制笔之前的图像
QPen pen;
QColor color;
//绘制深灰色画笔
pen.setWidth(2);
color.setRgb(60,60,60);//深灰色
pen.setColor(color);
painter.setPen(pen);
painter.drawLine(x-4, y-28, x-4, y-8);//画左"|"
painter.drawLine(x+4, y-28, x+4, y-8); //画右"|"
painter.drawEllipse(x-1, y-10, 2, 2);//画中心"°"
painter.drawLine(x-4, y-8, x, y);//画左"\"(笔尖)
painter.drawLine(x+4, y-8, x, y); //画右"/"(笔尖)
//绘制深红色画笔
pen.setWidth(1);
color.setRgb(174,60,64);//深红色
pen.setColor(color);
painter.setPen(pen);
painter.drawLine(x-3, y-28, x-3, y-8);//画左"|"
painter.drawLine(x+5, y-28, x+5, y-8); //画右"|"
painter.drawEllipse(x-2, y-12, 3, 3);//画中心"°"
painter.drawLine(x-3, y-8, x, y);//画左"\"(笔尖)
painter.drawLine(x+5, y-8, x, y); //画右"/"(笔尖)
}
void EmbData::drawFork(int x, int y, QPainter &painter)
{
//贴图的xy和画笔的xy值相同
m_penX = x;
m_penY = y;
m_penPix = m_canvas.copy(x-20,y-30,40,40);//复制画笔区域未绘制笔之前的图像
QPen pen;
QColor color;
//绘制深灰色画笔
pen.setWidth(2);
color.setRgb(228,42,48);
pen.setColor(color);
painter.setPen(pen);
painter.drawLine(x-8, y-8, x-3, y-3);// \上一半
painter.drawLine(x+8, y-8, x+3, y-3);// /上一半
painter.drawLine(x+3, y+3, x+8, y+8);
painter.drawLine(x-3, y+3, x-8, y+8);
}
/**
* @brief 绘制多头机的跟踪标致
*/
void EmbData::drawFork(int x, int y, QPainter &painter, int index)
{
m_penPoint[index].setX(x);
m_penPoint[index].setY(y);
m_penHeadPix[index] = m_canvas.copy(x-20,y-30,40,40);//复制画笔区域未绘制笔之前的图像
QPen pen;
QColor color;
//绘制深灰色画笔
pen.setWidth(2);
color.setRgb(228,42,48);
pen.setColor(color);
painter.setPen(pen);
painter.drawLine(x-8, y-8, x-3, y-3);// \上一半
painter.drawLine(x+8, y-8, x+3, y-3);// /上一半
painter.drawLine(x+3, y+3, x+8, y+8);
painter.drawLine(x-3, y+3, x-8, y+8);
}
void EmbData::drawForkDoubleHead(int x, int y, int x2, int y2, QPainter &painter)
{
//贴图的xy和画笔的xy值相同
m_penX = x;
m_penY = y;
m_penXY2.setX(x2);
m_penXY2.setY(y2);
m_penPix = m_canvas.copy(x-20,y-30,40,40);//复制画笔区域未绘制笔之前的图像
m_penPix2 = m_canvas.copy(x2-20,y2-30,40,40);//复制画笔区域未绘制笔之前的图像
QPen pen;
QColor color;
//绘制深灰色画笔
pen.setWidth(2);
color.setRgb(228,42,48);
pen.setColor(color);
painter.setPen(pen);
painter.drawLine(x-8, y-8, x-3, y-3);// \上一半
painter.drawLine(x+8, y-8, x+3, y-3);// /上一半
painter.drawLine(x+3, y+3, x+8, y+8);
painter.drawLine(x-3, y+3, x-8, y+8);
painter.drawLine(x2-8, y2-8, x2-3, y2-3);// \上一半
painter.drawLine(x2+8, y2-8, x2+3, y2-3);// /上一半
painter.drawLine(x2+3, y2+3, x2+8, y2+8);
painter.drawLine(x2-3, y2+3, x2-8, y2+8);
}
//擦除针数索引的跟踪笔
void EmbData::eraseNeedleIdxPen(QPainter &painter)
{
//贴图的xy和画笔的xy值相同
painter.drawPixmap(m_penX-20,m_penY-30,m_penPix);
}
void EmbData::eraseNeedleIdxPen(QPainter &painter, int index)
{
painter.drawPixmap(m_penPoint[index].x()-20,m_penPoint[index].y()-30,m_penHeadPix[index]);
}
void EmbData::eraseNeedleIdxPenDoubleHead(QPainter &painter)
{
//贴图的xy和画笔的xy值相同
painter.drawPixmap(m_penX-20,m_penY-30,m_penPix);
painter.drawPixmap(m_penXY2.x()-20,m_penXY2.y()-30,m_penPix2);
}
bool EmbData::isFlipDispYMac()
{
if(g_emMacType == MACHINE_THICK_WIRING ||
g_emMacType == MACHINE_FLYSHUTTLE ||
g_emMacType == MACHINE_GLASSFIBRE ||
g_emMacType == MACHINE_DOUBLE_LAYERED ||
g_emMacType == MACHINE_L2000_MULTI ||
g_emMacType == MACHINE_AutoDoubleDoor ||
g_emMacType == MACHINE_FULLYAUTOMATIC ||
g_emMacType == MACHINE_HIGHSPEEDSINGLEQUI ||
g_emMacType == MACHINE_DOUBLEHEADQUI ||
g_emMacType == MACHINE_CUTTINGWALK ||
g_emMacType == MACHINE_FOURHEADQUI)
return true;
else
return false;
}
bool EmbData::isFlipDispXMac()
{
return false;
}
void EmbData::getCurvePointFillLine(QList<DsAbsItem> &inList, double indRunLen, QList<DsAbsItem> &outList)
{
DsAbsItem dPoint1, dPoint2, dPoint3;
double dTatol, dLen1, dLen2, dSpace;
long lSum, lCount;
//计算总的线段长
int iCountPoint = inList.size();
if(iCountPoint <= 0)
{
return;
}
getTotalDistanceFillLine(&inList, dTatol);
if(dTatol == 0)
return;
lSum = (long)round(dTatol / indRunLen + 0.1667);
dSpace = dTatol / (double)lSum;
if(lSum == 0)
lSum = 1;
dPoint1 = inList[0];
outList.append(dPoint1);//添加第一个点
dPoint2 = dPoint1;
dLen1 = dSpace;
dLen2 = 0;
int i = 0;
for(lCount = 0; lCount < lSum; lCount++)
{
while(i < inList.size()-1 && dLen2 < dLen1)
{
dLen1 -= dLen2;
dPoint1 = dPoint2;
i++;
dPoint2 = inList[i];
dLen2 = sqrt((dPoint1.ax - dPoint2.ax) * (dPoint1.ax - dPoint2.ax) + (dPoint1.ay - dPoint2.ay) * (dPoint1.ay - dPoint2.ay));
if(dPoint2.ctrl == DATA_CUTTRD || dPoint2.ctrl == DATA_SYNC_CUTTER || dPoint2.ctrl == DATA_CUTTER_SEC)
{
//为剪线码时退出并添加此针步
break;
}
}
if(dLen1 < dLen2)
{
getPointInSectFillLine(dPoint1, dPoint2, dLen1, dPoint3);
}
else
{
dPoint3 = dPoint2;
}
outList.append(dPoint3);
dLen2 -= dLen1;
dLen1 = dSpace;
dPoint1 = dPoint3;
}
}
int EmbData::getTotalDistanceFillLine(QList<DsAbsItem> *pPointList, double &dTotal)
{
DsAbsItem dPoint, dNext;
double d;
dTotal = 0;
int i = 0;
long lSum = (long)pPointList->count();
if(lSum > 1)
{
while(i < pPointList->size())
{
dPoint = pPointList->at(i);
i++;
if(i < pPointList->size())
{
dNext = pPointList->at(i);
d = sqrt((dPoint.ax - dNext.ax) * (dPoint.ax - dNext.ax) + (dPoint.ay- dNext.ay) * (dPoint.ay- dNext.ay));
dTotal += d;
}
else
{
break;
}
}
}
return 0;
}
bool EmbData::getPointInSectFillLine(const DsAbsItem &p1, const DsAbsItem &p2, const double &d, DsAbsItem &outp)
{
bool bRes;
DsAbsItem dpoint[3];
dpoint[0] = p1;
dpoint[1] = p2;
dpoint[2] = outp;
outp = dpoint[1];
bRes = getPointAtSect(dpoint[0], dpoint[1], d, dpoint[2]);
outp.ax = dpoint[2].ax;
outp.ay = dpoint[2].ay;
return bRes;
}
bool EmbData::getPointAtSect(const DsAbsItem &p1, const DsAbsItem &p2, const double &d, DsAbsItem &outp)
{
double s = sqrt((p1.ax - p2.ax) * (p1.ax - p2.ax) + (p1.ay - p2.ay) * (p1.ay - p2.ay));
if(fabs(s) < ZERO)
{
if(d < ZERO)
{
outp.ax = p1.ax;
outp.ay = p1.ay;
}
return false;
}
outp.ax = (p2.ax - p1.ax) * d / s + p1.ax;
outp.ay = (p2.ay - p1.ay) * d / s + p1.ay;
return true;
}
bool EmbData::checkData(int size)
{
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("ary data less then head size");
return false;
}
int datasize = size - sizeof(DataDs16FileHead);
int stepsize = datasize/sizeof(DsAbsItem);
if (stepsize <= 0)
{
qDebug("dat data size err");
return false;
}
return true;
}
//设置视图尺寸(透明背景)
int EmbData::setViewInfo(int width, int height)
{
// if (m_viewWidth != width ||
// m_viewHight != height)
{
if (width <= EMB_PREVIEW_SIDE*2 || height <= EMB_PREVIEW_SIDE*2)
{
return -1;
}
m_viewWidth = width;
m_viewHight = height;
m_canvas = QPixmap(m_viewWidth, m_viewHight);
m_canvas.fill(Qt::transparent);//用透明色填充
//memset(m_canvas.bits(), 0x00, m_canvas.byteCount());
}
return 0;
}
//设置视图(带背景图片背景)
void EmbData::setViewInfo(QPixmap pix)
{
m_canvas = pix;
}
//重置数据
void EmbData::setEmbData(int type, int redraw)
{
m_type = type;
createDispFromEmbDs16Dat(m_embDs16Data);
if (redraw != 0)
{
drawImageByDispFile();
}
}
void EmbData::setDispMode(EmbData::DISP_MODE dispmode, int redraw)
{
m_dispMode = dispmode;
if(redraw != 0)
{
drawImageByDispFile();
}
}
void EmbData::setDrawMode(EmbData::DRAW_MODE drawmode)
{
m_drawMode = drawmode;
}
//设置进度显示数据
void EmbData::setExecIndex(int index)
{
m_stitchIndex = index;
if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI)
{
//实时刷新最后一个图形
int num = m_dispDat.size() / sizeof(DispItem);
num -= m_pEmbDs16Head->itemNums;
num += index;
m_stitchIndex = num;
}
if (m_dispMode == DISP_EXECING)
{
drawImageByDispFile();
}
}
void EmbData::reDraw()
{
drawImageByDispFile();
}
//创建显示用的数据(为了快速显示)
int EmbData::createDispFromEmbDs16Dat(QByteArray &ds16dat)
{
if(m_type == MACHINE_FIVEHEADPRECISIONSEWING)
return createDispFromEmbDs16DatForHeadInfo(ds16dat);
if(m_type == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI)
return createDispFromEmbDs16DatDoubleHeadComb(ds16dat);
DispItem dispItem;
m_dispDat.clear();//显示绘图用的数据(需要转换)
// DsAbsItem absItem;//用于轮廓提取的绝对坐标值
// m_ds16ToAbsDat.clear();//用于轮廓提取的绝对坐标值
m_stitchIndex = 0;
m_dispIndex = 0;
// ds16数据
int size = ds16dat.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("16 data less then head size");
return -1;
}
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ds16dat.data());
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("dat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(Ds16Item);
if (stepsize <= 0)
{
qDebug("ds16 data size err");
return -1;
}
Ds16Item * ds16DataPtr;
Ds16Item * pData = (Ds16Item *)(ds16dat.data() + sizeof(DataDs16FileHead));
ds16DataPtr = pData;
// 图形显示区域
int width = m_canvas.width();//留4个像素的边
int height = m_canvas.height();//留4个像素的边
if (width <= EMB_PREVIEW_SIDE*2 || height <= EMB_PREVIEW_SIDE*2)
{
qDebug("preview img too small");
return -1;
}
//留边(否则实时跟踪笔会画出界)
int viewSide = EMB_PREVIEW_SIDE;
if(m_drawMode == DRAW_PREVIEW)
{
viewSide = 20;//预览模式时整区域留20像素绘制(原色显示)
}
int dpminx = viewSide;
int dpmaxx = width - viewSide;
int dpminy = viewSide;
int dpmaxy = height - viewSide;
//1:1显示无需留边
// int dpminx = 0;
// int dpmaxx = width;
// int dpminy = 0;
// int dpmaxy = height;
// 计算缩放系数
double factor, temp;
if ((dpmaxx - dpminx) <= 0 || (dpmaxy - dpminy) <= 0)
{
return -1;
}
factor = (double)(fabs(m_maxX-m_minX)) / (dpmaxx - dpminx); // 按框尺寸x计算的缩放系数
temp = (double)(fabs(m_maxY-m_minY)) / (dpmaxy - dpminy); // 按框尺寸y计算的缩放系数
if (temp >= factor) // 使用较大的缩放系数
{
factor = temp;
}
m_factor = factor;
// 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心)
int dpx = (int)((dpminx+dpmaxx)/2 - ((m_maxX+m_minX)/factor)/2);
int dpy = (int)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2);
// 显示花样图形
u8 ctrlByte;
u8 attrByte;
int dx;
int dy;
int dr;
double datposx, datposy, datposr;
int curx, cury, curr, prex, prey;
curx = cury = curr = prex = prey = 0;
datposx = pDsHead->beginX;
datposy = pDsHead->beginY;
datposr = pDsHead->beginR;
curx = (datposx) / factor + dpx;
cury = (datposy) / factor + dpy;
if(isFlipDispYMac())
{
emb_showDirY = -1;
}
if(isFlipDispXMac())
{
emb_showDirX = -1;
}
if (emb_showDirX == -1)
{
curx = width - curx;
}
if (emb_showDirY == -1)
{
cury = height - cury;
}
for (int i = 0; i < stepsize; i++)
{
prex = curx;
prey = cury;
// 读入一个针步数据
ctrlByte = ds16DataPtr->ctrl;
attrByte = ds16DataPtr->attr;
dx = ds16DataPtr->dx;
dy = ds16DataPtr->dy;
dr = ds16DataPtr->dr;
datposx += dx;
datposy += dy;
datposr += dr;
curx = (datposx) / factor + dpx;
cury = (datposy) / factor + dpy;
if (emb_showDirX == -1)
{
curx = width - curx;
}
if (emb_showDirY == -1)
{
cury = height - cury;
}
while(datposr >= PI10000)
{
datposr -= (PI20000-1);
}
while(datposr <= -PI10000)
{
datposr += (PI20000-1);
}
dispItem.ctrl = ctrlByte;
dispItem.attr = attrByte;
dispItem.bx = prex;
dispItem.by = prey;
dispItem.ex = curx;
dispItem.ey = cury;
dispItem.ar = curr;
if(g_emMacType == MACHINE_CUTTINGWALK)
{
//边走边裁
if(ctrlByte ==DATA_OFFSET) //跨步(偏移)针步另一种颜色显示
dispItem.rgb = Qt::transparent;
if(ctrlByte ==DATA_DRAWING) //画笔
dispItem.rgb = qRgb(240,155,89);
else if(ctrlByte ==DATA_RKNIFE)//圆刀
dispItem.rgb = qRgb(0,128,255);
else if(ctrlByte ==DATA_SKNIFE)//震刀
dispItem.rgb = qRgb(0x35,0xC0,0x5C);
}
else
{
if(ctrlByte == DATA_OFFSET) //跨步(偏移)针步另一种颜色显示
dispItem.rgb = getJumpedColour();
else
dispItem.rgb = getSewedColour();
}
memcpy(&dispItem.action,ds16DataPtr->action,sizeof(dispItem.action));
m_dispDat.append((char*)(&dispItem), sizeof(DispItem));
ds16DataPtr++;
}
qDebug("CreateDispFromEmbDs16, stepsize=%d", m_dispDat.size() / sizeof(DispItem));
return 0;
}
/**
* @brief EmbData::五头机创建绘图数据
* @param ds16dat
* @return
*/
int EmbData::createDispFromEmbDs16DatForHeadInfo(QByteArray &ds16dat)
{
m_headDispDate.clear();
DataFileDsr dsr;//可能引起栈内存溢出的问题
dsr.initFile(m_filePath);
dsr.convertDataToEmbAbs();
DsrHeadEx62 head = dsr.get62ExHead();
int StepNum = dsr.getStepNums();
int maxHSP = findMaxSpHead(head,StepNum);
Disp_HeadItem dispItem;
m_dispDat.clear();//显示绘图用的数据(需要转换)
m_stitchIndex = 0;
m_dispIndex = 0;
// ds16数据
int size = ds16dat.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("16 data less then head size");
return -1;
}
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ds16dat.data());
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("dat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(Ds16Item);
if (stepsize <= 0)
{
qDebug("ds16 data size err");
return -1;
}
Ds16Item * ds16DataPtr;
Ds16Item * pData = (Ds16Item *)(ds16dat.data() + sizeof(DataDs16FileHead));
ds16DataPtr = pData;
// 图形显示区域
int width = m_canvas.width();//留4个像素的边
int height = m_canvas.height();//留4个像素的边
if (width <= EMB_PREVIEW_SIDE*2 || height <= EMB_PREVIEW_SIDE*2)
{
qDebug("preview img too small");
return -1;
}
//留边(否则实时跟踪笔会画出界)
int viewSide = EMB_PREVIEW_SIDE;
if(m_drawMode == DRAW_PREVIEW)
{
viewSide = 20;//预览模式时整区域留20像素绘制(原色显示)
}
int dpminx = viewSide;
int dpmaxx = width - viewSide;
int dpminy = viewSide;
int dpmaxy = height - viewSide;
// 计算缩放系数
double factor, temp;
if ((dpmaxx - dpminx) <= 0 || (dpmaxy - dpminy) <= 0)
{
return -1;
}
factor = (double)(fabs(m_maxX+(maxHSP*10)-m_minX)) / (dpmaxx - dpminx); // 按框尺寸x计算的缩放系数 五头机加上一个最大值保证绘图不越界
temp = (double)(fabs(m_maxY-m_minY)) / (dpmaxy - dpminy); // 按框尺寸y计算的缩放系数
// 使用较大的缩放系数
factor = temp >= factor?temp:factor;
m_factor = factor;
// 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心)
int dpx = (int)((dpminx+dpmaxx)/2 - ((m_maxX+m_minX+(maxHSP*10))/factor)/2);//最大x需要 五头机加上一个最大值保证绘图不越界
int dpy = (int)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2);
// 显示花样图形
double datposx = pDsHead->beginX;
double datposy = pDsHead->beginY;
int curx = (datposx) / factor + dpx;
int cury = (datposy) / factor + dpy;
if (emb_showDirX == -1)
{
curx = width - curx;
}
if (emb_showDirY == -1)
{
cury = height - cury;
}
for (int i = 0; i < stepsize; i++)
{
int prex = curx;
int prey = cury;
// 读入一个针步数据
int dx = ds16DataPtr->dx;
int dy = ds16DataPtr->dy;
unsigned short int headSpHndex = ds16DataPtr->action[1] & 0xFF;
datposx += dx;
datposy += dy;
curx = (datposx) / factor + dpx;
cury = (datposy) / factor + dpy;
if (emb_showDirX == -1)
{
curx = width - curx;
}
if (emb_showDirY == -1)
{
cury = height - cury;
}
dispItem.ctrl = ds16DataPtr->ctrl;
dispItem.attr = ds16DataPtr->attr;
dispItem.bx = prex;
dispItem.by = prey;
dispItem.ex = curx;
dispItem.ey = cury;
dispItem.ar = ds16DataPtr->dr;
memcpy(&dispItem.action,ds16DataPtr->action,2);
dispItem.headtable.iswork = head.headEnableSpacing[headSpHndex].iswork;
dispItem.headtable.distance1_2 = head.headEnableSpacing[headSpHndex].distance1_2;
dispItem.headtable.distance1_3 = head.headEnableSpacing[headSpHndex].distance1_3;
dispItem.headtable.distance1_4 = head.headEnableSpacing[headSpHndex].distance1_4;
dispItem.headtable.distance1_5 = head.headEnableSpacing[headSpHndex].distance1_5;
dispItem.headtable.distance1_6 = head.headEnableSpacing[headSpHndex].distance1_6;
dispItem.headtable.distance1_7 = head.headEnableSpacing[headSpHndex].distance1_7;
dispItem.headtable.distance1_8 = head.headEnableSpacing[headSpHndex].distance1_8;
if(ds16DataPtr->ctrl ==DATA_OFFSET) //跨步(偏移)针步另一钟颜色显示
dispItem.rgb = getNoJumpColour();
else
dispItem.rgb = getNoSewColour();
m_headDispDate.append(dispItem);
ds16DataPtr++;
}
qDebug() << "createDispFromEmbDs16DatForHeadInfo"<< "CreateDispFromEmbDs16, stepsize="<< m_headDispDate.size();
return 0;
}
int EmbData::createDispFromEmbDs16DatDoubleHeadComb(QByteArray &ds16dat)
{
DispItem dispItem;
m_dispDat.clear();//显示绘图用的数据(需要转换)
// DsAbsItem absItem;//用于轮廓提取的绝对坐标值
// m_ds16ToAbsDat.clear();//用于轮廓提取的绝对坐标值
m_stitchIndex = 0;
m_dispIndex = 0;
// ds16数据
int size = ds16dat.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("16 data less then head size");
return -1;
}
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ds16dat.data());
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("dat dataBegin err");
return -1;
}
int stepsize = datasize/sizeof(Ds16Item);
if (stepsize <= 0)
{
qDebug("ds16 data size err");
return -1;
}
Ds16Item * ds16DataPtr;
Ds16Item * pData = (Ds16Item *)(ds16dat.data() + sizeof(DataDs16FileHead));
ds16DataPtr = pData;
// 图形显示区域
int width = m_canvas.width();//留4个像素的边
int height = m_canvas.height();//留4个像素的边
if (width <= EMB_PREVIEW_SIDE*2 || height <= EMB_PREVIEW_SIDE*2)
{
qDebug("preview img too small");
return -1;
}
//留边(否则实时跟踪笔会画出界)
int viewSide = EMB_PREVIEW_SIDE;
if(m_drawMode == DRAW_PREVIEW)
{
viewSide = 20;//预览模式时整区域留20像素绘制(原色显示)
}
int dpminx = viewSide;
int dpmaxx = width - viewSide;
int dpminy = viewSide;
int dpmaxy = height - viewSide;
//1:1显示无需留边
// int dpminx = 0;
// int dpmaxx = width;
// int dpminy = 0;
// int dpmaxy = height;
// 计算缩放系数
double factor, temp;
if ((dpmaxx - dpminx) <= 0 || (dpmaxy - dpminy) <= 0)
{
return -1;
}
factor = (double)(fabs(m_maxX-m_minX)) / (dpmaxx - dpminx); // 按框尺寸x计算的缩放系数
temp = (double)(fabs(m_maxY-m_minY)) / (dpmaxy - dpminy); // 按框尺寸y计算的缩放系数
if (temp >= factor) // 使用较大的缩放系数
{
factor = temp;
}
m_factor = factor;
// 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心)
int dpx = (int)((dpminx+dpmaxx)/2 - ((m_maxX+m_minX)/factor)/2);
int dpy = (int)((dpminy+dpmaxy)/2 - ((m_maxY+m_minY)/factor)/2);
if(isFlipDispYMac())
{
emb_showDirY = -1;
}
if(isFlipDispXMac())
{
emb_showDirX = -1;
}
double secOftX = pDsHead->beginX2 - pDsHead->beginX;
double secOftY = pDsHead->beginY2 - pDsHead->beginY;
qDebug()<<"secOftX"<<secOftX<<"secOftY"<<secOftY;
// 显示花样图形
u8 ctrlByte;
u8 attrByte;
int dx;
int dy;
int dr;
double datposx, datposy, datposx2, datposy2, datposr;
int curx, cury, curr, prex, prey;
curx = cury = curr = prex = prey = 0;
int curx2, cury2, prex2, prey2;
curx2 = cury2 = prex2 = prey2 = 0;
datposx = 0;
datposy = 0;
datposx2 = secOftX*emb_showDirX;
datposy2 = secOftY*emb_showDirY;
curx = (datposx) / factor + dpx;
cury = (datposy) / factor + dpy;
curx2 = (datposx2) / factor + dpx;
cury2 = (datposy2) / factor + dpy;
if (emb_showDirX == -1)
{
curx = width - curx;
curx2 = width - curx2;
}
if (emb_showDirY == -1)
{
cury = height - cury;
cury2 = height - cury2;
}
prex = curx;
prey = cury;
prex2 = curx2;
prey2 = cury2;
for (int i = 0; i < stepsize; i++)
{
// 读入一个针步数据
ctrlByte = ds16DataPtr->ctrl;
attrByte = ds16DataPtr->attr;
dr = ds16DataPtr->dr;
if(ctrlByte != DATA_OFFSET_SEC && ctrlByte != DATA_SEWING_R)//非右机头偏移和缝纫
{
prex = curx;
prey = cury;
dx = ds16DataPtr->dx;
dy = ds16DataPtr->dy;
datposx += dx;
datposy += dy;
datposr += dr;
curx = (datposx) / factor + dpx;
cury = (datposy) / factor + dpy;
if (emb_showDirX == -1)
{
curx = width - curx;
}
if (emb_showDirY == -1)
{
cury = height - cury;
}
}
if(ctrlByte != DATA_OFFSET && ctrlByte != DATA_SEWING)//非左机头偏移
{
prex2 = curx2;
prey2 = cury2;
dx = ds16DataPtr->dx;
dy = ds16DataPtr->dy;
if(ctrlByte == DATA_MIRROR_SEC || ctrlByte == DATA_MIRROR_OFT_SEC)
{
datposx2 = datposx2 + dx*-1;
datposy2 += dy;
}
else
{
datposx2 += dx;
datposy2 += dy;
}
curx2 = (datposx2) / factor + dpx;
cury2 = (datposy2) / factor + dpy;
if (emb_showDirX == -1)
{
curx2 = width - curx2;
}
if (emb_showDirY == -1)
{
cury2 = height - cury2;
}
}
#if(0)
while(datposr >= PI10000)
{
datposr -= (PI20000-1);
}
while(datposr <= -PI10000)
{
datposr += (PI20000-1);
}
#endif
dispItem.ctrl = ctrlByte;
dispItem.attr = attrByte;
dispItem.bx = prex;
dispItem.by = prey;
dispItem.ex = curx;
dispItem.ey = cury;
dispItem.bx2 = prex2;
dispItem.by2 = prey2;
dispItem.ex2 = curx2;
dispItem.ey2 = cury2;
dispItem.ar = curr;
if(dispItem.ctrl == DATA_NULL)
{
dispItem.ex = dispItem.bx;
dispItem.ey = dispItem.by;
dispItem.ex2 = dispItem.bx2;
dispItem.ey2 = dispItem.by2;
}
if(ctrlByte == DATA_OFFSET || ctrlByte == DATA_OFFSET_SEC || ctrlByte == DATA_SYNCOFST || ctrlByte == DATA_MIRROR_OFT_SEC) //跨步(偏移)针步另一钟颜色显示
dispItem.rgb = getJumpedColour();
else
dispItem.rgb = getSewedColour();
memcpy(&dispItem.action,ds16DataPtr->action,sizeof(dispItem.action));
m_dispDat.append((char*)(&dispItem), sizeof(DispItem));
ds16DataPtr++;
}
qDebug("CreateDispFromEmbDs16, stepsize=%d", m_dispDat.size() / sizeof(DispItem));
return 0;
}
void EmbData::resetLayoutDispDat(unsigned char *arrayNeedle1, unsigned char *arrayNeedle2, unsigned char *arrayNeedle3, int leftRightNeedleSpace,int needlesSpace,int needleLayoutSpace12,int needleLayoutSpace23,int reDat)
{
m_dispDat.clear();//显示绘图用的数据(需要转换)
int stepsize = m_oneDispDat.size() / sizeof(DispItem);
s16 lastNum = 6;//最后一排的循环次数
int circleNum = 0;//循环次数
circleNum = (needleLayoutSpace12+needleLayoutSpace23+ (m_maxY - m_minY)*(lastNum+1)) / (m_maxY - m_minY);
int circleNumMiddle = 0;//循环次数
circleNumMiddle = (needleLayoutSpace23 + (m_maxY - m_minY)*(lastNum+1)) / (m_maxY - m_minY);
//根据前中后排的设置,再添加绘制数据
if(reDat == 0 || reDat == 1)
{
//根据前中后排的设置,重置前排数据
char frontSet[LAYOUTNEEDLENUM*2];
memset((char*)frontSet,0,sizeof(frontSet));
for(int i = 0; i < LAYOUTNEEDLENUM; i++)//12个针位设置对应24根镇一个针位上有2根针每根针之间间距为1/2英寸
{
unsigned char val = *(arrayNeedle1+i);
if(val == NEEDLELEFT)
{
frontSet[0+2*i] = 1;
frontSet[1+2*i] = 0;
}
else if(val == NEEDLERIGHT)
{
frontSet[0+2*i] = 0;
frontSet[1+2*i] = 1;
}
else if(val == NEEDLEDOUBLE)
{
frontSet[0+2*i] = 1;
frontSet[1+2*i] = 1;
}
else if(val == NEEDLENONE)
{
frontSet[0+2*i] = 0;
frontSet[1+2*i] = 0;
}
}
m_dispDatFront.clear();
DispItem dispItemFront;
double frontSpace = 0;
double frontYSpace = 0;
for(unsigned int i = 0; i < sizeof(frontSet); i++)//12个针位设置对应24根镇一个针位上有2根针每根针之间间距为1/2英寸
{
DispItem * pData = (DispItem *)(m_oneDispDat.data());
char val = frontSet[i];
if(val == 1)
{
for (int j = 0; j < stepsize; j++)
{
dispItemFront = *pData;
dispItemFront.bx += frontSpace;
dispItemFront.ex += frontSpace;
if (m_dispMinX > dispItemFront.bx) { m_dispMinX = dispItemFront.bx; }
if (m_dispMinX > dispItemFront.ex) { m_dispMinX = dispItemFront.ex; }
if (m_dispMaxX < dispItemFront.bx) { m_dispMaxX = dispItemFront.bx; }
if (m_dispMaxX < dispItemFront.ex) { m_dispMaxX = dispItemFront.ex; }
//中排和后排无数据时
if(m_dispDatMiddle.size() <= 0 && m_dispDatBehind.size() <= 0)
{
if (m_dispMinY > dispItemFront.by) { m_dispMinY = dispItemFront.by; }
if (m_dispMinY > dispItemFront.ey) { m_dispMinY = dispItemFront.ey; }
if (m_dispMaxY < dispItemFront.by) { m_dispMaxY = dispItemFront.by; }
if (m_dispMaxY < dispItemFront.ey) { m_dispMaxY = dispItemFront.ey; }
}
m_dispDatFront.append((char*)(&dispItemFront), sizeof(DispItem));
pData++;
}
//Y方向再循环多次
for(int m = 0; m < circleNum; m++)
{
DispItem * pData = (DispItem *)(m_oneDispDat.data());
frontYSpace = m * (m_maxY - m_minY) + (m_maxY - m_minY);
for (int j = 0; j < stepsize; j++)
{
dispItemFront = *pData;
dispItemFront.bx += frontSpace;
dispItemFront.ex += frontSpace;
dispItemFront.by -= frontYSpace;
dispItemFront.ey -= frontYSpace;
if (m_dispMinX > dispItemFront.bx) { m_dispMinX = dispItemFront.bx; }
if (m_dispMinX > dispItemFront.ex) { m_dispMinX = dispItemFront.ex; }
if (m_dispMaxX < dispItemFront.bx) { m_dispMaxX = dispItemFront.bx; }
if (m_dispMaxX < dispItemFront.ex) { m_dispMaxX = dispItemFront.ex; }
//中排和后排无数据时
if(m_dispDatMiddle.size() <= 0 && m_dispDatBehind.size() <= 0)
{
if (m_dispMinY > dispItemFront.by) { m_dispMinY = dispItemFront.by; }
if (m_dispMinY > dispItemFront.ey) { m_dispMinY = dispItemFront.ey; }
if (m_dispMaxY < dispItemFront.by) { m_dispMaxY = dispItemFront.by; }
if (m_dispMaxY < dispItemFront.ey) { m_dispMaxY = dispItemFront.ey; }
}
m_dispDatFront.append((char*)(&dispItemFront), sizeof(DispItem));
pData++;
}
}
}
if(i % 2 == 0)
{
frontSpace += leftRightNeedleSpace;
}
else
{
//frontSpace += leftRightNeedleSpace*3;
frontSpace = (i-i/2)*needlesSpace;
}
}
}
if(reDat == 0 || reDat == 2)
{
double dispMinY = S32_MAX;
double dispMaxY = S32_MIN;
//根据前中后排的设置,重置中排数据
char middleSet[LAYOUTNEEDLENUM*2];
memset((char*)middleSet,0,sizeof(middleSet));
for(int i = 0; i < LAYOUTNEEDLENUM; i++)//12个针位设置对应24根镇一个针位上有2根针每根针之间间距为1/2英寸
{
unsigned char val = *(arrayNeedle2+i);
if(val == NEEDLELEFT)
{
middleSet[0+2*i] = 1;
middleSet[1+2*i] = 0;
}
else if(val == NEEDLERIGHT)
{
middleSet[0+2*i] = 0;
middleSet[1+2*i] = 1;
}
else if(val == NEEDLEDOUBLE)
{
middleSet[0+2*i] = 1;
middleSet[1+2*i] = 1;
}
else if(val == NEEDLENONE)
{
middleSet[0+2*i] = 0;
middleSet[1+2*i] = 0;
}
}
m_dispDatMiddle.clear();
DispItem dispItemMiddle;
double middleSpace = 0;
double middleYSpace = 0;
double ySpace = needleLayoutSpace12;
for(unsigned int i = 0; i < sizeof(middleSet); i++)//12个针位设置对应24根镇一个针位上有2根针每根针之间间距为1/2英寸
{
DispItem * pData = (DispItem *)(m_oneDispDat.data());
char val = middleSet[i];
if(val == 1)
{
for (int j = 0; j < stepsize; j++)
{
dispItemMiddle = *pData;
dispItemMiddle.bx += middleSpace;
dispItemMiddle.ex += middleSpace;
dispItemMiddle.by -= ySpace;
dispItemMiddle.ey -= ySpace;
if (m_dispMinX > dispItemMiddle.bx) { m_dispMinX = dispItemMiddle.bx; }
if (m_dispMinX > dispItemMiddle.ex) { m_dispMinX = dispItemMiddle.ex; }
if (m_dispMaxX < dispItemMiddle.bx) { m_dispMaxX = dispItemMiddle.bx; }
if (m_dispMaxX < dispItemMiddle.ex) { m_dispMaxX = dispItemMiddle.ex; }
//后排无数据时
if(m_dispDatBehind.size() <= 0)
{
if (dispMinY > dispItemMiddle.by) { dispMinY = dispItemMiddle.by; }
if (dispMinY > dispItemMiddle.ey) { dispMinY = dispItemMiddle.ey; }
if (dispMaxY < dispItemMiddle.by) { dispMaxY = dispItemMiddle.by; }
if (dispMaxY < dispItemMiddle.ey) { dispMaxY = dispItemMiddle.ey; }
m_dispMinY = dispMinY;
m_dispMaxY = dispMaxY;
}
m_dispDatMiddle.append((char*)(&dispItemMiddle), sizeof(DispItem));
pData++;
}
//Y方向再循环多次
for(int m = 0; m < circleNumMiddle; m++)
{
DispItem * pData = (DispItem *)(m_oneDispDat.data());
middleYSpace = m * (m_maxY - m_minY) + (m_maxY - m_minY);
for (int j = 0; j < stepsize; j++)
{
dispItemMiddle = *pData;
dispItemMiddle.bx += middleSpace;
dispItemMiddle.ex += middleSpace;
dispItemMiddle.by -= (ySpace+middleYSpace);
dispItemMiddle.ey -= (ySpace+middleYSpace);
if (m_dispMinX > dispItemMiddle.bx) { m_dispMinX = dispItemMiddle.bx; }
if (m_dispMinX > dispItemMiddle.ex) { m_dispMinX = dispItemMiddle.ex; }
if (m_dispMaxX < dispItemMiddle.bx) { m_dispMaxX = dispItemMiddle.bx; }
if (m_dispMaxX < dispItemMiddle.ex) { m_dispMaxX = dispItemMiddle.ex; }
//后排无数据时
if(m_dispDatBehind.size() <= 0)
{
if (dispMinY > dispItemMiddle.by) { dispMinY = dispItemMiddle.by; }
if (dispMinY > dispItemMiddle.ey) { dispMinY = dispItemMiddle.ey; }
if (dispMaxY < dispItemMiddle.by) { dispMaxY = dispItemMiddle.by; }
if (dispMaxY < dispItemMiddle.ey) { dispMaxY = dispItemMiddle.ey; }
m_dispMinY = dispMinY;
m_dispMaxY = dispMaxY;
}
m_dispDatMiddle.append((char*)(&dispItemMiddle), sizeof(DispItem));
pData++;
}
}
}
if(i % 2 == 0)
{
middleSpace += leftRightNeedleSpace;
}
else
{
//middleSpace += leftRightNeedleSpace*3;
middleSpace = (i-i/2)*needlesSpace;
}
}
}
if(reDat == 0 || reDat == 3)
{
double dispMinY = S32_MAX;
double dispMaxY = S32_MIN;
//根据前中后排的设置,重置后排数据
char behindSet[LAYOUTNEEDLENUM*2];
memset((char*)behindSet,0,sizeof(behindSet));
for(int i = 0; i < LAYOUTNEEDLENUM; i++)//12个针位设置对应24根镇一个针位上有2根针每根针之间间距为1/2英寸
{
unsigned char val = *(arrayNeedle3+i);
if(val == NEEDLELEFT)
{
behindSet[0+2*i] = 1;
behindSet[1+2*i] = 0;
}
else if(val == NEEDLERIGHT)
{
behindSet[0+2*i] = 0;
behindSet[1+2*i] = 1;
}
else if(val == NEEDLEDOUBLE)
{
behindSet[0+2*i] = 1;
behindSet[1+2*i] = 1;
}
else if(val == NEEDLENONE)
{
behindSet[0+2*i] = 0;
behindSet[1+2*i] = 0;
}
}
m_dispDatBehind.clear();
DispItem dispItemBehind;
double behindSpace = 0;
double behindYSpace = 0;
double ySpace = needleLayoutSpace12+needleLayoutSpace23;
for(unsigned int i = 0; i < sizeof(behindSet); i++)//12个针位设置对应24根镇一个针位上有2根针每根针之间间距为1/2英寸
{
DispItem * pData = (DispItem *)(m_oneDispDat.data());
char val = behindSet[i];
if(val == 1)
{
for (int j = 0; j < stepsize; j++)
{
dispItemBehind = *pData;
dispItemBehind.bx += behindSpace;
dispItemBehind.ex += behindSpace;
dispItemBehind.by -= ySpace;
dispItemBehind.ey -= ySpace;
if (m_dispMinX > dispItemBehind.bx) { m_dispMinX = dispItemBehind.bx; }
if (m_dispMinX > dispItemBehind.ex) { m_dispMinX = dispItemBehind.ex; }
if (m_dispMaxX < dispItemBehind.bx) { m_dispMaxX = dispItemBehind.bx; }
if (m_dispMaxX < dispItemBehind.ex) { m_dispMaxX = dispItemBehind.ex; }
if (dispMinY > dispItemBehind.by) { dispMinY = dispItemBehind.by; }
if (dispMinY > dispItemBehind.ey) { dispMinY = dispItemBehind.ey; }
if (dispMaxY < dispItemBehind.by) { dispMaxY = dispItemBehind.by; }
if (dispMaxY < dispItemBehind.ey) { dispMaxY = dispItemBehind.ey; }
m_dispDatBehind.append((char*)(&dispItemBehind), sizeof(DispItem));
pData++;
}
//Y方向再循环多次
for(int m = 0; m < lastNum; m++)
{
DispItem * pData = (DispItem *)(m_oneDispDat.data());
behindYSpace = m * (m_maxY - m_minY) + (m_maxY - m_minY);
for (int j = 0; j < stepsize; j++)
{
dispItemBehind = *pData;
dispItemBehind.bx += behindSpace;
dispItemBehind.ex += behindSpace;
dispItemBehind.by -= (ySpace+behindYSpace);
dispItemBehind.ey -= (ySpace+behindYSpace);
if (m_dispMinX > dispItemBehind.bx) { m_dispMinX = dispItemBehind.bx; }
if (m_dispMinX > dispItemBehind.ex) { m_dispMinX = dispItemBehind.ex; }
if (m_dispMaxX < dispItemBehind.bx) { m_dispMaxX = dispItemBehind.bx; }
if (m_dispMaxX < dispItemBehind.ex) { m_dispMaxX = dispItemBehind.ex; }
if (dispMinY > dispItemBehind.by) { dispMinY = dispItemBehind.by; }
if (dispMinY > dispItemBehind.ey) { dispMinY = dispItemBehind.ey; }
if (dispMaxY < dispItemBehind.by) { dispMaxY = dispItemBehind.by; }
if (dispMaxY < dispItemBehind.ey) { dispMaxY = dispItemBehind.ey; }
m_dispDatBehind.append((char*)(&dispItemBehind), sizeof(DispItem));
pData++;
}
}
m_dispMinY = dispMinY;
m_dispMaxY = dispMaxY;
}
if(i % 2 == 0)
{
behindSpace += leftRightNeedleSpace;
}
else
{
//behindSpace += leftRightNeedleSpace*3;
behindSpace = (i-i/2)*needlesSpace;
}
}
}
m_dispDat.clear();
m_dispDat.append(m_dispDatFront);
m_dispDat.append(m_dispDatMiddle);
m_dispDat.append(m_dispDatBehind);
if(m_dispDat.size() <= 0)
{
m_dispDat.append(m_oneDispDat);
m_dispMaxX = m_maxX;
m_dispMinX = m_minX;
m_dispMaxY = m_maxY;
m_dispMinY = m_minY;
}
}
int EmbData::createDispFromEmbDs16DatForFlyShuttle(int initFlag)
{
if(initFlag != 0)
{
if(m_dispDatFront.size() > 0 || m_dispDatMiddle.size() > 0 || m_dispDatBehind.size() > 0)
{
m_dispDat.clear();
m_dispDat.append(m_dispDatFront);
m_dispDat.append(m_dispDatMiddle);
m_dispDat.append(m_dispDatBehind);
}
else
{
m_dispDat.clear();
m_dispDat.append(m_oneDispDat);
}
}
m_stitchIndex = 0;
m_dispIndex = 0;
// 图形显示区域
int width = m_canvas.width();//留4个像素的边
int height = m_canvas.height();//留4个像素的边
if (width <= EMB_PREVIEW_SIDE*2 || height <= EMB_PREVIEW_SIDE*2)
{
qDebug("preview img too small");
return -1;
}
//留边(否则实时跟踪笔会画出界)
int viewSide = EMB_PREVIEW_SIDE;
if(m_drawMode == DRAW_PREVIEW)
{
viewSide = 20;//预览模式时整区域留20像素绘制(原色显示)
}
int dpminx = viewSide;
int dpmaxx = width - viewSide;
int dpminy = viewSide;
int dpmaxy = height - viewSide;
//1:1显示无需留边
// int dpminx = 0;
// int dpmaxx = width;
// int dpminy = 0;
// int dpmaxy = height;
// 计算缩放系数
double factor, temp;
if ((dpmaxx - dpminx) <= 0 || (dpmaxy - dpminy) <= 0)
{
return -1;
}
factor = (double)(fabs(m_dispMaxX-m_dispMinX)) / (dpmaxx - dpminx); // 按框尺寸x计算的缩放系数
temp = (double)(fabs(m_dispMaxY-m_dispMinY)) / (dpmaxy - dpminy); // 按框尺寸y计算的缩放系数
if(g_emResolut == resolution1910)
{
temp += 0.1;
}
if (temp >= factor) // 使用较大的缩放系数
{
factor = temp;
}
m_factor = factor;
// 计算显示参数,按照图形的实际位置显示(数据坐标零点对应图形中心)
int dpx = (int)((dpminx+dpmaxx)/2 - ((m_dispMaxX+m_dispMinX)/factor)/2);
//int dpy = (int)((dpminy+dpmaxy)/2 - ((m_dispMaxY+m_dispMinY)/factor)/2);
int dpy = (int)((dpmaxy) - ((m_dispMaxY)/factor));//多针机不居中,顶端对齐
if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI)
{
emb_showDirY = -1;
}
int dispstepsize = m_dispDat.size()/sizeof(DispItem);
if (dispstepsize <= 0)
{
return -1;
}
DispItem * pDispData = (DispItem *)(m_dispDat.data());
for (int i = 0; i < dispstepsize; i++)
{
pDispData->bx = pDispData->bx / factor + dpx;
pDispData->by = pDispData->by / factor + dpy;
pDispData->ex = pDispData->ex / factor + dpx;
pDispData->ey = pDispData->ey / factor + dpy;
if (emb_showDirX == -1)
{
pDispData->bx = width - pDispData->bx;
pDispData->ex = width - pDispData->ex;
}
if (emb_showDirY == -1)
{
pDispData->by = height - pDispData->by;
pDispData->ey = height - pDispData->ey;
if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI)
{
double upSide = (height - dpmaxy);
double dnSide = dpmaxy;
if ((int)pDispData->by < upSide || (int)pDispData->by > dnSide)
{
pDispData->rgb = qRgba(0,0,0,0);//设置透明色
}
if ((int)pDispData->ey < upSide || (int)pDispData->ey > dnSide)
{
pDispData->rgb = qRgba(0,0,0,0);//设置透明色
}
}
}
pDispData++;
}
return 0;
}
#define DRAWDR 0
int EmbData::drawImageByDispFile()
{
if(m_type == MACHINE_FIVEHEADPRECISIONSEWING)
return drawImageByOneStepLotLine();
if(m_type == MACHINE_DOUBLEHEADQUI || g_emMacType == MACHINE_FOURHEADQUI)
return drawImageByDispFileDoubleHeadComb();
double bx, by, ex, ey, ar;
bx = by = ex = ey = ar = 0;
int i;
DispItem * pDispBuff = (DispItem *)m_dispDat.data();
int size = m_dispDat.size();
int stitchCount = size/sizeof(DispItem);
if (stitchCount <= 0)
{
stitchCount = 0;
}
if (m_stitchIndex >= stitchCount)
{
m_stitchIndex = stitchCount - 1;
}
if (m_stitchIndex < 0)
{
m_stitchIndex = 0;
}
DISP_MODE dispmode = m_dispMode;
QPainter painter(&m_canvas);
QPen pen;
//笔宽
pen.setWidth(1);
if (dispmode == DISP_ALL_NORMAL || dispmode == DISP_ALL_EXEC)
{
int tenThousand = 0;
for (i = 0; i < stitchCount; i++)
{
tenThousand++;
if(tenThousand == TENTHOUSANDNEEDLE)
{
tenThousand = 0;
int idx = i / TENTHOUSANDNEEDLE;
//每十万针主界面加载图片的进度条走一格
emit siDrawNeedleIdx(idx);
}
bx = pDispBuff[i].bx;
by = pDispBuff[i].by;
ex = pDispBuff[i].ex;
ey = pDispBuff[i].ey;
// 从开始到 m_stitchIndex 显示正常颜色的线迹(执行过),从 m_stitchIndex 结束显示未缝纫颜色线迹(未执行)
if ((dispmode == DISP_ALL_EXEC) && (i >= m_stitchIndex))
{
if(0 == pDispBuff[i].rgb || pDispBuff[i].ctrl == DATA_OFFSET)
{
pen.setColor(Qt::transparent);
}
else
{
pen.setColor(pDispBuff[i].rgb);
}
}
else
{//排针预览颜色
pen.setColor(Qt::cyan);
}
painter.setPen(pen);
painter.drawLine(bx, by, ex, ey);
#if(DRAWDR)
double len = sqrt((double)(ex-bx)*(double)(ex-bx)+ (double)(ey-by)*(double)(ey-by));
int mx = len * cos((PI10000-ar)/10000.0);
int my = len * sin((PI10000-ar)/10000.0);
QColor color = QColor(Qt::green);
QPen pen;
pen.setColor(color);
painter.setPen(pen);
painter.drawLine(bx, by, bx+mx, by+my);
pen.setColor(QColor(Qt::red));
painter.setPen(pen);
painter.drawEllipse(bx+mx, by+my,2,2);
#endif
}
if (dispmode == DISP_ALL_EXEC && m_stitchIndex < stitchCount)
{
//飞梭机将跟踪笔画到最后一个循环开始处
if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI)
{
int num = m_dispDat.size() / sizeof(DispItem);
num -= m_pEmbDs16Head->itemNums;
i = num + m_stitchIndex;
}
else
{
i = m_stitchIndex;
}
bx = pDispBuff[i].bx;
by = pDispBuff[i].by;
drawFork(bx, by, painter);//绘制准星
m_dispIndex = m_stitchIndex; // 移动显示指针
}
}
else if (dispmode == DISP_EXECING) // 刷新部分线迹(缝纫中进度显示)
{
if (m_stitchIndex != m_dispIndex)
{
eraseNeedleIdxPen(painter);//擦除跟踪笔
if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI)
{
//实时刷新最后一个循环图形
int num = m_dispDat.size() / sizeof(DispItem);
num -= m_pEmbDs16Head->itemNums;
m_dispIndex += num;
}
//增加针数
if (m_stitchIndex > m_dispIndex && m_stitchIndex < stitchCount)
{
i = m_dispIndex;
while(i < m_stitchIndex)
{
bx = pDispBuff[i].bx;
by = pDispBuff[i].by;
ex = pDispBuff[i].ex;
ey = pDispBuff[i].ey;
if(0 == pDispBuff[i].rgb || pDispBuff[i].ctrl == DATA_OFFSET)
{
pen.setColor(Qt::transparent);
}
else
{
pen.setColor(Qt::red);
}
painter.setPen(pen);
painter.drawLine(bx, by, ex, ey);
i++;
}
}
//减少针数
else if (m_stitchIndex < m_dispIndex && m_dispIndex < stitchCount)
{
i = m_stitchIndex;
while(i <= m_dispIndex) // 显示为未缝纫颜色线迹
{
bx = pDispBuff[i].bx;
by = pDispBuff[i].by;
ex = pDispBuff[i].ex;
ey = pDispBuff[i].ey;
if(0 == pDispBuff[i].rgb || pDispBuff[i].ctrl == DATA_OFFSET)
{
pen.setColor(Qt::transparent);
}
else
{
pen.setColor(pDispBuff[i].rgb);
}
painter.setPen(pen);
painter.drawLine(bx, by, ex, ey);
i++;
}
}
i = m_stitchIndex;
bx = pDispBuff[i].bx;
by = pDispBuff[i].by;
drawFork(bx, by, painter);//绘制跟踪笔
if(g_emMacType == MACHINE_FLYSHUTTLE || g_emMacType == MACHINE_L2000_MULTI)
{
//实时刷新最后一个循环图形
int num = m_dispDat.size() / sizeof(DispItem);
num -= m_pEmbDs16Head->itemNums;
m_dispIndex = m_stitchIndex - num;
}
else
{
m_dispIndex = m_stitchIndex; // 移动显示指针
}
}
}
return 0;
}
using namespace std;
/**
* @brief EmbData::drawImageByOneStepLotLine
* @return
* 五头机绘图函数 根据机头间距表信息单步画多条线
*/
int EmbData::drawImageByOneStepLotLine()
{
int stitchCount = m_headDispDate.size();
//限制针步数 否则访问溢出
if (stitchCount <= 0)
{
stitchCount = 0;
}
if (m_stitchIndex >= stitchCount)
{
m_stitchIndex = stitchCount - 1;
}
if (m_stitchIndex < 0)
{
m_stitchIndex = 0;
}
QPainter painter(&m_canvas);
QRgb rgb;
QPen pen;
//笔宽
pen.setWidth(1);
if (m_dispMode == DISP_ALL_NORMAL || // 显示所有线迹(原色显示)
m_dispMode == DISP_ALL_EXEC || // 显示所有线迹(执行过的显示原色,其余显示灰色)
0)
{
int tenThousand = 0;
for (int i = 0; i < stitchCount; i++)
{
tenThousand++;
if(tenThousand == TENTHOUSANDNEEDLE)
{
tenThousand = 0;
int idx = i / TENTHOUSANDNEEDLE;
//每十万针主界面加载图片的进度条走一格
emit siDrawNeedleIdx(idx);
}
// 从开始到 m_stitchIndex 显示正常颜色的线迹(执行过),从 m_stitchIndex 结束显示未缝纫颜色线迹(未执行)
rgb = m_headDispDate[i].rgb;
if ((m_dispMode == DISP_ALL_EXEC) && (i >= m_stitchIndex))
{
if(m_headDispDate[i].ctrl ==DATA_OFFSET) //跨步(偏移)针步另一钟颜色显示
rgb = getNoJumpColour();
else
rgb = getNoSewColour();
}
drawMultiLine(painter,pen,rgb,i);///多机头绘线
}
if (m_dispMode == DISP_ALL_EXEC && m_stitchIndex < stitchCount)
{
drawMultiTrack(painter);///绘制多机头的跟踪图案
m_dispIndex = m_stitchIndex; // 移动显示指针
}
}
else if (m_dispMode == DISP_EXECING) // 刷新部分线迹(缝纫中进度显示)前进回退的时候
{
//qDebug()<<"m_stitchIndex"<<m_stitchIndex<<"m_dispIndex"<<m_dispIndex;
if (m_stitchIndex != m_dispIndex)
{
for(int j = 0; j < headNum; j++)
eraseNeedleIdxPen(painter,j);///擦除跟踪笔
// 显示针迹改变
if (m_stitchIndex > m_dispIndex && m_stitchIndex < stitchCount)
{
/// 从小针步增加到大针步
int i = m_dispIndex;
while(i < m_stitchIndex) // 显示为原线迹
{
if(m_headDispDate[i].ctrl ==DATA_OFFSET) //跨步(偏移)针步另一钟颜色显示
rgb = getJumpedColour();
else
rgb = getSewedColour();
drawMultiLine(painter,pen,rgb,i);///多机头绘线
i++;
}
}
else if (m_stitchIndex < m_dispIndex && m_dispIndex < stitchCount)
{
/// 从大针步减少到小针步
int i = m_stitchIndex;
while(i <= m_dispIndex) // 显示为未缝纫颜色线迹
{
rgb = m_headDispDate[i].rgb;
drawMultiLine(painter,pen,rgb,i);///多机头绘线
i++;
}
}
drawMultiTrack(painter);///绘制多机头的跟踪图案
m_dispIndex = m_stitchIndex; // 移动显示指针
}
}
return 0;
}
int EmbData::drawImageByDispFileDoubleHeadComb()
{
double bx, by, bx2, by2, ex, ex2, ey, ey2, ar;
bx = bx2 = by = by2 = ex = ex2 = ey = ey2 = ar = 0;
int i;
DispItem * pDispBuff = (DispItem *)m_dispDat.data();
int size = m_dispDat.size();
int stitchCount = size/sizeof(DispItem);
if (stitchCount <= 0)
{
stitchCount = 0;
}
if (m_stitchIndex >= stitchCount)
{
m_stitchIndex = stitchCount - 1;
}
if (m_stitchIndex < 0)
{
m_stitchIndex = 0;
}
DISP_MODE dispmode = m_dispMode;
QPainter painter(&m_canvas);
QPen pen;
//笔宽
pen.setWidth(1);
if (dispmode == DISP_ALL_NORMAL || dispmode == DISP_ALL_EXEC)
{
int tenThousand = 0;
for (i = 0; i < stitchCount; i++)
{
tenThousand++;
if(tenThousand == TENTHOUSANDNEEDLE)
{
tenThousand = 0;
int idx = i / TENTHOUSANDNEEDLE;
//每十万针主界面加载图片的进度条走一格
emit siDrawNeedleIdx(idx);
}
bx = pDispBuff[i].bx;
by = pDispBuff[i].by;
ex = pDispBuff[i].ex;
ey = pDispBuff[i].ey;
bx2 = pDispBuff[i].bx2;
by2 = pDispBuff[i].by2;
ex2 = pDispBuff[i].ex2;
ey2 = pDispBuff[i].ey2;
// 从开始到 m_stitchIndex 显示正常颜色的线迹(执行过),从 m_stitchIndex 结束显示未缝纫颜色线迹(未执行)
if ((dispmode == DISP_ALL_EXEC) && (i >= m_stitchIndex))
{
if(0 == pDispBuff[i].rgb || pDispBuff[i].ctrl == DATA_OFFSET || pDispBuff[i].ctrl == DATA_OFFSET_SEC || pDispBuff[i].ctrl == DATA_SYNCOFST || pDispBuff[i].ctrl == DATA_MIRROR_OFT_SEC)
{
pen.setColor(Qt::transparent);
}
else
{
pen.setColor(pDispBuff[i].rgb);
}
}
else
{//排针预览颜色
pen.setColor(Qt::cyan);
}
painter.setPen(pen);
painter.drawLine(bx, by, ex, ey);
//第二机头用绿色,非偏移数据
if(pen.color() != Qt::transparent)
{
pen.setColor(Qt::green);
}
painter.setPen(pen);
painter.drawLine(bx2, by2, ex2, ey2);
}
if (dispmode == DISP_ALL_EXEC && m_stitchIndex < stitchCount)
{
i = m_stitchIndex;
bx = pDispBuff[i].bx;
by = pDispBuff[i].by;
bx2 = pDispBuff[i].bx2;
by2 = pDispBuff[i].by2;
drawForkDoubleHead(bx, by, bx2, by2, painter);//绘制准星
m_dispIndex = m_stitchIndex; // 移动显示指针
}
}
else if (dispmode == DISP_EXECING) // 刷新部分线迹(缝纫中进度显示)
{
if (m_stitchIndex != m_dispIndex)
{
eraseNeedleIdxPenDoubleHead(painter);//擦除跟踪笔
//增加针数
if (m_stitchIndex > m_dispIndex && m_stitchIndex < stitchCount)
{
i = m_dispIndex;
while(i < m_stitchIndex)
{
bx = pDispBuff[i].bx;
by = pDispBuff[i].by;
ex = pDispBuff[i].ex;
ey = pDispBuff[i].ey;
bx2 = pDispBuff[i].bx2;
by2 = pDispBuff[i].by2;
ex2 = pDispBuff[i].ex2;
ey2 = pDispBuff[i].ey2;
if(0 == pDispBuff[i].rgb || pDispBuff[i].ctrl == DATA_OFFSET || pDispBuff[i].ctrl == DATA_OFFSET_SEC || pDispBuff[i].ctrl == DATA_SYNCOFST|| pDispBuff[i].ctrl == DATA_MIRROR_OFT_SEC)
{
pen.setColor(Qt::transparent);
}
else
{
pen.setColor(Qt::red);
}
painter.setPen(pen);
painter.drawLine(bx, by, ex, ey);
painter.drawLine(bx2, by2, ex2, ey2);
i++;
}
}
//减少针数
else if (m_stitchIndex < m_dispIndex && m_dispIndex < stitchCount)
{
i = m_stitchIndex;
while(i <= m_dispIndex) // 显示为未缝纫颜色线迹
{
bx = pDispBuff[i].bx;
by = pDispBuff[i].by;
ex = pDispBuff[i].ex;
ey = pDispBuff[i].ey;
bx2 = pDispBuff[i].bx2;
by2 = pDispBuff[i].by2;
ex2 = pDispBuff[i].ex2;
ey2 = pDispBuff[i].ey2;
if(0 == pDispBuff[i].rgb || pDispBuff[i].ctrl == DATA_OFFSET || pDispBuff[i].ctrl == DATA_OFFSET_SEC || pDispBuff[i].ctrl == DATA_SYNCOFST || pDispBuff[i].ctrl == DATA_MIRROR_OFT_SEC)
{
pen.setColor(Qt::transparent);
}
else
{
pen.setColor(pDispBuff[i].rgb);
}
painter.setPen(pen);
painter.drawLine(bx, by, ex, ey);
//第二机头用绿色,非偏移数据
if(pen.color() != Qt::transparent)
{
pen.setColor(Qt::green);
}
painter.setPen(pen);
painter.drawLine(bx2, by2, ex2, ey2);
i++;
}
}
i = m_stitchIndex;
bx = pDispBuff[i].bx;
by = pDispBuff[i].by;
bx2 = pDispBuff[i].bx2;
by2 = pDispBuff[i].by2;
drawForkDoubleHead(bx, by, bx2, by2, painter);//绘制跟踪笔
m_dispIndex = m_stitchIndex; // 移动显示指针
}
}
return 0;
}
/**
* @brief EmbData::findMaxSpHead
* @param head 机头间距表
* @param StepNum 跨步数
* @return 返回机头间距表中用到的最大偏移值
*/
int EmbData::findMaxSpHead(DsrHeadEx62 &head,int StepNum)
{
int max = 0;
for(int i = 0 ; i < StepNum;i++){
bitset<8> iswork(head.headEnableSpacing[i].iswork);
for(int j = 1; j < headNum; j++)
{
if(!iswork.test(j)) // test(i)为0返回false
continue;
unsigned short int* row = (unsigned short int*)&head.headEnableSpacing[i];
unsigned short int space = *(row + j); //向后偏移得到具体大小
max = max > space ? max : space;
}
}
return max;
}
///
/// \brief 根据机头间距表的iswork字段 选择性的绘制跟踪画笔
///
void EmbData::drawMultiTrack(QPainter &painter)
{
int bx = m_headDispDate[m_stitchIndex].bx;
int by = m_headDispDate[m_stitchIndex].by;
bitset<8> iswork(m_headDispDate[m_stitchIndex].headtable.iswork);
for(int j = 0; j < headNum; j++){
if(j==0)//第一个机头不需要偏移
drawFork(bx, by, painter, j);
else if(iswork.test(j))///不是第一针,需要计算偏移量
{
unsigned short int* row = (unsigned short int*)&m_headDispDate[m_stitchIndex].headtable; // 取到结构体的初始地址
unsigned short int space = *(row + j); //向后偏移得到具体大小
space = (space*10)/m_factor; //从实际距离转换为像素,得到最终的偏移像素
drawFork(bx + space, by, painter, j);
}
else
{
///如果下一针不缝了 不需要画跟踪标志,也不需要还原上一针的图像
///所以此处将上一针的图像缓存重置,以免把画好的线迹擦除
m_penHeadPix[j] = QPixmap();
}
}
}
///
/// \brief 五头机函数,根据机头间距表信息多机头同时画线
/// \param painter
/// \param pen
/// \param rgb
/// \param index
///
void EmbData::drawMultiLine(QPainter &painter, QPen &pen, QRgb rgb, int index)
{
int bx = m_headDispDate[index].bx;//begin
int by = m_headDispDate[index].by;
int ex = m_headDispDate[index].ex;//end
int ey = m_headDispDate[index].ey;
pen.setColor(rgb);
painter.setPen(pen);
bitset<8> iswork(m_headDispDate[index].headtable.iswork);
for(int j = 0; j < headNum; j++){
if(!iswork.test(j)) // test(i)为0表示机头不工作跳过循环
{
if(j == 0){//如果是一机头不工作,那么使用黄色线段画出
painter.save();
painter.setPen(getNoJumpColour());
painter.drawLine(bx, by, ex, ey); //机头1 缝纫数据 和原数据一致
painter.restore();
}
continue;
}
//缝纫数据
if(m_headDispDate[index].ctrl ==DATA_SEWING)
{
if(j == 0){//机头1
painter.drawLine(bx, by, ex, ey); //机头1 缝纫数据 和原数据一致
}
else
{
unsigned short int* row = (unsigned short int*)&m_headDispDate[index].headtable; // 取到结构体的初始地址
unsigned short int space = *(row + j); //向后偏移得到具体大小
space = (space*10)/m_factor; //从实际距离转换为像素
painter.drawLine(bx+space, by, ex+space, ey); //不是机头1的画线时需要偏移
}
}
else{
painter.drawLine(bx, by, ex, ey);
}
}
}
void EmbData::getOneDispDat(QByteArray &ds16dat)
{
DispItem dispItem;
// ds16数据
int size = ds16dat.size();
if (size <= (int)sizeof(DataDs16FileHead))
{
qDebug("16 data less then head size");
return;
}
DataDs16FileHead * pDsHead = (DataDs16FileHead *)(ds16dat.data());
int datasize = size - sizeof(DataDs16FileHead);
if (datasize <= 0)
{
qDebug("dat dataBegin err");
return;
}
int stepsize = datasize/sizeof(Ds16Item);
if (stepsize <= 0)
{
qDebug("ds16 data size err");
return;
}
Ds16Item * ds16DataPtr;
Ds16Item * pData = (Ds16Item *)(ds16dat.data() + sizeof(DataDs16FileHead));
ds16DataPtr = pData;
double datposx, datposy, datposr;
int curx, cury, curr, prex, prey;
curx = cury = curr = prex = prey = 0;
// 显示花样图形
u8 ctrlByte;
u8 attrByte;
int dx;
int dy;
int dr;
m_oneDispDat.clear();
m_dispMinX = S32_MAX;
m_dispMaxX = S32_MIN;
m_dispMinY = S32_MAX;
m_dispMaxY = S32_MIN;
datposx = pDsHead->beginX;
datposy = pDsHead->beginY;
datposr = pDsHead->beginR;
curx = datposx;
cury = datposy;
//先得到一个完整的绘制数据
for (int i = 0; i < stepsize; i++)
{
prex = curx;
prey = cury;
// 读入一个针步数据
ctrlByte = ds16DataPtr->ctrl;
attrByte = ds16DataPtr->attr;
dx = ds16DataPtr->dx;
dy = ds16DataPtr->dy;
dr = ds16DataPtr->dr;
datposx += dx;
datposy += dy;
datposr += dr;
curx = datposx;
cury = datposy;
while(datposr >= PI10000)
{
datposr -= (PI20000-1);
}
while(datposr <= -PI10000)
{
datposr += (PI20000-1);
}
dispItem.ctrl = ctrlByte;
dispItem.attr = attrByte;
dispItem.bx = prex;
dispItem.by = prey;
dispItem.ex = curx;
dispItem.ey = cury;
dispItem.ar = curr;
if (m_dispMinX > dispItem.bx) { m_dispMinX = dispItem.bx; }
if (m_dispMinX > dispItem.ex) { m_dispMinX = dispItem.ex; }
if (m_dispMaxX < dispItem.bx) { m_dispMaxX = dispItem.bx; }
if (m_dispMaxX < dispItem.ex) { m_dispMaxX = dispItem.ex; }
if (m_dispMinY > dispItem.by) { m_dispMinY = dispItem.by; }
if (m_dispMinY > dispItem.ey) { m_dispMinY = dispItem.ey; }
if (m_dispMaxY < dispItem.by) { m_dispMaxY = dispItem.by; }
if (m_dispMaxY < dispItem.ey) { m_dispMaxY = dispItem.ey; }
if(ctrlByte == DATA_OFFSET) //跨步(偏移)针步另一钟颜色显示
dispItem.rgb = getJumpedColour();
else
dispItem.rgb = getSewedColour();
memcpy(&dispItem.action,ds16DataPtr->action,sizeof(dispItem.action));
m_oneDispDat.append((char*)(&dispItem), sizeof(DispItem));
ds16DataPtr++;
}
return;
}