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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
#pragma once
 
#include <map>
#include <list>
#include <vector>
#include <functional>
using namespace std;
 
#define WM_USER_SYSTEM_CLOSE                        (WM_USER + 1)
#define UM_LIST_SELECTDEFECT                        (WM_USER + 2)
#define WM_POCESS_STATUS                            (WM_USER + 3)
#define WM_LIVE_IMG_UPDATE                            (WM_USER + 4)
#define UM_UPDATE_RECIPE                            (WM_USER + 5)
#define    UM_SEND_MESSAGE_MAIN_DLG                    (WM_USER + 6)
#define WM_BATCH_PROCESS_NEXT                        (WM_USER + 7)
 
#define    MAX_CAMERA_COUNT            4
#define MAX_SCAN_COUNT                2
#define MAX_DIMENSION_COUNT            8
#define MAX_STAGE_HAND_COUNT        2
#define MAX_FRAM_COUNT                1024
 
#define SHARD_MEMORY_STRING_FRAMEBUFFER _T("SHARD_MEMORY_FRAMEBUFFER")
 
#define RECIPE_PATH                    _T("C:\\RCutProject\\Recipe")
#define RECIPE_ALIGN_PATH            _T("C:\\RCutProject\\Align")
#define    LINK_FILE_NAME                _T("C:\\RCutProject\\Recipe\\PPIDLink.lst")
#define GLASSTYPE_IMAGE_PATH        _T("C:\\RcutProject\\Recipe\\GlassType")
#define PATH_LOGIMAGE                _T("D:\\Image\\Log\\")
#define PATH_DEBUGFULLIMAGE            _T("D:\\Image\\Log\\DebugFullImage\\")
#define    PATH_INSPECTOR                _T("C:\\RCutProject")
#define PATH_INSPECTION_DATA        _T("D:\\InspectionData\\")
#define RECIPE_HOLE_TEMPLATE_PATH    _T("C:\\RCutProject\\HoleIns")
 
#define CHKMAX(a,b)    (((a) > (b)) ? (a) : (b))
#define CHKMIN(a,b)    (((a) < (b)) ? (a) : (b))
 
#define MAX_PANEL_SIDE                    4            // ¸é ¼ö 
#define    UPDN_TYPE                        2            // »óÇÏ °°ÀÌ Àִ°æ¿ì 2 Çϳª¸¸ Àִ°æ¿ì 1
 
#define MAX_VIEWINFO_GRD_CNT        7
#define MAX_PROFILE_SETTING_COUNT    79
#define PROFILE_INSPECT_SIZE_A_C    13
#define PROFILE_INSPECT_SIZE_B_D    10
#define PROFILE_RCUT_SIZE            5
#define PROFILE_INSPECT_INDEX_A        33
#define PROFILE_INSPECT_INDEX_B        0
#define PROFILE_INSPECT_INDEX_C        10
#define PROFILE_INSPECT_INDEX_D        23
#define PROFILE_INSPECT_INDEX_CF    46
#define PROFILE_RCUT_INSPECT_INDEX_A    59
#define PROFILE_RCUT_INSPECT_INDEX_B    64
#define PROFILE_RCUT_INSPECT_INDEX_C    69
#define PROFILE_RCUT_INSPECT_INDEX_D    74
 
#define SHORT_SIDE_INSPECTION_POINT_OFFSET        1420
#define LONG_SIDE_INSPECTION_POINT_OFFSET        4770
 
namespace GLOBAL_DEFINE
{
    enum    ENTRY_VIEW {EV_VIEW_INFO=0, EV_VIEW_DEFECT, EV_VIEW_IMAGE, EV_VIEW_RECIPE, EV_VIEW_LIVE, EV_VIEW_HW, EV_EXIT, EV_VIEW_End};
 
    enum    LIGHT_TYPE{LIGHT_TYPE_TRANS=0,LIGHT_TYPE_REF,LIGHT_TYPE_NONE};
    enum    LIGHT_MAKER{MAKER_LCP=0,MAKER_AKP,MAKER_NONE};
 
    enum    CAMERA_DIR{CAMDIR_TOP=0,CAMDIR_BOTTOM,CAMDIR_NONE};    
    enum    CAMERA_INSPECTION_DIR{INSPECTDIR_FORWARD=0,INSPECTDIR_BACKWARD,INSPECTDIR_NONE};
    enum    CAMERA_SCANDIR    {SCANGLASS_X=0,SCANGLASS_Y,SCANGLASS_NONE};    
    enum    BOARD_TYPE{GRAB_LINK_BOARD=0,RADIENT_BOARD,SAP_BOARD,BOARDTYPE_NONE};
 
