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
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
#pragma once
 
#include "cv.h"
#include "highgui.h"
#include "opencv.hpp"
#include "core.hpp"
#include <vector>
#include <algorithm>//20140528
#include "HardwareSettings.h"
 
#define MAX_STRING_LENGTH            1024
 
typedef struct tagJUDGEEDGE
{
    BOOL bError;            // 错误与否…
    int  nRefernce;            // 标准     
    int  nTolPlus;            // +容许误差
    int  nTolMinus;            // -容许误差
    int  nSlant;            // 斜线
}JUDGEEDGE, *PJUDGEEDGE;
 
typedef struct tagUserDefectArea
{
    int x;
    int y;
    int area_width;
    int area_height;
    int defect_threshold;
    int defect_dilation;
    int defect_width;
    int defect_height;
 
    void clear(void)
    {
        x = 0;
        y = 0;
        area_width = 0;
        area_height = 0;
        defect_threshold = 0;
        defect_dilation = 0;
        defect_width = 0;
        defect_height = 0;
    }
 
    tagUserDefectArea(void)
    {
        clear();
    }
}ST_USER_DEFECT_AREA;
 
typedef struct tagEXECPTION_AREA
{
    int        nAreaType;
    CRect    rc;            // 区域位置(Mark 原点)    
    SIZE    szErrSize;  // 在这个领域适用的Size    
    int        nAppDefect; // 适用的Defect种类
    int        nDetectLimitedArea;    // 是否使用自定义ROI
 
    void Init()
    {
        nAreaType  = 0;
        nAppDefect = 0;
        nDetectLimitedArea = 0;
        rc = CRect(0,0,0,0);
        szErrSize.cx = 0;
        szErrSize.cy = 0;        
    };
 
    void CopyData(tagEXECPTION_AREA *pExp)
    {
        nAreaType = pExp->nAreaType;
        rc = pExp->rc;
        szErrSize = pExp->szErrSize;
        nAppDefect = pExp->nAppDefect;
        nDetectLimitedArea = pExp->nDetectLimitedArea;    
    }
 
}EXECPTION_AREA;
 
typedef std::vector<EXECPTION_AREA*>  EXCEPTION_AREA_LIST;
typedef EXCEPTION_AREA_LIST::iterator itEXCEPTION_AREA_LIST;
typedef std::vector<ST_USER_DEFECT_AREA> USER_DEFECT_AREA_LIST;
typedef std::vector<ST_USER_DEFECT_AREA>::iterator itUSER_DEFECT_AREA_LIST;
 
typedef struct stLinkList
{
    CString m_strUpperName;
    CString m_strStepName;
    CString m_strInsName;
 
public:
    stLinkList()
    {
        reset();
    }
    void reset()
    {
        m_strUpperName = _T("");
        m_strStepName = _T("");
        m_strInsName = _T("");        
    }
} LinkList, *pLinkList;
typedef std::vector<LinkList*>                VectorLinkList;
typedef std::vector<LinkList*>::iterator    VectorLinkListIt;
 
class CRECIPE_INFO_PARM
{    
public:
    CRECIPE_INFO_PARM();
    virtual ~CRECIPE_INFO_PARM(void);
    CRECIPE_INFO_PARM& operator=(CRECIPE_INFO_PARM& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile);
    BOOL        WriteRecipe(CConfig *pFile);
 
public:
    void        Reset();
    void        SetRecipeName(CString strRecipe);
    void        SetRecipeFileName(CString strFile);
 
    void        SetRecipeFileNameBackUp(CString strFile);
    CString        GetRecipeName();
    CString        GetRecipeFileName();
 
 
public:
    TCHAR        m_strRecipeName[MAX_STRING_LENGTH];              // 配方名称
    TCHAR        m_strRecipeFileName[MAX_STRING_LENGTH];          // 配方文件名称
 
    TCHAR        m_strRecipeFileNameBackUp[MAX_STRING_LENGTH]; // 配方文件名备份
    int            m_nSoftRevision;            
};
 
typedef struct _STU_EXTRA_CHIP_REG
{
    DimensionDir    enSide;
    BOOL            bTB;
    int                nStartY;
    int                nYSize;            
    int                nSizeX;
    int                nChamferThres;
    int                nChipThres;
    int                nJudgeBase;
    int                nJudgeDiff;
    int                nChipWidth;
    int                nChipHeight;
 
    _STU_EXTRA_CHIP_REG()
    {
        Reset();
    }
    void Reset()
    {
        enSide = DIMENSION_NONE;
        nStartY = nYSize = 0;        
        nSizeX = nChamferThres = nChipThres = 0;
        nJudgeBase = nJudgeDiff = 0;
        nChipWidth = nChipHeight = 0;
    }
 
} STU_EXTRA_CHIP_REG, *pSTU_EXTRA_CHIP_REG;
 
typedef struct _STU_CUTAREA_EXP_POS
{
    DimensionDir    enSide;
    int                nPosY;
    int                nSize;    
    ExpRegionType    enERType;
    int                nPosX;
    int                nSizeX;
 
    _STU_CUTAREA_EXP_POS()
    {
        Reset();
    }
    void Reset()
    {
        enSide = DIMENSION_NONE;
        nPosY = nSize = 0;
        enERType = ER_NONE;
        nPosX = nSizeX = 0;
    }
 
} STU_CUTAREA_EXP_POS, *pSTU_CUTAREA_EXP_POS;
 
