SDC C-Project CF Review 프로그램
LYW
2021-08-09 5c62f2269ac6179a22b475093f35be2fb0999bb2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include "StdAfx.h"
#include "PathScheduler_Dual.h"
 
CPathScheduler_Dual::CPathScheduler_Dual(void)
{
}
 
 
CPathScheduler_Dual::~CPathScheduler_Dual(void)
{
}
 
int    CPathScheduler_Dual::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 rtCenterRange(0, 0, m_PathSchedulerParam.GetGlassSizeX(), m_PathSchedulerParam.GetGlassSizeY());
    CRect rtRightRange(0, 0, m_PathSchedulerParam.GetGlassSizeX(), m_PathSchedulerParam.GetGlassSizeY());
 
    // 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) - (m_PathSchedulerParam.GetCollisionDistX()/2);
        rtCenterRange.left    = rtLeftRange.right;
        rtCenterRange.right    = (m_PathSchedulerParam.GetGlassSizeX() / 2) + (m_PathSchedulerParam.GetCollisionDistX()/2);
        rtRightRange.left    = rtCenterRange.right;
        rtRightRange.right    = m_PathSchedulerParam.GetGlassSizeX();
        break;
 
    case SchedulerDir_RightTop: // right top
    case SchedulerDir_RightBottom: // right bottom
        rtLeftRange.left    = m_PathSchedulerParam.GetGlassSizeX();
        rtLeftRange.right    = (m_PathSchedulerParam.GetGlassSizeX() / 2) + (m_PathSchedulerParam.GetCollisionDistX()/2);
        rtCenterRange.left    = rtLeftRange.right;
        rtCenterRange.right    = (m_PathSchedulerParam.GetGlassSizeX() / 2) - (m_PathSchedulerParam.GetCollisionDistX()/2);
        rtRightRange.left    = rtCenterRange.right;
        rtRightRange.right    = 0;
        break;
    }
 
    // normalize
    rtLeftRange.NormalizeRect();
    rtCenterRange.NormalizeRect();
    rtRightRange.NormalizeRect();
 
    // add range rect
    m_vecRangeRect.push_back(rtLeftRange);
    m_vecRangeRect.push_back(rtCenterRange);
    m_vecRangeRect.push_back(rtRightRange);
 
    // center
    if (m_PathSchedulerParam.GetCenterCoord())
    {
        rtLeftRange.MoveToXY(-m_PathSchedulerParam.GetGlassSizeX()/2, -m_PathSchedulerParam.GetGlassSizeY()/2);
        rtCenterRange.MoveToXY(-m_PathSchedulerParam.GetGlassSizeX()/2, -m_PathSchedulerParam.GetGlassSizeY()/2);
        rtRightRange.MoveToXY(-m_PathSchedulerParam.GetGlassSizeX()/2, -m_PathSchedulerParam.GetGlassSizeY()/2);
    }
 
    // left gantry
    CPathSchedulerResult scheduleResultLeft(vecStartPath[0].nIndex);
    CalculatePath(vecStartPath[0], vecPathData, rtLeftRange, scheduleResultLeft);
 
    // right gantry
    CPathSchedulerResult scheduleResultRight(vecStartPath[1].nIndex);
    CalculatePath(vecStartPath[1], vecPathData, rtRightRange, scheduleResultRight);
 
    // ÃÑ À̵¿½Ã°£ ºñ±³ 
    CPathSchedulerResult* pCenterScheduleResult = NULL;
    if (scheduleResultLeft.GetTotalSchedulerTime() > scheduleResultRight.GetTotalSchedulerTime()) // left°¡ ¿À·¡°É¸®¸é
    {
        pCenterScheduleResult = &scheduleResultLeft;    
    }
    else // right°¡ ¿À·¡°É¸®¸é
    {
        pCenterScheduleResult = &scheduleResultRight;    
    }
 
    // center 
    const SSchedulerResult* pLastPoint = pCenterScheduleResult->GetPathSchedulerResult(pCenterScheduleResult->GetPathSchedulerResultCount()-1);
    if (pLastPoint)
    {
        SPathData ptStartPath((int)(pLastPoint->dPositionX*1000.0), (int)(pLastPoint->dPositionY*1000.0));
        CPathSchedulerResult scheduleResultCenter;
        CalculatePath(ptStartPath, vecPathData, rtCenterRange, scheduleResultCenter);
 
        if (scheduleResultLeft.GetTotalSchedulerTime() > scheduleResultRight.GetTotalSchedulerTime()) // left°¡ ¿À·¡°É¸®¸é
        {
            scheduleResultLeft.AddTailScheduleResult(scheduleResultCenter);
        }
        else // right°¡ ¿À·¡°É¸®¸é
        {
            scheduleResultRight.AddTailScheduleResult(scheduleResultCenter);    
        }
 
        //m_vecPathSchedulerResult.push_back(scheduleResultCenter);
    }
 
    m_vecPathSchedulerResult.push_back(scheduleResultLeft);
    m_vecPathSchedulerResult.push_back(scheduleResultRight);
 
    return (int) m_vecPathSchedulerResult.size();
}