    enum    EmSplashCmd {emShow=0, emHide, emText};
 
    enum    ScanDirectionIns    { SD_Forward = 0, SD_Backward, SD_Unknown };    // Glass ±âÁØ Scan ¹æÇâ.
    enum    DimensionDir        { DIMENSION_A=0, DIMENSION_B, DIMENSION_C, DIMENSION_D,DIMENSION_A_DN, DIMENSION_B_DN, DIMENSION_C_DN, DIMENSION_D_DN, DIMENSION_NONE};
    enum    EM_CHIPPING_COMP{CHIP_AND=0,CHIP_OR,CHIP_NONE};
    enum    EM_CORNER_JUDGE{A_ZONE_CRACK=0,B_ZONE_CRACK,B_ZONE_BURR,C_ZONE_CRACK,C_ZONE_BURR, D_ZONE_CRACK, EDGE_THINCRACK, CHIP_WHITE};
 
    enum    UPDATE_SETTING_RCP{EM_GLASSINFO_RCP=0,EM_CUTAREA_RCP,EM_DIMEN_RCP,EM_SPLINE_RCP,EM_CORNER_RCP,EM_NOTCH_RCP,EM_VCR_RCP};
 
    enum    GlassDirection        { GD_LeftTop = 0, GD_RightTop = 1, GD_LeftBottom = 10, GD_RightBottom = 11 };
    enum    ExpRegionType        { ER_ALL=0, ER_AREA, ER_NONE};//130115
 
    enum    Procee_Mode            {PROC_MODE_AUTO=0,PROC_MODE_SIMULATION_ONESIDE,PROC_MODE_SIMULATION_SIDESHORT,PROC_MODE_SIMULATION_SIDELONG,PROC_MODE_SIMULATION_ALL};
 
    enum    Init_View_Command    {VIEW_RECIPE=0,VIEW_SCANIMAGE};
};
using namespace GLOBAL_DEFINE;
 
class CProfileOption
{
public:
    int                m_nProfileOff_C_X;
    int                m_nProfileOff_C_Y;
    int                m_nProfileOff_C_DN_X;
    int                m_nProfileOff_C_DN_Y;
    int                m_nProfileOff_A_X;
    int                m_nProfileOff_A_Y;
    int                m_nProfileOff_A_DN_X;
    int                m_nProfileOff_A_DN_Y;
    double            m_dProfileRadius[MAX_STAGE_HAND_COUNT][MAX_PROFILE_SETTING_COUNT];
 
    CProfileOption()
    {
        Reset();
    }
    void Reset()
    {
        m_nProfileOff_C_X = m_nProfileOff_C_Y = m_nProfileOff_C_DN_X = m_nProfileOff_C_DN_Y = 0;
        m_nProfileOff_A_X = m_nProfileOff_A_Y = m_nProfileOff_A_DN_X = m_nProfileOff_A_DN_Y = 0;
        ZeroMemory(m_dProfileRadius,sizeof(double)*MAX_STAGE_HAND_COUNT*MAX_PROFILE_SETTING_COUNT);
    }
};
 
class CRandomData
{
public:
    double        dMin;
    double        dMax;
    double        dLimit;
 
    CRandomData()
    {
        Reset();
    }
    void Reset()
    {
        dMin = dMax = dLimit = 0;
    }
};
 
class CRandomDataSet
{
public:
    CRandomData        Profile;
    CRandomData        ChamferUp;
    CRandomData        ChamferDn;
 
    CRandomDataSet()
    {
        Reset();
    }
    void Reset()
    {
        Profile.Reset();
        ChamferUp.Reset();
        ChamferDn.Reset();
    }
};
 
class CInspectOption
{
public:
    BOOL            bSaveNotchi;
    BOOL            bSaveCornerChip;
    BOOL            bSaveCornerSP;
    BOOL            bSaveSpline;
    BOOL            bSaveEdge;
    BOOL            bSaveDimension;
    BOOL            bSaveSplineChip;
    BOOL            bSaveCutArea;//20140611    
    BOOL            bSaveChipDefectImg;    
    int                nNotchNoDetSkip;        // Pixel
    int                nNotchDetSkip;        // Pixel
    int                nChamferInsHeight;
    int                nChamferSearchWidth;
    int                nChippingInsArea;    
    int                nCrackINsArea;
    int                nBrokenInsArea;
 
    // 20.11.14 - Candidate Filtering..
    int                nChippingInsMinSize;
    int                nCrackInsMinSize;
    int                nBrokenInsMinSize;
    int                nBurrInsMinSize;
 