typedef struct _STU_CUTAREA_PARM
{
    BOOL        m_bCutArea;            
    int            m_nThresT,m_nThresB;    
    int            m_nSearchWidth;    
    int            m_nCalArea;    
 
    _STU_CUTAREA_PARM()
    {
        Reset();
    }
    void Reset()
    {
        m_bCutArea = FALSE;
        m_nThresT = m_nThresB = m_nSearchWidth = m_nCalArea = 0;        
    }
 
} STU_CUTAREA_PARM, *pSTU_CUTAREA_PARM;
 
typedef struct _STU_CUTAREA_ALIGN_MARK//20140611
{
    BOOL        m_bCutAreaAlignMark;        
    int            m_nMarkXPos[2];
    int            m_nMarkXSize[2];
    int            m_nMarkYPos[2];
    int            m_nMarkYSize[2];
    int            m_nAlign2GlassPos;
 
    _STU_CUTAREA_ALIGN_MARK()
    {
        Reset();
    }
    void Reset()
    {
        m_bCutAreaAlignMark = FALSE;
        for (int i=0; i<2; i++)
        {
            m_nMarkXPos[i] = 0;
            m_nMarkXSize[i] = 0;
            m_nMarkYPos[i] = 0;
            m_nMarkYSize[i] = 0;            
        }
        m_nAlign2GlassPos = 0;            
    }
 
} STU_CUTAREA_ALIGN_MARK, *pSTU_CUTAREA_ALIGN_MARK;
 
typedef struct _STU_CHIP_PARM
{
    BOOL        m_bChipping;
    int            m_nThresMode;        // 0:Fixed,1:First Line,2:Max Line
    int            m_nChippingInsArea;
    int            m_nCrackINsArea;
    int            m_nBrokenInsArea;
    int            m_nChippingThres_T;
    int            m_nChippingThres_T_White;
    int            m_nChipDiffThres;
 
    int            m_nChippingThres_B;
    int            m_nChippingThres_T_L;
    int            m_nChippingThres_B_L;
    int            m_nCrackThres;
    int            m_nBrokenThres;
 
    // 20.11.14 - Candidate Filtering..
    int            m_nChippingInsMinSize;
    int            m_nCrackInsMinSize;
    int            m_nBrokenInsMinSize;
    int            m_nBurrInsMinSize;
 
    int            m_nChippingInsSideFilterRange;
    int            m_nCrackInsSideFilterRange;
    int            m_nBrokenInsSideFilterRnage;
    int            m_nBurrInsSideFilterRange;
 
    _STU_CHIP_PARM()
    {
        Reset();
    }
    void Reset()
    {
        m_nThresMode = 0;
        m_bChipping = FALSE;        
        m_nChippingInsArea = m_nChippingThres_T = m_nChippingThres_B = 0;
        m_nChippingThres_T_White = 255;
        m_nCrackINsArea = m_nBrokenInsArea = 0;
        m_nChippingThres_T_L = m_nChippingThres_B_L = 0;        
        m_nCrackThres = m_nBrokenThres = 0;
        m_nChipDiffThres = 255;
 
        m_nChippingInsMinSize = m_nCrackInsMinSize = m_nBrokenInsMinSize = m_nBurrInsMinSize = 5;
 
        m_nChippingInsSideFilterRange = m_nCrackInsSideFilterRange = m_nBrokenInsSideFilterRnage = m_nBurrInsSideFilterRange = 10;
    }
 
} STU_CHIP_PARM, *pSTU_CHIP_PARM;
 
class CCUTAREA_PARM
{    
public:
    CCUTAREA_PARM();
    virtual ~CCUTAREA_PARM(void);
    CCUTAREA_PARM& operator=(CCUTAREA_PARM& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile);
    BOOL        WriteRecipe(CConfig *pFile);
 
public:
    void        Reset();    
    CString        GetFileString(void *pValue);
    BOOL        GetCutAreaUse(int iPos);    
    BOOL        GetChipUse(int iPos);        
    BOOL        GetCutAreaAlignMarkUse(int iPos);//20140611
 
    pSTU_CUTAREA_PARM    GetCutAreaParm(int iPos)
    {
        if(iPos>=0 && iPos<MAX_DIMENSION_COUNT)
            return &m_stuCutAreaParm[iPos];
        else
            return NULL;        
    }
    pSTU_CHIP_PARM        GetChipParm(int iPos)
    {        
        if(iPos>=0 && iPos<MAX_DIMENSION_COUNT)
            return &m_stuChipParm[iPos];
        else
            return NULL;                        
    }
    std::vector<STU_CUTAREA_EXP_POS>    *GetExpArea(int iPos){return iPos>=0&&iPos<MAX_DIMENSION_COUNT?&m_vecCutAreaExpPos[iPos]:NULL;}
 
    pSTU_CUTAREA_ALIGN_MARK        GetCutAreaAlignMark(int iPos)//20140611
    {        
        if(iPos>=0 && iPos<MAX_DIMENSION_COUNT)
            return &m_stuCutAreaAlignMark[iPos];
        else
            return NULL;                        
    }
 
public:    
    STU_CUTAREA_PARM    m_stuCutAreaParm[MAX_DIMENSION_COUNT];
    STU_CHIP_PARM        m_stuChipParm[MAX_DIMENSION_COUNT];
    std::vector<STU_CUTAREA_EXP_POS> m_vecCutAreaExpPos[MAX_DIMENSION_COUNT];
    STU_CUTAREA_ALIGN_MARK m_stuCutAreaAlignMark[MAX_DIMENSION_COUNT];//20140611
};
 
