#include "StdAfx.h" #include "PathScheduler_Dual_Sorting.h" #include "PathScheduler_Sorting.h" #include CPathScheduler_Dual_Sorting::CPathScheduler_Dual_Sorting(void) { } CPathScheduler_Dual_Sorting::~CPathScheduler_Dual_Sorting(void) { } int CPathScheduler_Dual_Sorting::CalculatePath( const SPathData& startPath, const VectorPathData& vecTotalPathData, const CRect& rtRange, CPathSchedulerResult& scheduleResult ) { scheduleResult.Reset(); // get path data VectorPathData vecPathData; for (constVectorPathDataIt it=vecTotalPathData.begin(); it!=vecTotalPathData.end(); it++) { if ( rtRange.PtInRect( CPoint(it->nPosX,it->nPosY )) ) { vecPathData.push_back(*it); } } // check path count int nPathCount = (int) vecPathData.size(); if (nPathCount<1) return 0; // ¿øÁ¡ ¹æÇâ¿¡ µû¶ó ¼ÒÆÃ ¼ø¼­°¡ ´Þ¶óÁø´Ù. int nOrder = m_PathSchedulerParam.GetSortOrderType(); switch(m_PathSchedulerParam.GetOriginDir()) { case SchedulerDir_LeftTop: // left top case SchedulerDir_LeftBottom: // left bottom nOrder = 0; break; case SchedulerDir_RightTop: // right top case SchedulerDir_RightBottom: // right bottom nOrder = 1; break; } switch(m_PathSchedulerParam.GetSortAxisType()) { case 0: // x Axis if (nOrder==0) // ascend { std::sort(vecPathData.begin(), vecPathData.end(), AscendAxisX); } else // descend { std::sort(vecPathData.begin(), vecPathData.end(), DescendAxisX); } break; case 1: // y Axis if (nOrder==0) // ascend { std::sort(vecPathData.begin(), vecPathData.end(), AscendAxisY); } else // descend { std::sort(vecPathData.begin(), vecPathData.end(), DescendAxisY); } break; default: return 0; break; } // resize result count scheduleResult.SetScheduleResultCount(nPathCount); // ½ºÄÉÁì ½ÃÀÛÀ§Ä¡.. BOOL bStartPos = FALSE; SSchedulerResult sStartPos; if (startPath.nPosX!=NO_PATH_DATA && startPath.nPosY!=NO_PATH_DATA) { sStartPos.nTotalIndex = -1; sStartPos.nPointIndex = -1; sStartPos.dPositionX = startPath.nPosX / 1000.0; sStartPos.dPositionY = startPath.nPosY / 1000.0; sStartPos.dAutoFocusTime = m_PathSchedulerParam.GetAutoFocusTime(); sStartPos.dImageGrabTime = m_PathSchedulerParam.GetImageGrabTime(); sStartPos.dMotionDelayTime = m_PathSchedulerParam.GetMotionDelayTime(); bStartPos = TRUE; } for (int i=0; inPointIndex = i; const SPathData *pPathData = &vecPathData[pCurResult->nPointIndex]; if (pPathData==NULL) continue; pCurResult->nTotalIndex = pPathData->nIndex; pCurResult->dPositionX = double(pPathData->nPosX) / 1000.0; pCurResult->dPositionY = double(pPathData->nPosY) / 1000.0; pCurResult->dAutoFocusTime = m_PathSchedulerParam.GetAutoFocusTime(); pCurResult->dImageGrabTime = m_PathSchedulerParam.GetImageGrabTime(); pCurResult->dMotionDelayTime = m_PathSchedulerParam.GetMotionDelayTime(); memcpy(pCurResult->pDataType, pPathData->pDataType, sizeof(int)*PATH_DATA_TYPE_COUNT); if (i==0) // first point { // exist start pos if (bStartPos) { if (!CalculateDistanceSpeedTime(*pCurResult, sStartPos)) { continue; } } else if(!CalculateDistanceSpeedTime(*pCurResult, *pCurResult)) { continue; } } else // from second point { SSchedulerResult *pPrevResult = scheduleResult.GetPathSchedulerResult(i-1); if (!CalculateDistanceSpeedTime(*pCurResult, *pPrevResult)) { continue; } } } return scheduleResult.GetPathSchedulerResultCount(); } int CPathScheduler_Dual_Sorting::PathScheduling(const VectorPathData& vecPathData, const VectorPathData& vecStartPath) { if (vecStartPath.size()<1) return 0; m_vecPathSchedulerResult.clear(); m_vecRangeRect.clear(); // init CRect rtLeftRange(0, 0, m_PathSchedulerParam.GetGlassSizeX(), m_PathSchedulerParam.GetGlassSizeY()); CRect rtRightRange(0, 0, m_PathSchedulerParam.GetGlassSizeX(), m_PathSchedulerParam.GetGlassSizeY()); int nLeftCollisionPosX = -1; int nRightCollisionPosX = -1; // set range switch(m_PathSchedulerParam.GetOriginDir()) { case SchedulerDir_LeftTop: // left top case SchedulerDir_LeftBottom: // left bottom rtLeftRange.left = 0; rtLeftRange.right = (m_PathSchedulerParam.GetGlassSizeX() / 2); rtRightRange.left = rtLeftRange.right; rtRightRange.right = m_PathSchedulerParam.GetGlassSizeX(); nLeftCollisionPosX = (m_PathSchedulerParam.GetGlassSizeX() / 2) - m_PathSchedulerParam.GetCollisionDistX(); nRightCollisionPosX = (m_PathSchedulerParam.GetGlassSizeX() / 2) + m_PathSchedulerParam.GetCollisionDistX(); break; case SchedulerDir_RightTop: // right top case SchedulerDir_RightBottom: // right bottom rtLeftRange.left = m_PathSchedulerParam.GetGlassSizeX(); rtLeftRange.right = (m_PathSchedulerParam.GetGlassSizeX() / 2); rtRightRange.left = rtLeftRange.right; rtRightRange.right = 0; nLeftCollisionPosX = (m_PathSchedulerParam.GetGlassSizeX() / 2) + m_PathSchedulerParam.GetCollisionDistX(); nRightCollisionPosX = (m_PathSchedulerParam.GetGlassSizeX() / 2) - m_PathSchedulerParam.GetCollisionDistX(); break; } // normalize rtLeftRange.NormalizeRect(); rtRightRange.NormalizeRect(); // add range rect m_vecRangeRect.push_back(rtLeftRange); m_vecRangeRect.push_back(rtRightRange); // center coord? if (m_PathSchedulerParam.GetCenterCoord()) { rtLeftRange.MoveToXY(-m_PathSchedulerParam.GetGlassSizeX()/2, -m_PathSchedulerParam.GetGlassSizeY()/2); rtRightRange.MoveToXY(-m_PathSchedulerParam.GetGlassSizeX()/2, -m_PathSchedulerParam.GetGlassSizeY()/2); } // left gantry result CPathSchedulerResult scheduleResultLeft(vecStartPath[0].nIndex); CalculatePath(vecStartPath[0], vecPathData, rtLeftRange, scheduleResultLeft); scheduleResultLeft.SetCollisionPositionX(nLeftCollisionPosX); // right gantry result CPathSchedulerResult scheduleResultRight(vecStartPath[1].nIndex); CalculatePath(vecStartPath[1], vecPathData, rtRightRange, scheduleResultRight); scheduleResultRight.SetCollisionPositionX(nRightCollisionPosX); // add schedule result m_vecPathSchedulerResult.push_back(scheduleResultLeft); m_vecPathSchedulerResult.push_back(scheduleResultRight); return (int) m_vecPathSchedulerResult.size(); }