    int                nChippingInsSideFilterRange;
    int                nCrackInsSideFilterRange;
    int                nBrokenInsSideFilterRnage;
    int                nBurrInsSideFilterRange;
 
    BOOL            bUseRandomData;
    CRandomDataSet    B_GrindLine;
    CRandomDataSet    C_GrindLine;
    CRandomDataSet    D_GrindLine;
    CRandomDataSet    A1_GrindLine;
    CRandomDataSet    A2_GrindLine;
    CRandomDataSet    A1_Rcut;
    CRandomDataSet    A2_Rcut;
    CRandomDataSet    C1_Rcut;
    CRandomDataSet    C2_Rcut;
 
    int                nAlignMarkRange;
    int                nAlignMarkRangeY;
 
    CInspectOption()
    {
        Reset();
    }
    void Reset()
    {
        bSaveNotchi = bSaveCornerChip = bSaveCornerSP = bSaveSpline = bSaveEdge = bSaveDimension = bSaveSplineChip = bSaveCutArea = FALSE;//20140611        
        bSaveChipDefectImg = FALSE;
        nNotchNoDetSkip = 10;
        nNotchDetSkip = 4;
        nChamferInsHeight = 100;
        nChamferSearchWidth = 30;
        nChippingInsArea = 100;
        nCrackINsArea = 200;
        nBrokenInsArea = 300;        
        nChippingInsMinSize = nCrackInsMinSize = nBrokenInsMinSize = nBurrInsMinSize = 5;
        nChippingInsSideFilterRange = nCrackInsSideFilterRange = nBrokenInsSideFilterRnage = nBurrInsSideFilterRange = 10;
 
        bUseRandomData = FALSE;
        B_GrindLine.Reset();
        C_GrindLine.Reset();
        D_GrindLine.Reset();
        A1_GrindLine.Reset();
        A2_GrindLine.Reset();
        A1_Rcut.Reset();
        A2_Rcut.Reset();
        C1_Rcut.Reset();
        C2_Rcut.Reset();        
 
        nAlignMarkRange = 100;
    }
};
 
typedef struct tagPROG_MSG
{
    int nJobIndex;
    int nSide; 
    int nState;
    int nDispLine;
}PROG_MSG;
 
struct _ST_MAPSETTINGS_INDEX
{
    int            m_nIndex[5][4];
};
 
struct _ST_MAPSETTINGS
{
    _ST_MAPSETTINGS_INDEX            m_nMapIndex[2];
};
 
 
class CInspectDefect;
class CDefect;
class CGlass_Data;
interface    IViewInterface2Parent
{
    virtual void        CommandExitButtonClick() = 0;
    virtual void        MapDefect_ReqDefectImage(CInspectDefect* pDefect,int nGlassDefectIdx) = 0;
    virtual CDefect        *ListDefect_ReqDefectImage(CInspectDefect* pDefect,int nGlassDefectIdx) = 0;
 
    virtual LPBYTE        IV2M_GetGrabBufferByDimension(DimensionDir eDim,int iVline) = 0;
    virtual BOOL        IV2M_SetLiveGrabCommand(DimensionDir eDim,BOOL bStop) = 0;
    virtual void        IV2M_InitView(Init_View_Command eVew) = 0;
 
    virtual void        IV2M_LoadImageFullFile(int iSide, CGlass_Data *pGlassData = NULL, std::function<void(BYTE)> _Func = nullptr) = 0;
    virtual void        IV2M_LoadImageFromFolder(int iSide, const CString& strFolderPath, CGlass_Data* pGlassData = NULL, std::function<void(BYTE)> _Func = nullptr) = 0;
    virtual BOOL        IV2M_SaveFullImage(CString strPath,int iSide,CPoint ptStart,int nLength) = 0;
 
    virtual BOOL        IV2M_RecipeChange(CString strRecipe) = 0;
 
    virtual    BOOL        MLight_SetLightControlValue(int iCon,int iCh, int nValue, BOOL bRef, int nScanIdx = 0, BOOL bAdjLight = TRUE) = 0;
    virtual void        MLight_OnOff(int iCon,int iCh,BOOL bValue) = 0;
    virtual int            MLight_GetLightControlValue(int iCon,int iCh, BOOL bRef) = 0;
 
    virtual BOOL        IV2M_InspectionProcess(DimensionDir eDim) = 0;
    virtual BOOL        IV2M_InspectionProcessAll(int iProceMode) = 0;
 
    virtual std::multimap<int, CPoint *> *IF2M_GetCADProfileLine(int iSide,int vStart,int vEnd)= 0;
 
};
 