class CCORNER_PARM
{    
public:
    CCORNER_PARM();
    virtual ~CCORNER_PARM(void);
    CCORNER_PARM& operator=(CCORNER_PARM& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile);
    BOOL        WriteRecipe(CConfig *pFile);
 
public:
    void        Reset();
    CString        GetFileString(void *pValue);
 
public:    
    BOOL        m_bSaveImage;    
 
    BOOL        m_bUse;
    int            m_Thres[MAX_DIMENSION_COUNT];    
};
 
enum DIMEN_FIND_TYPE{DIM_TYPE_PATTERN=0,DIM_TYPE_BMPOS,DIM_TYPE_NONE};
typedef struct _STU_DI_POS
{
    int            nBasePosX;
    int            nBasePosY;
    int            nSearchX;
    int            nSearchY;
 
    _STU_DI_POS()
    {
        nBasePosX = nBasePosY = nSearchX = nSearchY = 0;
    }    
} STU_DI_POS, *pSTU_DI_POS;
 
typedef struct _STU_DIMEN_INS_PRM
{
    BOOL        m_bUsePos;        
    int            m_nCamDir;
    int            m_nJudgeSetSize;
    int            m_nJudgeSizeRange;    
    int            m_nOffset;
    int            m_nDetThres;
    DIMEN_FIND_TYPE            m_enDimenType;
 
    _STU_DIMEN_INS_PRM()
    {
        Reset();
    }
    void Reset()
    {
        m_bUsePos = FALSE;
        m_nJudgeSetSize = m_nJudgeSizeRange = m_nOffset = m_nDetThres = m_nCamDir = 0;
        m_enDimenType = DIM_TYPE_NONE;
    }
} STU_DIMEN_INS_PRM, *pSTU_DIMEN_INS_PRM;
 
class CDIMENSION_PARM
{    
public:
    CDIMENSION_PARM();
    virtual ~CDIMENSION_PARM(void);
    CDIMENSION_PARM& operator=(CDIMENSION_PARM& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile);
    BOOL        WriteRecipe(CConfig *pFile);
 
public:
    void        Reset();
    CString        GetFileString(void *pValue);
    BOOL        GetDimenUse(int iPos);
 
    pSTU_DIMEN_INS_PRM        GetDimenIns(int iPos){return iPos>=0&&iPos<MAX_DIMENSION_COUNT?&m_DimInsParm[iPos]:NULL;}
    std::vector<STU_DI_POS>    *GetDimenPos(int iPos){return iPos>=0&&iPos<MAX_DIMENSION_COUNT?&m_vecDiPosition[iPos]:NULL;}
 
public:                
    BOOL                    m_bSaveDimImage;
    STU_DIMEN_INS_PRM        m_DimInsParm[MAX_DIMENSION_COUNT];
    std::vector<STU_DI_POS> m_vecDiPosition[MAX_DIMENSION_COUNT];    
};
 
typedef struct _STU_SPLINE_CHIP_POS
{
    enum MAKE_IMAGE_METHOD{MAKE_METHOD_LINEAR=0,MAKE_METHOD_REGRESSION,MAKE_METHOD_NONE};
    enum MAKE_IMAGE_POS{MAKE_IMAGE_POS_CCUT=0,MAKE_IMAGE_POS_RCUT,MAKE_IMAGE_POS_NONE};
    enum SPLINE_INS_DIRECTION{SPLINE_INS_DIRECTION_X=0,SPLINE_INS_DIRECTION_Y,SPLINE_INS_DIRECTION_NONE};
 
    BOOL        bUse;    
    int            nStartX;
    int            nEndX;    
    int            nThres;
    int            nFindThres;    
    int            nInsRange;
    int            nSkipDist;
    MAKE_IMAGE_METHOD emMethod;
    MAKE_IMAGE_POS    emPos;
    SPLINE_INS_DIRECTION emDir;
 
    _STU_SPLINE_CHIP_POS()
    {
        Reset();
    }
    void Reset()
    {
        bUse = FALSE;
        nStartX = nEndX = nThres = nFindThres = nInsRange = nSkipDist = 0;
        emMethod = MAKE_METHOD_NONE;
        emPos = MAKE_IMAGE_POS_NONE;    
        emDir = SPLINE_INS_DIRECTION_NONE;
    }
} STU_SPLINE_CHIP_POS, *pSTU_SPLINE_CHIP_POS;
 
typedef struct _STU_SPLINE_CHIP_PARM
{    
    BOOL        m_bSplineChip;        
    int            m_nChipSize_Y;
    int            m_nChipSize_X;
    BOOL        m_bChipJudgeAnd;
    int            m_nChipInsArea;
    int            m_nChipThres;    
    BOOL        m_bCornerUse;
    int            m_nCornerThres;    
    int            m_nCornerRange;
    double        m_dChipStartTheta;
    double        m_dChipEndTheta;
    double        m_dChipDistTheta;
 
    _STU_SPLINE_CHIP_PARM()
    {
        Reset();
    }
    void Reset()
    {
        m_bSplineChip = FALSE;
        m_bChipJudgeAnd = FALSE;
        m_nChipSize_X = m_nChipSize_Y = 0;        
        m_nChipInsArea = m_nChipThres = 0;
        m_bCornerUse = m_nCornerThres = m_nCornerRange = 0;
        m_dChipDistTheta = m_dChipEndTheta = m_dChipDistTheta = 0;
    }
} STU_SPLINE_CHIP_PARM, *pSTU_SPLINE_CHIP_PARM;
 
