#include "embdata.h" #include "main.h" #include "sharedviews/setcontrolstyle.h" #include #include 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"<(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(sizeof(DataDs16FileHead))) { qDebug("dat dataBegin err: not enough data for header!"); return QByteArray(); } DataDs16FileHead *dataDs16FileHead = reinterpret_cast(m_embDs16Data.data()); int size = m_embDs16Data.size(); int datasize = size - static_cast(sizeof(DataDs16FileHead)); if (datasize <= 0) { qDebug("dat dataBegin err: datasize is non-positive!"); return QByteArray(); } int stepsize = datasize / static_cast(sizeof(Ds16Item)); if (stepsize <= 0) { qDebug("ds16 data size err: stepsize is non-positive!"); return QByteArray(); } Ds16Item *ds16DataPtr = reinterpret_cast(m_embDs16Data.data() + sizeof(DataDs16FileHead)); Ds16Item *ds16DataPtr_tmp = reinterpret_cast(m_embDs16Data.data() + sizeof(DataDs16FileHead)); QList 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(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(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 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 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 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()<= (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()<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 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 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 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 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"<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="< 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:"<ctrl <<" attr:"<attr <<" x:"<ax <<" y:"<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:"<ctrl <<" attr:"<attr <<" x:"<ax <<" y:"<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:"<ctrl <<" attr:"<attr <<" x:"<ax <<" y:"<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:"<ctrl <<" attr:"<attr <<" x:"<ax <<" y:"<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:"<ctrl <<" attr:"<attr <<" x:"<ax <<" y:"<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:"<ctrl <<" attr:"<attr <<" x:"<ax <<" y:"<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:"<ctrl <<" r:"<ar <<" x:"<ax <<" y:"<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:"<ctrl <<" r:"<ar <<" x:"<ax <<" y:"<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:"<ctrl <<" r:"<ar <<" x:"<ax <<" y:"<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:"<ctrl <<" r:"<ar <<" x:"<ax <<" y:"<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:"<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:"<ax - minX) <<" Win:"<<(cutXWindow*3/10) <<" maxWinX:"<= 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:"<ctrl <<" action:"<action <<" x:"<ax <<" y:"<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:"<ctrl <<" x:"<ax <<" y:"<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:"<ax <<" y:"<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 :" <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 > penVisited(winNum, QVector(0)); // 画笔数据 QVector > cutShakeVisited(winNum, QVector(0)); // 震刀数据 QVector > cutRountVisited(winNum, QVector(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:"<ax <<" y:"<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 0) { newstepnum += stepnumPen; for (j = 0;j 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" <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" <ctrl,16) << "winNum" <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"<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["<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:" <ax << "ay" << absDataPtr->ay << "ctrl" <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:"< > &visited, DsAbsItem &absItem,int winNum,u8 ctrl) { if(winNum <= 1) { return; } if(absItem.ctrl == 0){}//为了去掉警告 int stepnum = 0; QVector > cpvisited; cpvisited = visited; int flag = 0; double ax,ay; ax = ay = 0; for (int i=0;ictrl == DATA_ANGLE_OLD) { duan++; } } // qDebug()<< "optimizationOrder :duan :" < > duanData(duan, QVector(0)); // 临时数据 (正向) // qDebug()<< "optimizationOrder :stepnum :" <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 > cpduanData; cpduanData = duanData; for (k=0;kctrl != 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 dirList;//方向,0为正向 dirList.clear(); u32 len = U32_MAX; int dir = 0; //扫描哪个段的起点离上个段的终点最近 for(int p=0;pax-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;pctrl = 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;jax; 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 " < 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= 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"<ctrl == DATA_NULL) || (embDataPtr->ctrl == DATA_END)) { break; } else { curDataPtr = embDataPtr; for (i=j; ictrl == 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:"<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"<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"< 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"< 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:"<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 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 &inList, double indRunLen, QList &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 *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"<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_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; }