interface    IUserDefectInterface2Parent
{
    virtual void        IU2P_DrawRect(BOOL bSet) = 0;
    virtual CRect        IU2P_GetCompareRect() = 0;
    virtual void        IU2P_DrawRefresh() = 0;
 
    virtual void        IE2P_SetExpArea(int iSide) = 0;
    virtual POINT        IE2P_GetFrameViewBasepoint() = 0;
    virtual void        IE2P_SetExpAreaTrackerReset() = 0;    
    virtual void        IE2P_SetExpAreaDlgClose() = 0;
};
 
#define IMAGE_WIDTH                        8192//2048
#define IMAGE_HEIGHT                    1024    
#define MAX_IMAGE_FRAME                    100
#define MAX_IMAGE_FRAME_SHORT            100            // ÃÖ´ë ÇÁ·¹ÀÓ ¼ö 
#define MAX_IMAGE_FRAME_LONG            100            // ÃÖ´ë ÇÁ·¹ÀÓ ¼ö 
 
#define MAX_IMAGE_LINE_SHORT    MAX_IMAGE_FRAME_SHORT          * IMAGE_HEIGHT // ÃÖ´ë ¶óÀμö 
#define MAX_IMAGE_LINE_LONG        MAX_IMAGE_FRAME_LONG          * IMAGE_HEIGHT // ÃÖ´ë ¶óÀμö 
#define MAX_IMAGE_LINE            MAX_IMAGE_LINE_LONG
#define MAX_LIMIT_LINE            (MAX_IMAGE_FRAME - 1) * IMAGE_HEIGHT
 
#define MAX_IMAGE_LINE_MARGIN        (150 * IMAGE_HEIGHT) // ÃÖ´ë ¶óÀμö 
 
struct _ST_GDI_ITEM
{
 
    COLORREF    colorWhite;
    COLORREF    colorRed;
    COLORREF    colorYellow;
    COLORREF    colorGreen;
    COLORREF    colorBlue;
    COLORREF    colorBlack;
    COLORREF    colorLightGray;
    COLORREF    colorDarkGray;
    COLORREF    colorGray;
    COLORREF    colorTitle;
    COLORREF    colorLightBlue;
    COLORREF    colorViolet;
    COLORREF    colorLightYellow;
    COLORREF    colorOrange;
    COLORREF    colorLightRed;
    COLORREF    colorLightGreen;
    COLORREF    colorBrown;
    COLORREF    colorSky;
 
 
    CBrush        brushBk;
    CBrush        brushDarkGray;
    CBrush        brushWhite;
    CBrush        brushBlue;
    CBrush        brushLightBlue;
    CBrush        brushBlack;
    CBrush        brushRed;
 
    CBitmap        BkBitmap;
    CBrush        BrushBkPattern;
};
 
enum THICK_INS_METHOD{THICK_METHOD_NORMAL=0,THICK_METHOD_EXTRA};
enum THICKPOS_DIRECTION{THICKPOS_LEFT=0,THICKPOS_RIGHT,THICKPOS_TOP,THICKPOS_BOTTOM};
typedef struct STU_THICKPOS_
{    
    CRect            rect;
    int                iScan;
    int                iFrame;
    double            dThick;
    double            xCoordi;
    double            yCoordi;
    int                nLeftLine;
    int                nRightLine;
    int                nTopLine;
    int                nIndex;
    THICKPOS_DIRECTION    nDir;
    THICK_INS_METHOD    Insmethod;
    int                nChamferThres;
    int                nChipThres;
    int                nJudgeBase;
    int                nJudgeDiff_Plus;
    int                nJudgeDiff_Minus;
    int                nChipWidth;
    int                nChipHeight;
 
public:
    STU_THICKPOS_()
    {
        Reset();
    }    
    STU_THICKPOS_(STU_THICKPOS_ *pPos)
    {
        *this = *pPos;
    }    
    void Reset()
    {
        nDir = THICKPOS_LEFT;
        iFrame = 0;
        dThick = 0;
        iScan = 0;
        nLeftLine = nRightLine = nTopLine = 0;
        rect = CRect(0,0,0,0);
        xCoordi = yCoordi = 0.;
        nIndex = 0;
        Insmethod = THICK_METHOD_NORMAL;
        nChamferThres = nChipThres = nJudgeBase = nJudgeDiff_Plus = nJudgeDiff_Minus = 0;
        nChipWidth = nChipHeight = 0;
    }
}STU_THICKPOS, *pSTU_THICKPOS;
 