enum    EM_SPLINE_TYPE{EM_SP_CCUT=0,EM_SP_RCUT,EM_SP_NONE};
typedef struct _STU_SPLINE_INS_PARM
{
    BOOL        m_bSpline;    
    BOOL        m_bSplinePointJudge;    
    int            m_DetMinPointDist;
    
    int            m_nStartCornerSize_Y;
    int            m_nStartCornerRadius_um;
 
    int            m_nEndCornerSize_Y;
    int            m_nEndCornerRadius_um;
 
    int            m_DetMinDist;
    int            m_nLineThres;
    EM_SPLINE_TYPE    m_emSPType;
    BOOL        m_bSplineCorner;
 
    int            m_nStartChamferSize;
    int            m_nEndChamferSize;
 
    _STU_SPLINE_INS_PARM()
    {
        Reset();
    }
    void Reset()
    {
        m_bSpline = FALSE;
        m_bSplinePointJudge = FALSE;
        m_DetMinPointDist = 50;
 
        m_nStartCornerSize_Y = 0;
        m_nStartCornerRadius_um = 0;
 
        m_nEndCornerSize_Y = 0;
        m_nEndCornerRadius_um = 0;
 
        m_nLineThres = 0;    
        m_DetMinDist = 50;
        m_emSPType = EM_SP_NONE;
        m_bSplineCorner = FALSE;
 
        m_nStartChamferSize = -1;
        m_nEndChamferSize = -1;
    }
} STU_SPLINE_INS_PARM, *pSTU_SPLINE_INS_PARM;
 
class CSPLINE_PARM
{    
public:
    CSPLINE_PARM();
    virtual ~CSPLINE_PARM(void);
    CSPLINE_PARM& operator=(CSPLINE_PARM& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile);
    BOOL        WriteRecipe(CConfig *pFile);
 
public:
    void        Reset();
    CString        GetFileString(void *pValue);
    BOOL        GetSplineUse(int iPos);
    BOOL        GetSplineUsePointJudge(int iPos);
    BOOL        GetSplineChipUse(int iPos);
 
    pSTU_SPLINE_INS_PARM    GetSplineIns(int iPos){return iPos>=0&&iPos<MAX_DIMENSION_COUNT?&m_SP_InsParm[iPos]:NULL;}
    pSTU_SPLINE_CHIP_PARM    GetSplineChipIns(int iPos){return iPos>=0&&iPos<MAX_DIMENSION_COUNT?&m_SP_ChipParm[iPos]:NULL;}
    std::vector<STU_SPLINE_CHIP_POS>    *GetSplineChipPos(int iPos){return iPos>=0&&iPos<MAX_DIMENSION_COUNT?&m_vecSplineChip[iPos]:NULL;}
 
public:    
    BOOL                        m_bSP_SaveImg;
    STU_SPLINE_INS_PARM            m_SP_InsParm[MAX_DIMENSION_COUNT];
    STU_SPLINE_CHIP_PARM        m_SP_ChipParm[MAX_DIMENSION_COUNT];
    std::vector<STU_SPLINE_CHIP_POS> m_vecSplineChip[MAX_DIMENSION_COUNT];    
};
 
typedef struct _STU_NOTCH_POS//20140528
{
    int            nPosX;
    int            nPosY;
 
    _STU_NOTCH_POS()
    {
        nPosX = nPosY = 0;
    }    
} STU_NOTCH_POS, *pSTU_NOTCH_POS;
 
enum EM_NOTCH_INS_DIR{INS_DIR_NORMAL = 0, INS_DIR_DY, INS_DIR_NONE};
typedef struct _STU_NOTCH_DATA
{
    BOOL        bChipIns;
    BOOL        bSizeIns;
    int            nChipDiff;    
    int            nSizeDiff;
    int            nDetThres;        
    int            nSizeThres;
    int            nChipThres;
    double        dBlank2EdgeRatio;
    int            nVStart;
    int            nVSize;
    int            nMarkXPos[2];
    int            nMarkXSize[2];
    int            nMarkYPos[2];
    int            nMarkYSize[2];
    int            nAlign2GlassPos;
    int            nJudgeBaseWidth;
    int            nJudgeDiffWidth;
 
    int            nSkipSize;
    BOOL        bSpChipIns[2];
    int            nSpChipSize[2];
 
    BOOL        bPointInsDimensionJudge;//20140528
    BOOL        bPointInsChamferJudge;//20140721
    int            nPointInsAveCount;//20140528
 
    _STU_NOTCH_DATA()
    {
        Reset();
    }
    void Reset()
    {
        bChipIns = bSizeIns = FALSE;
        nChipDiff = nSizeDiff = 0;
        nDetThres = nSizeThres = 0;
        nChipThres = nVStart = nVSize = 0;    
        ZeroMemory(nMarkXPos,sizeof(int)*2);
        ZeroMemory(nMarkXSize,sizeof(int)*2);
        ZeroMemory(nMarkYPos,sizeof(int)*2);
        ZeroMemory(nMarkYSize,sizeof(int)*2);                
        nJudgeBaseWidth = nJudgeDiffWidth = 0;
        nAlign2GlassPos = 0;
        nSkipSize = 0;
        dBlank2EdgeRatio = 0.;
        ZeroMemory(bSpChipIns,sizeof(BOOL)*2);
        ZeroMemory(nSpChipSize,sizeof(int)*2);
        bPointInsDimensionJudge = FALSE;//20140721
        bPointInsChamferJudge = FALSE;//20140721
        nPointInsAveCount = 5;
    }
 
} STU_NOTCH_DATA, *pSTU_NOTCH_DATA;
 
