10661 lines
333 KiB
C++
10661 lines
333 KiB
C++
|
|
#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;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|