typedef struct STU_DIMENSIONPOS_
{    
    CRect            rect;    
    int                iFrame;
    int                nPixelTop;
    double            dSize;
    double            xCoordi;
    double            yCoordi;
    double            dPixelLeft;
    double            dPixelRight;
    double            dImageRight;
    int                iIndex;
 
public:
    STU_DIMENSIONPOS_()
    {        
        iFrame = iIndex = 0;                
        rect = CRect(0,0,0,0);
        xCoordi = yCoordi = dSize = 0.;        
        dPixelLeft = dPixelRight = dImageRight = 0.;
        nPixelTop = 0;
    }    
}STU_DIMENSIONPOS, *pSTU_DIMENSIONPOS;
 
typedef struct _INSPECTDIMENSION_BUFFER
{    
    int                iCam;
    int                iScan;    
    int                iIndex;
    int                iFrame;
    BOOL            bSuccess;
    DimensionDir    enSide;
    double            dLeft;
    double            dRight;
    double            dSize;
    LPBYTE            pOrg;
    CSize            szOrg;
 
    _INSPECTDIMENSION_BUFFER()
    {
        pOrg = NULL;
        Reset();
    }
    void Reset()
    {
        iCam = iScan = iIndex = iFrame = -1;
        enSide = DIMENSION_NONE;
        dLeft = dRight = dSize = 0;
        bSuccess = FALSE;
        if(pOrg != NULL)
            delete[] pOrg;
        pOrg=NULL;
        szOrg = CSize(0,0);
    }
    void Clear()
    {
        if(pOrg == NULL || szOrg.cx <= 0 || szOrg.cy <= 0)
            return;
        ZeroMemory(pOrg,sizeof(BYTE)*szOrg.cx*szOrg.cy);        
    }    
    void SetSize(CSize szRe)
    {
        if(pOrg != NULL && szRe.cx <= szOrg.cx && szRe.cy <= szOrg.cy)
            return;
 
        if(pOrg != NULL) delete[] pOrg,pOrg=NULL;
        szOrg = szRe;
        pOrg = new BYTE[szOrg.cx*szOrg.cy];        
        Clear();
    }
    void CopyBuffer(_INSPECTDIMENSION_BUFFER *pBuffer)
    {
        Reset();
        iCam = pBuffer->iCam;
        iScan = pBuffer->iScan;
        iFrame = pBuffer->iFrame;
        iIndex = pBuffer->iIndex;
        bSuccess = pBuffer->bSuccess;
        enSide = pBuffer->enSide;
        dLeft = pBuffer->dLeft;
        dRight = pBuffer->dRight;
        dSize = pBuffer->dSize;    
        szOrg = pBuffer->szOrg;
 
        if(pBuffer->pOrg != NULL && pBuffer->szOrg.cx > 0 && pBuffer->szOrg.cy > 0)
        {
            pOrg = new BYTE[szOrg.cx*szOrg.cy];
            CopyMemory(pOrg,pBuffer->pOrg,szOrg.cx*szOrg.cy);
        }        
    }
} INSPECTDIMENSION_BUFFER, *pINSPECTDIMENSION_BUFFER;
 
#define     RANGE_VAL_COUNT  9
typedef struct STU_SPLINE_RESULT_
{    
    enum    EN_SPLINE_TYPE{SPLINE_RCUT=0,SPLINE_CCUT,SPLINE_NONE};        
 
    int                iCam;
    int                iScan;
    EN_SPLINE_TYPE    enType;        
    BOOL            bPos;
    double            dMinData;
    double            dMaxData;
    double            dAvg;
    double            dRangeVal[RANGE_VAL_COUNT];
 
public:
    STU_SPLINE_RESULT_()
    {                
        enType = SPLINE_NONE;
        bPos = TRUE;        
        dMinData = dMaxData = dAvg = 0.;
        iCam = iScan = 0;
        ZeroMemory(dRangeVal,sizeof(double)*RANGE_VAL_COUNT);//20140528
    }    
}STU_SPLINE_RESULT, *pSTU_SPLINE_RESULT;
 