#define MAX_NOTCH_INS_POS_COUNT 100//20140528
class CNOTCH_PARM
{    
public:
    CNOTCH_PARM();
    virtual ~CNOTCH_PARM(void);
    CNOTCH_PARM& operator=(CNOTCH_PARM& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile);
    BOOL        WriteRecipe(CConfig *pFile);
 
public:
    void        Reset();
    CString        GetFileString(void *pValue);    
    BOOL        GetNotchSizeUse(int iPos);
    BOOL        GetNotchChipUse(int iPos);
 
    pSTU_NOTCH_DATA    GetNotchIns(int iPos){return iPos>=0&&iPos<MAX_DIMENSION_COUNT?&m_NotchParm[iPos]:NULL;}    
    std::vector<CPoint>    *GetNotchPos(int iPos){return iPos>=0&&iPos<MAX_DIMENSION_COUNT?&m_vecNotchPosition[iPos]:NULL;}//20140528
 
public:
    STU_NOTCH_DATA m_NotchParm[MAX_DIMENSION_COUNT];
    std::vector<CPoint> m_vecNotchPosition[MAX_DIMENSION_COUNT];//20140528
};
 
typedef struct _SortCPointYPos {//20140528
    BOOL operator() (CPoint pt1, CPoint pt2) { return (pt1.y < pt2.y);}
} SortCPointYPos;
 
 
class CVCR_PARM
{    
public:
    CVCR_PARM();
    virtual ~CVCR_PARM(void);
    CVCR_PARM& operator=(CVCR_PARM& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile);
    BOOL        WriteRecipe(CConfig *pFile);
 
public:
    void        Reset();
    CString        GetFileString(void *pValue);
    CRect        GetRect();
 
public:
    BOOL        m_bVCR;    
    BOOL        m_bAlarm;
    BOOL        m_bSetResult;
    int            m_nVCPosY;
    int            m_nVCPosX;
    int            m_nHeight;
    int            m_nWidth;
    BOOL        m_nCamDir;
};
 
class CETC_PARM
{    
public:
    CETC_PARM();
    virtual ~CETC_PARM(void);
    CETC_PARM& operator=(CETC_PARM& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile,int nIdx);
    BOOL        WriteRecipe(CConfig *pFile,int nIdx);
 
public:
    void        Reset();
    CString        GetFileString(void *pValue,int nIdx);
 
public:    
    int            m_nGlassFindthres_Top;
    int            m_nGlassFindHeight_Top;
    int            m_nGlassFindthres_Left;
    int            m_nGlassFindWidth_Left;    
    int            m_nGlassLeftLineMargin[2];    
};
//park
enum LIGHT_CONTROL_METHOD{LIGHT_CONTROL_METHOD_AUTO=0,LIGHT_CONTROL_METHOD_MANUAL,LIGHT_CONTROL_METHOD_NONE};
 
#define        LIGHT_CONTROL_COUNT            2
#define        LIGHT_CONTROL_CH_COUNT        4
 
class CLIGHT_PARM
{    
public:
    CLIGHT_PARM();
    virtual ~CLIGHT_PARM(void);
    CLIGHT_PARM& operator=(CLIGHT_PARM& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile);
    BOOL        WriteRecipe(CConfig *pFile);
 
public:
    void        Reset();
    CString        GetFileString(void *pValue);
 
public:
    BOOL        m_bLightControl;            
    int            m_nContValue[LIGHT_CONTROL_COUNT][LIGHT_CONTROL_CH_COUNT];
 
    void        SetContValue(int nIdx, int nCh, int nContValue);        
};
 
enum EM_GLASSTYPE_COMP{GLASSTYPE_RCUT=0,GLASSTYPE_CCUT,GLASSTYPE_NCUT};
class CGLASS_INFO_PARM
{    
public:
    CGLASS_INFO_PARM();
    virtual ~CGLASS_INFO_PARM(void);
    CGLASS_INFO_PARM& operator=(CGLASS_INFO_PARM& rh);
 
public:
    void            Reset();
    BOOL            ReadRecipe(CConfig *pFile);
    BOOL            WriteRecipe(CConfig *pFile);    
    double            GetOneScanTime(){return m_dOneScanTime;}
    BOOL            GetOneSacnMode(){return m_bOneScanMode;}
 
protected:    
    CString            GetFileString(void *pValue);    
 
public:    
    int                    m_nGlassSizeX;
    int                    m_nGlassSizeY;
    int                    m_nGlassImageSize;
    int                    m_nGlassImageLeftMargin;    
    BOOL                m_bGlassFullImageSave;
    BOOL                m_bAllImageSave;
    GlassDirection        m_OriginDirection;
    CString                m_strDisp;    
    BOOL                m_bGlassDefaultImageSave;
    BOOL                m_bOneScanMode;
    BOOL                m_bPanelReverse;
    double                m_dOneScanTime;
    EM_GLASSTYPE_COMP    m_emGlassType;
    int                    m_nFindGlassStartOffset[MAX_DIMENSION_COUNT];
    int                    m_nGlassFindHorPos[MAX_DIMENSION_COUNT];
};
 
