15,440
社区成员
发帖
与我相关
我的任务
分享
void CPath::__CreatePath_LineX()
{
BOOL bIsPoint2X = FALSE;
for (VEC_CUT_DATA_IT it = m_vecCutDataSequence.begin(); it != m_vecCutDataSequence.end(); ++it)
{
tagCutData & stuCutData = *it;
switch (stuCutData.nCutDataType)
{
case CutDataType::PerimeterX1:
case CutDataType::PerimeterX2:
case CutDataType::LineX:
if (vecCutPath.empty())
{
for (int i = 0; i < stuCutData.nCutTimes; ++i)
{
if (i % 2 == 0)
{
vecCutPath.push_back(stuCutData);
}
else
{
tagCutData stuReverse;
__ReverseCutData(stuCutData, stuReverse);
vecCutPath.push_back(stuReverse);
}
bIsPoint2X = !bIsPoint2X;
}
}
else
{
tagCutData & stuLastCutPath = vecCutPath[vecCutPath.size() - 1];
if (bIsPoint2X)
{
//connect line
tagCutData stuConnect;
memset(&stuConnect, NULL, sizeof(stuConnect));
stuConnect.point1.x = stuLastCutPath.point2.x;
stuConnect.point1.y = stuLastCutPath.point2.y;
stuConnect.point2.x = stuCutData.point2.x;
stuConnect.point2.y = stuCutData.point2.y;
stuConnect.nCutDataType = CutDataType::None;
stuConnect.nCutTimes = 0;
vecCutPath.push_back(stuConnect);
//cut line
for (int i = 0; i < stuCutData.nCutTimes; ++i)
{
if (i % 2 == 0)
{
tagCutData stuReverse;
__ReverseCutData(stuCutData, stuReverse);
vecCutPath.push_back(stuReverse);
}
else
{
vecCutPath.push_back(stuCutData);
}
bIsPoint2X = !bIsPoint2X;
}
}
else
{
//connect line
tagCutData stuConnect;
memset(&stuConnect, NULL, sizeof(stuConnect));
stuConnect.point1.x = stuLastCutPath.point2.x;
stuConnect.point1.y = stuLastCutPath.point2.y;
stuConnect.point2.x = stuCutData.point1.x;
stuConnect.point2.y = stuCutData.point1.y;
stuConnect.nCutDataType = CutDataType::None;
stuConnect.nCutTimes = 0;
vecCutPath.push_back(stuConnect);
//cut line
for (int i = 0; i < stuCutData.nCutTimes; ++i)
{
if (i % 2 == 0)
{
vecCutPath.push_back(stuCutData);
}
else
{
tagCutData stuReverse;
__ReverseCutData(stuCutData, stuReverse);
vecCutPath.push_back(stuReverse);
}
bIsPoint2X = !bIsPoint2X;
}
}
}
break;
default:
break;
}
}
}
void CPath::__CreatePath_LineY()
{
BOOL bIsPoint2Y = !vecCutPath.empty();
for (VEC_CUT_DATA_IT it = m_vecCutDataSequence.begin(); it != m_vecCutDataSequence.end(); ++it)
{
tagCutData & stuCutData = *it;
switch (stuCutData.nCutDataType)
{
case CutDataType::PerimeterY1:
case CutDataType::PerimeterY2:
case CutDataType::LineY:
if (vecCutPath.empty())
{
for (int i = 0; i < stuCutData.nCutTimes; ++i)
{
if (i % 2 == 0)
{
vecCutPath.push_back(stuCutData);
}
else
{
tagCutData stuReverse;
__ReverseCutData(stuCutData, stuReverse);
vecCutPath.push_back(stuReverse);
}
bIsPoint2Y = !bIsPoint2Y;
}
}
else
{
tagCutData & stuLastCutPath = vecCutPath[vecCutPath.size() - 1];
// BOOL bIsSmaePoint = (stuLastCutPath.point2.x == stuCutData.point2.x && stuLastCutPath.point2.y == stuCutData.point2.y);
if (bIsPoint2Y)
{
//connect line
// if (!bIsSmaePoint)
{
tagCutData stuConnect;
memset(&stuConnect, NULL, sizeof(stuConnect));
stuConnect.point1.x = stuLastCutPath.point2.x;
stuConnect.point1.y = stuLastCutPath.point2.y;
stuConnect.point2.x = stuCutData.point2.x;
stuConnect.point2.y = stuCutData.point2.y;
stuConnect.nCutDataType = CutDataType::None;
stuConnect.nCutTimes = 0;
vecCutPath.push_back(stuConnect);
}
//cut line
for (int i = 0; i < stuCutData.nCutTimes; ++i)
{
if (i % 2 == 0)
{
tagCutData stuReverse;
__ReverseCutData(stuCutData, stuReverse);
vecCutPath.push_back(stuReverse);
}
else
{
vecCutPath.push_back(stuCutData);
}
bIsPoint2Y = !bIsPoint2Y;
}
}
else
{
//connect line
// if (!bIsSmaePoint)
{
tagCutData stuConnect;
memset(&stuConnect, NULL, sizeof(stuConnect));
stuConnect.point1.x = stuLastCutPath.point2.x;
stuConnect.point1.y = stuLastCutPath.point2.y;
stuConnect.point2.x = stuCutData.point1.x;
stuConnect.point2.y = stuCutData.point1.y;
stuConnect.nCutDataType = CutDataType::None;
stuConnect.nCutTimes = 0;
vecCutPath.push_back(stuConnect);
}
//cut line
for (int i = 0; i < stuCutData.nCutTimes; ++i)
{
if (i % 2 == 0)
{
vecCutPath.push_back(stuCutData);
}
else
{
tagCutData stuReverse;
__ReverseCutData(stuCutData, stuReverse);
vecCutPath.push_back(stuReverse);
}
bIsPoint2Y = !bIsPoint2Y;
}
}
}
break;
default:
break;
}
}
}
void CPath::__CreatePath_Circle()
{
for (VEC_CUT_DATA_IT it = m_vecCutDataSequence.begin(); it != m_vecCutDataSequence.end(); ++it)
{
tagCutData & stuCutData = *it;
switch (stuCutData.nCutDataType)
{
case CutDataType::Circle:
//connect line
if (!vecCutPath.empty())
{
tagCutData & stuLastCutPath = vecCutPath[vecCutPath.size() - 1];
tagCutData stuConnect;
memset(&stuConnect, NULL, sizeof(stuConnect));
tagCircle circle;
circle.ptCenter.x = g_pCell->stuSize.x / 2;
circle.ptCenter.y = g_pCell->stuSize.y / 2;
circle.radius = padbRadius;
DPOINT point1, point2;
point1.x = stuLastCutPath.point2.x;
point1.y = stuLastCutPath.point2.y;
SAMA::GetPointOnCircle(circle.ptCenter, circle.radius, point1, point2);
stuConnect.point1.x = stuLastCutPath.point2.x;
stuConnect.point1.y = stuLastCutPath.point2.y;
stuConnect.point2.x = point2.x;
stuConnect.point2.y = point2.y;
stuConnect.nCutDataType = CutDataType::None;
stuConnect.nCutTimes = 0;
vecCutPath.push_back(stuConnect);
//circle
stuCutData.point1.x = stuCutData.point2.x = stuConnect.point2.x;
stuCutData.point1.y = stuCutData.point2.y = stuConnect.point2.y;
for (int i = 0; i < stuCutData.nCutTimes; ++i)
vecCutPath.push_back(stuCutData);
}
else
{
tagCircle circle;
circle.ptCenter.x = g_pCell->stuSize.x / 2;
circle.ptCenter.y = g_pCell->stuSize.y / 2;
circle.radius = padbRadius;
DPOINT point, start_point;
point.x = 0;
point.y = g_pCell->stuSize.y;
SAMA::GetPointOnCircle(circle.ptCenter, circle.radius, point, start_point);
//circle
stuCutData.point1.x = stuCutData.point2.x = start_point.x;
stuCutData.point1.y = stuCutData.point2.y = start_point.y;
for (int i = 0; i < stuCutData.nCutTimes; ++i)
vecCutPath.push_back(stuCutData);
}
break;
default:
break;
}
}
}
void CPath::ReadSettings()
{
TSTRING sTagName = _T("");
//CutOffset
sTagName = _T("DSM/Path/CutOffset");
g_pIXMLParserSettings->GetDouble(sTagName, stdbCutOffset);
}
void CPath::UpdateSettings()
{
TSTRING sTagName = _T("");
//CutOffset
sTagName = _T("DSM/Path/CutOffset");
g_pIXMLParserSettings->PutDouble(sTagName, stdbCutOffset);
}
UINT WINAPI CPath::CutPathInThread(LPVOID lParam)
{
tagCutData * pstuCutData = (tagCutData *)lParam;
COMMON_ERR nError = g_pPath->__CutPath(*pstuCutData);
if COMMON_FAILED(nError)
g_nCurrentErrorCode = nError;
_endthreadex(0);
return 0;
}
COMMON_ERR CPath::__CutPath(const tagCutData & stuCutPath)
{
COMMON_ERR nError = COMMON_OK;
try
{
tagPosition stuPosition1;
stuPosition1.x = g_pLaser->stuOrg.x + stuCutPath.point1.x;
stuPosition1.y = g_pLaser->stuOrg.y + stuCutPath.point1.y - g_pCell->stuSize.y;
tagPosition stuPosition2;
stuPosition2.x = g_pLaser->stuOrg.x + stuCutPath.point2.x;
stuPosition2.y = g_pLaser->stuOrg.y + stuCutPath.point2.y - g_pCell->stuSize.y;
COMMON_IF_FAILED_THEN_THROW(g_pTable->MoveToPosition(stuPosition1));
if (CutDataType::None != stuCutPath.nCutDataType && !g_pDeviceDebug->bIsDisableLaser)
{
g_pLaser->OpenLaser();
Sleep(panCutWait);
}
else
{
g_pLaser->CloseLaser();
}
COMMON_IF_FAILED_THEN_THROW(g_pTable->MoveToPosition(stuPosition2));
}
catch (COMMON_ERR & err)
{
nError = err;
}
g_pLaser->CloseLaser();
return nError;
}
说明:
void CPath::CreateCutData()
创建划片数据,包括周边,直线和圆
void CPath::CreateCutPath()
创建划片路径,顺序是周边X1-线X-周边X2-周边Y2-线Y-周边Y1-圆,路径和路径之间由虚路径链接
10.3.6.1【已知问题】圆形划片补偿
当划片数据是圆形的时候,从起点划片到终点后,还应该再多划片一段补偿距离,保证划片成功
10.3.6.2【已知问题】圆形划片虚路径
当划片数据是圆形的时候,因为圆形直径大于电池长宽,当激光划片路径不在电池上时,应该关闭激光