typedef struct _INSPECTSPLINE_BUFFER
{    
    enum    SPLINE_SAVE_TYPE{SPLINE_TYPE_ORG=0,SPLINE_TYPE_RES};
    enum    EN_SPLINE_POSITION{SPLINE_TOPLEFT=0,SPLINE_TOPRIGHT,SPLINE_BOTTOMLEFT,SPLINE_BOTTOMRIGHT,SPLINE_POS_NONE};    
 
    int                iCam;
    int                iScan;    
    int                iFrame;
    int                iType;
    EN_SPLINE_POSITION    ePosition;
    BOOL            bPos;    
    double            dMinVal;
    double            dMaxVal;
    double            dAvgVal;
    double            dAvgThick;
    BOOL            bSuccess;
 
    LPBYTE            pOrg;    
    LPBYTE            pRes;
    CSize            szOrg;    
    CSize            szRes;
 
    _INSPECTSPLINE_BUFFER()
    {
        pOrg = pRes = NULL;
        Reset();
    }
    void Reset()
    {
        ePosition = SPLINE_POS_NONE;
        iCam = iScan = iType = iFrame = -1;
        bSuccess = bPos = FALSE;
        dMinVal = dMaxVal = dAvgVal = dAvgThick = 0.;
        if(pOrg != NULL)
            delete[] pOrg;
        pOrg=NULL;        
        if(pRes != NULL)
            delete[] pRes;
        pRes=NULL;
        szOrg = szRes = CSize(0,0);
    }
    void Clear(SPLINE_SAVE_TYPE nOpt)
    {
        switch(nOpt)
        {
        case SPLINE_TYPE_ORG:    
            if(pOrg != NULL && szOrg.cx > 0 && szOrg.cy > 0)
                ZeroMemory(pOrg,sizeof(BYTE)*szOrg.cx*szOrg.cy);
            break;
        case SPLINE_TYPE_RES:
            if(pRes != NULL && szRes.cx > 0 && szRes.cy > 0)
                ZeroMemory(pRes,sizeof(BYTE)*szRes.cx*szRes.cy);                    
            break;
        }        
    }
    void SetBuffer(LPBYTE pBuf,CSize szImg,SPLINE_SAVE_TYPE nOpt)
    {
        if(pBuf == NULL || szImg.cx <= 0 || szImg.cy <= 0)
            return;        
 
        SetSize(szImg,nOpt);
 
        switch(nOpt)
        {
        case SPLINE_TYPE_ORG:
            if(pOrg != NULL && szOrg.cx > 0 && szOrg.cy > 0)            
                CopyMemory(pOrg,pBuf,sizeof(BYTE)*szOrg.cx*szOrg.cy);    
            break;
        case SPLINE_TYPE_RES:
            if(pRes != NULL && szRes.cx > 0 && szRes.cy > 0)            
                CopyMemory(pRes,pBuf,sizeof(BYTE)*szRes.cx*szRes.cy);        
            break;
        }        
    }
    void SetSize(CSize szRe,SPLINE_SAVE_TYPE nOpt)
    {
        switch(nOpt)
        {
        case SPLINE_TYPE_ORG:
            if(pOrg != NULL && szRe.cx <= szOrg.cx && szRe.cy <= szOrg.cy)
                return;
            if(pOrg != NULL) delete[] pOrg,pOrg=NULL;
            szOrg = szRe;
            pOrg = new BYTE[szOrg.cx*szOrg.cy];    
            break;
        case SPLINE_TYPE_RES:
            if(pRes != NULL && szRe.cx <= szRes.cx && szRe.cy <= szRes.cy)
                return;
            if(pRes != NULL) delete[] pRes,pRes=NULL;
            szRes = szRe;
            pRes = new BYTE[szRes.cx*szRes.cy];
            break;
        }
        Clear(nOpt);
    }
    void CopyBuffer(_INSPECTSPLINE_BUFFER *pBuffer)
    {
        Reset();
 
        if(pBuffer == NULL)
            return;
 
        ePosition = pBuffer->ePosition;
        iCam = pBuffer->iCam;
        iScan = pBuffer->iScan;
        iFrame = pBuffer->iFrame;
        iType = pBuffer->iType;
        bSuccess = pBuffer->bSuccess;
        bPos = pBuffer->bPos;
        dMinVal = pBuffer->dMinVal;
        dMaxVal = pBuffer->dMaxVal;
        dAvgVal = pBuffer->dAvgVal;
        dAvgThick = pBuffer->dAvgThick;
        szOrg = pBuffer->szOrg;    
        szRes = pBuffer->szRes;
 
        if(pBuffer->pOrg != NULL && pBuffer->szOrg.cx > 0 && pBuffer->szOrg.cy > 0)
        {
            pOrg = new BYTE[szOrg.cx*szOrg.cy];
            CopyMemory(pOrg,pBuffer->pOrg,szOrg.cx*szOrg.cy);
        }        
        if(pBuffer->pRes != NULL && pBuffer->szRes.cx > 0 && pBuffer->szRes.cy > 0)
        {
            pRes = new BYTE[szRes.cx*szRes.cy];
            CopyMemory(pRes,pBuffer->pRes,szRes.cx*szRes.cy);
        }        
    }
} INSPECTSPLINE_BUFFER, *pINSPECTSPLINE_BUFFER;
 