typedef struct stuDEFECT_CONDITION
{
    BOOL bError;                        // 是否发生错误
    BOOL bConditionAND;                    // TRUE: Width和Height都满足才会发生Error
    SIZE szDefect;                        // Defect大小
    int  nMerge;                        // 合并
 
    stuDEFECT_CONDITION(void)
    {
        bError = FALSE;
        bConditionAND = FALSE;
        szDefect.cx = 0;
        szDefect.cy = 0;
        nMerge = 0;
    }
}DEFECT_CONDITION;
 
typedef struct tagJUDGE_DEFECT
{
 
    DEFECT_CONDITION Chip_Side;                
    DEFECT_CONDITION Burr_Side;
    DEFECT_CONDITION Broken;
    DEFECT_CONDITION Bevel;
    DEFECT_CONDITION Chip_CF;                
    DEFECT_CONDITION Burr_CF;    
    DEFECT_CONDITION Crack;
    DEFECT_CONDITION Compare_Panel;
 
    int nRangeStart;
    int nRangeEnd;
}JUDGE_DEFECT, *PJUDGE_DEFECT;
 
typedef struct tagJUDGE_EDGE
{
    BOOL bError;            // 错误与否
    int  nRefernce;            // 标准     
    int  nTolPlus;            // +容许误差
    int  nTolMinus;            // -容许误差
}JUDGE_EDGE, *PJUDGE_EDGE;
 
typedef struct tagJUDGE_AVG
{
    BOOL bUse;            
    int  nDiff;
}JUDGE_AVG, *PJUDGE_AVG;
 
#define        MAX_MARKER_COUNT        3
#define        MAX_POS_MARKER_COUNT    3
class CINSPECT_JUDGEMENT_PARM
{
public:
    CINSPECT_JUDGEMENT_PARM(void);
    virtual ~CINSPECT_JUDGEMENT_PARM(void);
    CINSPECT_JUDGEMENT_PARM& operator=(CINSPECT_JUDGEMENT_PARM& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile);
    BOOL        WriteRecipe(CConfig *pFile);
 
public:
    void        Reset();    
 
public:
    JUDGE_EDGE    corner_X[MAX_PANEL_SIDE];
    JUDGE_EDGE    corner_Y[MAX_PANEL_SIDE];
    JUDGE_EDGE    grind[2][MAX_PANEL_SIDE];
    JUDGE_EDGE    chamfer[2][MAX_PANEL_SIDE];
    JUDGE_EDGE    cutting[2][MAX_PANEL_SIDE]; // 截断量判定标准
    CPoint        ptAlign[MAX_MARKER_COUNT][MAX_DIMENSION_COUNT];
    JUDGE_EDGE    EdgeToSubMark[MAX_DIMENSION_COUNT];
    JUDGE_DEFECT defect[MAX_DIMENSION_COUNT][3];    
    JUDGE_EDGE    Dimension[MAX_DIMENSION_COUNT];    
    int            nCFGrind[MAX_PANEL_SIDE];
    BOOL        bUseLengthDepthComp;
    int            nCornerJugeLength;
    int            nCornerJugeDepth;
    BOOL        bCoordProUse;
    JUDGE_AVG    AvgProfile[MAX_DIMENSION_COUNT];
    JUDGE_AVG    AvgChamfer[MAX_DIMENSION_COUNT];
 
    int            nMinProfileNgCount[MAX_DIMENSION_COUNT];
    int            nMinProfileNgCount_MinDiff[MAX_DIMENSION_COUNT];
};
 
class CINSPECT_INFO_PARM
{
public:
    CINSPECT_INFO_PARM(void);
    virtual ~CINSPECT_INFO_PARM(void);
    CINSPECT_INFO_PARM& operator=(CINSPECT_INFO_PARM& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile);
    BOOL        WriteRecipe(CConfig *pFile);
 
public:
    void        Reset();    
 
    BOOL        GetCutAreaUse(DimensionDir enDimen){return m_CutAreaParm.GetCutAreaUse((int)enDimen);}    
    BOOL        GetCutAreaAlignMarkUse(DimensionDir enDimen){return m_CutAreaParm.GetCutAreaAlignMarkUse((int)enDimen);}
    BOOL        GetChipUse(DimensionDir enDimen){return m_CutAreaParm.GetChipUse((int)enDimen);}    
    BOOL        GetDimenUse(DimensionDir enDimen){return m_DimensionParm.GetDimenUse((int)enDimen);}
    BOOL        GetSplineUse(DimensionDir enDimen){return m_SplineParm.GetSplineUse((int)enDimen);}
    BOOL        GetSplineChipUse(DimensionDir enDimen){return m_SplineParm.GetSplineChipUse((int)enDimen);}
    BOOL        GetNotchSizeUse(DimensionDir enDimen){return m_NotchParm.GetNotchSizeUse((int)enDimen);}
    BOOL        GetNotchChipUse(DimensionDir enDimen){return m_NotchParm.GetNotchChipUse((int)enDimen);}
    BOOL        GetSplineUsePointJudge(int iPos){return m_SplineParm.GetSplineUsePointJudge(iPos);}
 