#define     NOTCH_RANGE_VAL_MAX_COUNT  100//20140528
typedef struct STU_NOTCH_RESULT_
{    
    int                iCam;
    int                iScan;        
    double            dMaxData;
    double            dAvg;
    double            dRangeVal[NOTCH_RANGE_VAL_MAX_COUNT];//20140528
    CPoint            pointCAD[NOTCH_RANGE_VAL_MAX_COUNT];//20140528
    CPoint            pointIMG[NOTCH_RANGE_VAL_MAX_COUNT];//20140528
    double            dRangeVal_Dy[NOTCH_RANGE_VAL_MAX_COUNT];//20140528
    CPoint            pointCAD_Dy[NOTCH_RANGE_VAL_MAX_COUNT];//20140528
    CPoint            pointIMG_Dy[NOTCH_RANGE_VAL_MAX_COUNT];//20140528
    double            dRangeVal_Cham[NOTCH_RANGE_VAL_MAX_COUNT];//20140528
    CPoint            pointCAD_Cham[NOTCH_RANGE_VAL_MAX_COUNT];//20140528
    CPoint            pointIMG_Cham[NOTCH_RANGE_VAL_MAX_COUNT];//20140528
    double            dAvgThick;
    double            dDx;
    double            dDy;
    double            dAlignX;
    double            dAlignY;
    double            dNotchX;
    double            dNotchY;
    int                nNotchInsCount;//20140528
 
public:
    STU_NOTCH_RESULT_()
    {            
        dMaxData = dAvg = dAvgThick = 0.;
        iCam = iScan = 0;
        ZeroMemory(dRangeVal,sizeof(double)*NOTCH_RANGE_VAL_MAX_COUNT);//20140528
        ZeroMemory(pointCAD,sizeof(CPoint)*NOTCH_RANGE_VAL_MAX_COUNT);//20140528
        ZeroMemory(pointIMG,sizeof(CPoint)*NOTCH_RANGE_VAL_MAX_COUNT);//20140528
        ZeroMemory(dRangeVal_Dy,sizeof(double)*NOTCH_RANGE_VAL_MAX_COUNT);//20140528
        ZeroMemory(pointCAD_Dy,sizeof(CPoint)*NOTCH_RANGE_VAL_MAX_COUNT);//20140528
        ZeroMemory(pointIMG_Dy,sizeof(CPoint)*NOTCH_RANGE_VAL_MAX_COUNT);//20140528
        ZeroMemory(dRangeVal_Cham,sizeof(double)*NOTCH_RANGE_VAL_MAX_COUNT);//20140528
        ZeroMemory(pointCAD_Cham,sizeof(CPoint)*NOTCH_RANGE_VAL_MAX_COUNT);//20140528
        ZeroMemory(pointIMG_Cham,sizeof(CPoint)*NOTCH_RANGE_VAL_MAX_COUNT);//20140528
        dDx = dDy = 0.;
        dAlignX = dAlignY = dNotchX = dNotchY = 0.;    
        nNotchInsCount = NOTCH_RANGE_VAL_MAX_COUNT;//20140528
    }    
}STU_NOTCH_RESULT, *pSTU_NOTCH_RESULT;
 