    CCUTAREA_PARM        *GetCutParm(){return &m_CutAreaParm;}
    pSTU_CUTAREA_PARM    GetCutAreaParm(DimensionDir enDimen){return m_CutAreaParm.GetCutAreaParm((int)enDimen);}
    pSTU_CHIP_PARM        GetChipParm(DimensionDir enDimen){return m_CutAreaParm.GetChipParm((int)enDimen);}
    std::vector<STU_CUTAREA_EXP_POS>    *GetExpArea(DimensionDir enDimen){return m_CutAreaParm.GetExpArea((int)enDimen);}
    pSTU_CUTAREA_ALIGN_MARK    GetCutAreaAlignMark(DimensionDir enDimen){return m_CutAreaParm.GetCutAreaAlignMark((int)enDimen);}//20140611
 
    CCORNER_PARM        *GetCornerParm(){return &m_CornerParm;}
 
    CDIMENSION_PARM            *GetDimensionParm(){return &m_DimensionParm;}
    pSTU_DIMEN_INS_PRM        GetDimenIns(DimensionDir enDimen){return m_DimensionParm.GetDimenIns((int)enDimen);}
    std::vector<STU_DI_POS>    *GetDimenPos(DimensionDir enDimen){return m_DimensionParm.GetDimenPos((int)enDimen);}
 
    CSPLINE_PARM            *GetSplineParm(){return &m_SplineParm;}
    pSTU_SPLINE_INS_PARM    GetSplineIns(DimensionDir enDimen){return m_SplineParm.GetSplineIns((int)enDimen);}
    pSTU_SPLINE_CHIP_PARM    GetSplineChipIns(DimensionDir enDimen){return m_SplineParm.GetSplineChipIns((int)enDimen);}
    std::vector<STU_SPLINE_CHIP_POS>    *GetSplineChipPos(DimensionDir enDimen){return m_SplineParm.GetSplineChipPos((int)enDimen);}
 
    CNOTCH_PARM                *GetNotchParm(){return &m_NotchParm;}
    pSTU_NOTCH_DATA            GetNotchIns(DimensionDir enDimen){return m_NotchParm.GetNotchIns((int)enDimen);}    
 
public:    
    CVCR_PARM            m_VCRParm;
    CCUTAREA_PARM        m_CutAreaParm;
    CCORNER_PARM        m_CornerParm;
    CDIMENSION_PARM        m_DimensionParm;
    CSPLINE_PARM        m_SplineParm;    
    CNOTCH_PARM            m_NotchParm;
    std::vector<STU_EXTRA_CHIP_REG> m_vecExtraChipReg;    
 
    int                    m_nRCutThresGlass[MAX_DIMENSION_COUNT][2];
    int                    m_nRCutThresChamfer[MAX_DIMENSION_COUNT][2];
};
 
 
class CALIGNMARK_PARM
{    
public:
    CALIGNMARK_PARM();
    virtual ~CALIGNMARK_PARM(void);
    CALIGNMARK_PARM& operator=(CALIGNMARK_PARM& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile,int nIdx);
    BOOL        WriteRecipe(CConfig *pFile,int nIdx);
 
public:
    void        Reset();        
    void        MarkImgDelete();    
 
public:
    BOOL        m_bIsMark[MAX_MARKER_COUNT];    // 是否存在标志?
    int            m_nMarkType[MAX_MARKER_COUNT];
    double        m_dMarkMatchingRate[MAX_MARKER_COUNT][MAX_POS_MARKER_COUNT];        
    JUDGEEDGE    m_JudgeAlign;        
    IplImage    *IpMarkImg[MAX_MARKER_COUNT][MAX_POS_MARKER_COUNT];
};
 
enum    EM_INS_TYPE{EM_INS_EDGE=0,EM_INS_CORNER,EM_INS_DIMENSION,EM_INS_SPLINE,EM_INS_NOTCH,EM_INS_SPLINE_POINT_JUDGE};
 
// Hole Inspsect Parameter
struct HOLE_INS_PARM
{
    int        m_nSideIdx;
    CRect    m_rtArea;
    CRect    m_rtHoleArea;
    int        m_nThreshold;
    int        m_nOffset;
    int        m_nMinSize;
    double  m_dMatRate;
    CString m_strTemplatePath;
};
 
class CHOLEINSPECT_PARM
{    
public:
    CHOLEINSPECT_PARM()                        {Reset();};
    virtual ~CHOLEINSPECT_PARM(void)        {Reset();};
    CHOLEINSPECT_PARM& operator=(CHOLEINSPECT_PARM& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile);
    BOOL        WriteRecipe(CConfig *pFile);
 
public:
    void        Reset();        
 
public:
    int                        m_nTotalHoleCount;
    vector<HOLE_INS_PARM>    m_vecHoleInsParam;
};
// End of Hole Inspsect Parameter
 
typedef struct tagProfileSetting
{
    double x;
    double y;
    double radius;
    double plus;
    double minus;
    BOOL use;
 
    tagProfileSetting(void)
    {
        x = 0.0;
        y = 0.0;
        radius = 0.0;
        plus = 50.0;
        minus = 50.0;
        use = TRUE;
    }
}ST_PROFILE_SETTING;
 
typedef struct tagChamferSetting
{
    double reference;
    double plus;
    double minus;
    BOOL use;
 
    tagChamferSetting(void)
    {
        reference = 100.0;
        plus = 50.0;
        minus = 50.0;
        use = TRUE;
    }
}ST_CHAMFER_SETTING;
 
 
 
class CProfileInspect_Prm
{    
public:
    CProfileInspect_Prm()                        {Reset();};
    virtual ~CProfileInspect_Prm(void)        {Reset();};
    CProfileInspect_Prm& operator=(CProfileInspect_Prm& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile);
    BOOL        WriteRecipe(CConfig *pFile);
 
public:
    void        Reset();        
 
public:
    BOOL            m_bUseOriginAlignKey[MAX_DIMENSION_COUNT];
    int                m_nOriginAlignKeyOffsetX[MAX_DIMENSION_COUNT];
    int                m_nOriginAlignKeyOffsetY[MAX_DIMENSION_COUNT];
    int                m_nOriginAlignKeyOffsetDwX[MAX_DIMENSION_COUNT];
    int                m_nOriginAlignKeyOffsetDwY[MAX_DIMENSION_COUNT];
 
    int                m_nCADOffsetX[MAX_DIMENSION_COUNT];
    int                m_nCADOffsetY[MAX_DIMENSION_COUNT];
    ST_PROFILE_SETTING    m_stProfile[MAX_PROFILE_SETTING_COUNT];
    ST_CHAMFER_SETTING    m_stCamferUp[MAX_PROFILE_SETTING_COUNT];
    ST_CHAMFER_SETTING    m_stCamferDn[MAX_PROFILE_SETTING_COUNT];
 
    double            m_dConvResolution[MAX_DIMENSION_COUNT][MAX_STAGE_HAND_COUNT];
    double            m_dScanResolution[MAX_DIMENSION_COUNT][MAX_STAGE_HAND_COUNT];
};
 
class CGlassRecipe
{
public:
    CGlassRecipe(void);
    virtual ~CGlassRecipe(void);
    CGlassRecipe& operator=(CGlassRecipe& rh);
 
public:
    BOOL        ReadRecipe(CConfig *pFile);
    BOOL        WriteRecipe(CConfig *pFile);
    BOOL        WriteRecipeFile();    
    BOOL        WriteRecipeFileBackUp();
    BOOL        MakeRecipeFileName(CString strRecipe);    
    BOOL        MakeRecipeFileNameBackUp(CString strRecipe);
    BOOL        ReadRecipeFile();
 
    int            GetLightValue(int iCon,int iCh);
    CINSPECT_INFO_PARM    *GetInspectInfo(){return &m_InspectInfoParm;}
    CALIGNMARK_PARM    *GetAlignMarkPrm(DimensionDir eDim);
    BOOL        LoadAlignMark();
    BOOL        SaveAlignMark();
 
    pSTU_CUTAREA_PARM    GetCutAreaPrm(DimensionDir eDim);
    CCORNER_PARM        *GetCornerParm(){return m_InspectInfoParm.GetCornerParm();}
 
    CETC_PARM            *GetEtcPrm(DimensionDir eDim);
 
    CINSPECT_JUDGEMENT_PARM    *GetJudgePrm(){return &m_Judgement;}
    USER_DEFECT_AREA_LIST    *GetUserDefectList(DimensionDir eDim){return &m_UserDefectPrm[eDim];}
    EXCEPTION_AREA_LIST        *GetExpAreaList(DimensionDir eDim){return &m_ExpAreaPrm[eDim];}
    CHOLEINSPECT_PARM        *GetHolePrm(){return &m_HoleInspectParm;}
 
    CDIMENSION_PARM            *GetDimensionParm(){return m_InspectInfoParm.GetDimensionParm();}
    CProfileInspect_Prm        *GetProfileParm(){return &m_ProfilePrm;}
    CGLASS_INFO_PARM        *GetGlassInfo(){return &m_GlassParm;}
 
    CString        GetRecipeName();
    void        Reset();    
 
    BOOL        Save_Image(CString strPath,IplImage *IpImg);
    BOOL        Load_Image(CString strPath,IplImage **pIpImg);
 
    BOOL        LoadUserDefectList();
    BOOL        SaveUserDefectList();
    BOOL        LoadExpAreaList();
    BOOL        SaveExpAreaList();
    void        DeleteExpAreaList();
 
public:
    CRECIPE_INFO_PARM    m_RecieParm;
    CGLASS_INFO_PARM    m_GlassParm;
    CETC_PARM            m_ETCParm[MAX_DIMENSION_COUNT];
    CLIGHT_PARM            m_LightParm;
    CALIGNMARK_PARM        m_AlignMarkParm[MAX_DIMENSION_COUNT];
    USER_DEFECT_AREA_LIST    m_UserDefectPrm[MAX_DIMENSION_COUNT];
    EXCEPTION_AREA_LIST    m_ExpAreaPrm[MAX_DIMENSION_COUNT];
 
    CINSPECT_INFO_PARM    m_InspectInfoParm;
 
    CINSPECT_JUDGEMENT_PARM    m_Judgement;
    CHOLEINSPECT_PARM        m_HoleInspectParm;
    CProfileInspect_Prm        m_ProfilePrm;
 
protected:
    CConfig        m_RecipeFile;
};