typedef struct _INSPECTNOTCH_BUFFER
{    
    int                iCamIdx;
    int                iScanIdx;
    int                iFrame;    
    BOOL            bSuccess;
    DimensionDir    enSide;
    double            dAvg;
    double            dMax;
 
    LPBYTE            pOrg;
    CSize            szOrg;
    LPBYTE            pOrg_Dy;
    CSize            szOrg_Dy;
 
    _INSPECTNOTCH_BUFFER()
    {
        pOrg = NULL;
        pOrg_Dy = NULL;
        Reset();
    }
    void Reset()
    {
        iCamIdx = iScanIdx = iFrame = -1;
        enSide = DIMENSION_NONE;
        dAvg = dMax = 0;
        bSuccess = FALSE;
        if(pOrg != NULL)
            delete[] pOrg;
        pOrg=NULL;
        szOrg = CSize(0,0);
        if(pOrg_Dy != NULL)
            delete[] pOrg_Dy;
        pOrg_Dy=NULL;
        szOrg_Dy = CSize(0,0);
    }
    void Clear()
    {
        if(pOrg == NULL || szOrg.cx <= 0 || szOrg.cy <= 0)
            return;
        ZeroMemory(pOrg,sizeof(BYTE)*szOrg.cx*szOrg.cy);        
    }    
    void Clear_Dy()
    {
        if(pOrg_Dy == NULL || szOrg_Dy.cx <= 0 || szOrg_Dy.cy <= 0)
            return;
        ZeroMemory(pOrg_Dy,sizeof(BYTE)*szOrg_Dy.cx*szOrg_Dy.cy);        
    }
    void SetSize(CSize szRe)
    {
        if(szRe.cx <= 0 || szRe.cy <=0)
            return;
 
        if(pOrg != NULL) delete[] pOrg,pOrg=NULL;
        szOrg = szRe;
        pOrg = new BYTE[szOrg.cx*szOrg.cy];        
        Clear();
    }
    void SetSize_Dy(CSize szRe)
    {
        if(szRe.cx <= 0 || szRe.cy <=0)
            return;
 
        if(pOrg_Dy != NULL) delete[] pOrg_Dy,pOrg_Dy=NULL;
        szOrg_Dy = szRe;
        pOrg_Dy = new BYTE[szOrg_Dy.cx*szOrg_Dy.cy];        
        Clear_Dy();
    }
    void CopyBuffer(_INSPECTNOTCH_BUFFER *pBuffer)
    {
        Reset();
        iCamIdx = pBuffer->iCamIdx;
        iScanIdx = pBuffer->iScanIdx;
        iFrame = pBuffer->iFrame;        
        bSuccess = pBuffer->bSuccess;
        enSide = pBuffer->enSide;
        dAvg = pBuffer->dAvg;
        dMax = pBuffer->dMax;        
        szOrg = pBuffer->szOrg;
 
        if(pBuffer->pOrg != NULL && pBuffer->szOrg.cx > 0 && pBuffer->szOrg.cy > 0)
        {
            pOrg = new BYTE[szOrg.cx*szOrg.cy];
            CopyMemory(pOrg,pBuffer->pOrg,szOrg.cx*szOrg.cy);
        }                
    }
    void CopyBuffer_Dy(_INSPECTNOTCH_BUFFER *pBuffer)
    {
        Reset();
        iCamIdx = pBuffer->iCamIdx;
        iScanIdx = pBuffer->iScanIdx;
        iFrame = pBuffer->iFrame;        
        bSuccess = pBuffer->bSuccess;
        enSide = pBuffer->enSide;
        dAvg = pBuffer->dAvg;
        dMax = pBuffer->dMax;        
        szOrg_Dy = pBuffer->szOrg_Dy;
 
        if(pBuffer->pOrg_Dy != NULL && pBuffer->szOrg_Dy.cx > 0 && pBuffer->szOrg_Dy.cy > 0)
        {
            pOrg_Dy = new BYTE[szOrg_Dy.cx*szOrg_Dy.cy];
            CopyMemory(pOrg_Dy,pBuffer->pOrg_Dy,szOrg_Dy.cx*szOrg_Dy.cy);
        }                
    }
} INSPECTNOTCH_BUFFER, *pINSPECTNOTCH_BUFFER;
 
typedef struct STU_CORNER_RESULT_
{    
    enum    EN_CORNER_TYPE{CORNER_RCUT=0,CORNER_CCUT,CORNER_NONE};
 
    int                iCam;
    int                iScan;
    EN_CORNER_TYPE    enType;    
    BOOL            bPos;
    double            dResultWidth;
    double            dResultHeight;
 
public:
    STU_CORNER_RESULT_()
    {        
        enType = CORNER_NONE;
        bPos = TRUE;        
        dResultWidth = dResultHeight = 0.;
        iCam = iScan = 0;
    }    
}STU_CORNER_RESULT, *pSTU_CORNER_RESULT;
 
typedef struct _INSPECTFULLIMAGE_BUFFER
{    
    int                iCamIdx;
    int                iScanIdx;        
    LPBYTE            pImage;
    CSize            szImage;
 
    _INSPECTFULLIMAGE_BUFFER()
    {
        pImage = NULL;
        Reset();
    }
    void Reset()
    {        
        iCamIdx = iScanIdx = -1;
        if(pImage != NULL)
            delete[] pImage;
        pImage=NULL;
        szImage = CSize(0,0);        
    }
    void Clear()
    {
        if(pImage == NULL || szImage.cx <= 0 || szImage.cy <= 0)
            return;
        ZeroMemory(pImage,sizeof(BYTE)*szImage.cx*szImage.cy);        
    }    
    void SetSize(CSize szRe)
    {
        if(pImage != NULL && szRe.cx <= szImage.cx && szRe.cy <= szImage.cy)
        {
            Clear();
            return;
        }
 
        if(pImage != NULL) delete[] pImage,pImage=NULL;
        szImage = szRe;
        pImage = new BYTE[szImage.cx*szImage.cy];        
        Clear();
    }
} INSPECTFULLIMAGE_BUFFER, *pINSPECTFULLIMAGE_BUFFER;