Пример #1
0
        public void UpdateDisplayPMS(enumDisplayIndex eDisplayIndex, CInspectionResult.CResult objResult)
        {
            CFormDisplay obj = m_objFormDisplay[( int )eDisplayIndex] as CFormDisplay;

            do
            {
                if (null == obj)
                {
                    break;
                }

                obj.BeginInvoke(obj.m_objDelegateUpdateDisplayPMSImage, objResult);
            } while (false);
        }
Пример #2
0
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //생성 :
        //추가 :
        //목적 : 이미지 저장 해당 델리게이트 호출
        //설명 : 비동기 호출
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        public void SaveImage(int iCameraIndex, CInspectionResult.CResult objResult)
        {
            var          pDocument = CDocument.GetDocument;
            CFormDisplay obj       = m_objFormDisplay[iCameraIndex] as CFormDisplay;

            do
            {
                if (null == obj)
                {
                    break;
                }

                if (CDefine.enumRunMode.RUN_MODE_START == pDocument.GetRunMode())
                {
                    obj.BeginInvoke(obj.m_objDelegateSaveImage, objResult, false);
                }
                else
                {
                    obj.BeginInvoke(obj.m_objDelegateSaveImage, objResult, true);
                }
            } while(false);
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //생성 :
        //추가 :
        //목적 : 검사 시작
        //설명 :
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        public bool DoProcessInspection(int iCameraIndex)
        {
            bool      bReturn   = false;
            var       pDocument = CDocument.GetDocument;
            Stopwatch objTact   = new Stopwatch();

            Stopwatch objStopwatch = new Stopwatch();

            string strPlcCameraName = string.Format("CAMERA_{0}", iCameraIndex + 1);

            pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "DoProcessInspection");

            //PLC객체
            HLDevice.CDevicePLC objPLC = pDocument.m_objProcessMain.m_objPLC;
            // 결과구조체
            CInspectionResult.CResult objResult          = new CInspectionResult.CResult();
            CConfig.CRecipeParameter  objRecipeParameter = pDocument.m_objConfig.GetRecipeParameter(iCameraIndex);
            int iAlarmCode = ( int )CDefine.enumVisionAlarmType.NONE;

            do
            {
                // 택타임 측정
                objTact.Start();
                // 비전 Busy상태
                if (false == m_objPLC.HLWriteWordFromPLC("PC_BUSY", ( short )CDefine.enumVisionStatus.STATUS_BUSY))
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]Vision_Status_Busy On");
                }
                else
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]Vision_Status_Busy On");
                }

                // 셀ID를 읽음
                string strCellID = ReadCellID();
                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Read Cell ID : " + strCellID);

                // string strCellID = "";
                // PLC 데이터 읽기
                short[] iReadData = new short[( int )CDefine.enumPLCInputIndex.PLC_FINAL];
                m_objPLC.HLReadWordFromPLC(CDefine.enumPLCInputIndex.PLC_MODEL_CHANGE.ToString(), iReadData.Length, ref iReadData);

                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Read Recipe ID : " + iReadData[( int )CDefine.enumPLCInputIndex.PLC_MODEL_CHANGE].ToString());
                // 레시피 체크
                if (false == DoProcessRecipe(iReadData[( int )CDefine.enumPLCInputIndex.PLC_MODEL_CHANGE]))
                {
                    break;
                }

                int iCurrentInspectionIndex = iReadData[( int )CDefine.enumPLCInputIndex.PLC_INSPECTION_INDEX] - 1;


                // 티치모드이면 저장되어있는 포지션을 바로 사용하자
                CConfig.CSystemParameter objSystemParameter = pDocument.m_objConfig.GetSystemParameter();
                if (true == objSystemParameter.bVidiTeachMode)
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Teach Mode");
                    iCurrentInspectionIndex = pDocument.GetInspectionIndex();
                }

                // 설정한 검사포지션수 초과시 NG
                if (iCurrentInspectionIndex > objRecipeParameter.iCountInspectionPosition)
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "INSPECTION POSITION OVER");
                    iAlarmCode = (int)CDefine.enumVisionAlarmType.INSPECTION_POSITION_OVER_RANGE;
                    break;
                }

                if (0 > iCurrentInspectionIndex)
                {
                    iCurrentInspectionIndex = 0;
                }
                // 검사인덱스를 가지고 있고
                pDocument.SetInspectionIndex(iCurrentInspectionIndex);

                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Inspection Index : " + (iCurrentInspectionIndex + 1).ToString());

                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Grab Start");
                // 그랩
                objStopwatch.Start();
                if (false == DoProcessTrigger(iCameraIndex))
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Grab Fail");
                    iAlarmCode = ( int )CDefine.enumVisionAlarmType.GRAB_FAIL;
                    break;
                }
                objStopwatch.Stop();
                CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "Grab Sequence TactTime : " + objStopwatch.ElapsedMilliseconds.ToString());

                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "PMS Start");

                objStopwatch.Restart();
                // PMS 이미지 만들기
                CProcessVisionProcess150 obj = m_objProcessVisionProcess150[iCameraIndex] as CProcessVisionProcess150;
                // 트리거 ON
                obj.SetCommand(CProcessVisionProcess150.enumCommand.CMD_START_PMS);

                // Busy Off
                Thread.Sleep(20);
                if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_BUSY.ToString(), ( short )CDefine.enumVisionStatus.STATUS_IDLE))
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]Vision_Status_Busy Off");
                }
                else
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]Vision_Status_Busy Off");
                }

                int iTimeOut    = 25000;
                int iTimePeriod = 3;
                while (CProcessVisionProcess150.enumCommand.CMD_IDLE != obj.GetCommand() && iTimeOut > 0)
                {
                    iTimeOut -= iTimePeriod;
                    Thread.Sleep(iTimePeriod);
                }
                objStopwatch.Stop();
                CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "PMS Image Sequence TactTime : " + objStopwatch.ElapsedMilliseconds.ToString());
                if (0 >= iTimeOut)
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "PMS Image Time Out");
                    iAlarmCode = ( int )CDefine.enumVisionAlarmType.PMS_IMAGE_SETTING_FAIL;
                    break;
                }

                if (CProcessVisionProcess150.enumStatus.STS_ERROR == obj.GetStatus())
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "PMS IMAGE NG");
                    iAlarmCode = ( int )CDefine.enumVisionAlarmType.PMS_IMAGE_SETTING_FAIL;
                    break;
                }

                //////////////////////////////////////////////////
                // PMS이미지 까지 합성했다면.

                //Vidi Start
                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "VIDI Start");
                objStopwatch.Restart();
                obj.SetCommand(CProcessVisionProcess150.enumCommand.CMD_START_INSPECTION);
                iTimeOut    = 25000;
                iTimePeriod = 3;
                while (CProcessVisionProcess150.enumCommand.CMD_IDLE != obj.GetCommand() && iTimeOut > 0)
                {
                    iTimeOut -= iTimePeriod;
                    Thread.Sleep(iTimePeriod);
                }
                objStopwatch.Stop();
                CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "VIDI Sequence TactTime : " + objStopwatch.ElapsedMilliseconds.ToString());

                if (0 >= iTimeOut)
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "VIDI Time Out");
                    objResult = pDocument.GetInspectionResultAlign(iCurrentInspectionIndex);
                    objResult.objResultCommon.strCellID           = strCellID;
                    objResult.objResultCommon.eResult             = CDefine.enumResult.RESULT_NG;
                    objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex;
                    iAlarmCode = ( int )CDefine.enumVisionAlarmType.VIDI_INSPECTION_FAIL;
                    break;
                }
                if (CProcessVisionProcess150.enumStatus.STS_ERROR == obj.GetStatus())
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "VIDI Run NG");
                    objResult = pDocument.GetInspectionResultAlign(iCurrentInspectionIndex);
                    objResult.objResultCommon.strCellID           = strCellID;
                    objResult.objResultCommon.eResult             = CDefine.enumResult.RESULT_NG;
                    objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex;
                    iAlarmCode = ( int )CDefine.enumVisionAlarmType.VIDI_INSPECTION_FAIL;
                    break;
                }

                // 여기서 결과 도출
                objResult = pDocument.GetInspectionResultAlign(iCurrentInspectionIndex);
                objResult.objResultCommon.strCellID = strCellID;


                // 최종결과는 양품으로 설정하고, 1개라도 NG가 나오면 NG로 바꾸자
                objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_OK;
                // 여기에 결과를 채우자, 일단은 1,0으로 채움
                // 1포지션에 검사결과가 5개씩 있다고 가정
                objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex;
                short[] iResult = new short[objResult.objResultCommon.iVidiResultCount];// ( int )CDefine.enumResultIndex.RESULT_FINAL ];
                for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.iVidiResultCount; iLoopCount++)
                {
                    // 일단 1보다 작으면 양품으로 테스트하자
                    if (objRecipeParameter.objInspectionParameter[pDocument.GetInspectionIndex()].dVidiScore > objResult.objResultCommon.objVidiScore[iLoopCount])
                    {
                        objResult.objResultCommon.objVidiResult.Add(CDefine.enumResult.RESULT_OK);
                        iResult[iLoopCount] = 1;
                    }
                    else
                    {
                        objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_NG;
                        objResult.objResultCommon.objVidiResult.Add(CDefine.enumResult.RESULT_NG);
                        iAlarmCode = ( int )CDefine.enumVisionAlarmType.VIDI_INSPECTION_FAIL;
                    }
                    string strResult = string.Format("INDEX : {0}, VIDI_Score : {1:F2}, VIDI_Result : {2}", iLoopCount + 1, objResult.objResultCommon.objVidiScore[iLoopCount], CDefine.enumResult.RESULT_OK == objResult.objResultCommon.eResult ? "OK" : "NG");
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), strResult);
                }

                //String strPLCAddressName = string.Format( "PC_INSPECTION_RESULT_{0}", iCurrentInspectionIndex * ( int )CDefine.enumResultIndex.RESULT_FINAL );
                //String strPLCAddressName = string.Format(CDefine.enumPCOutIndex.PC_INSPECTION_RESULT_1.ToString() );

                //if ( false == m_objPLC.HLWriteWordFromPLC( strPLCAddressName, iResult.Length, iResult ) )
                //    pDocument.SetUpdateLog( ( CDefine.enumLogType )( ( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex ), "[SEND_PLC RESULT][FAIL]"+ strPLCAddressName  );
                //else
                //    pDocument.SetUpdateLog( ( CDefine.enumLogType )( ( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex ), "[SEND_PLC RESULT]" + strPLCAddressName );



                bReturn = true;
            } while(false);
            bool bInspectResult = false;

            // 에러코드
            if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_ALARM_CODE.ToString(), ( short )iAlarmCode))
            {
                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]Set AlarmCode");
            }
            else
            {
                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]Set AlarmCode");
            }

            if (false == bReturn)
            {
                if (true == pDocument.m_objConfig.GetSystemParameter().bPassMode)
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "VISION PASS MODE");

                    if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_OK.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON))
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_OK On");
                    }
                    else
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_OK On");
                    }

                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "VISION PASS MODE : FINAL_RESULT_OK");
                    bInspectResult = true;
                }
                else
                {
                    if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_NG.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON))
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_NG On");
                    }
                    else
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_NG On");
                    }

                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "FINAL_RESULT_NG");
                    bInspectResult = false;
                }
            }
            else
            {
                if (CDefine.enumResult.RESULT_OK == objResult.objResultCommon.eResult)
                {
                    if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_OK.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON))
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_OK On");
                    }
                    else
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_OK On");
                    }

                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "FINAL_RESULT_OK");
                    bInspectResult = true;
                }
                else
                {
                    if (true == pDocument.m_objConfig.GetSystemParameter().bPassMode)
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "VISION PASS MODE");

                        if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_OK.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON))
                        {
                            pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_OK On");
                        }
                        else
                        {
                            pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_OK On");
                        }

                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "VISION PASS MODE : FINAL_RESULT_OK");
                        bInspectResult = true;
                    }
                    else
                    {
                        if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_NG.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON))
                        {
                            pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_NG On");
                        }
                        else
                        {
                            pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_NG On");
                        }

                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "FINAL_RESULT_NG");
                        bInspectResult = false;
                    }
                }
            }
            pDocument.SetDisplayResult(pDocument.GetInspectionIndex(), bInspectResult);

            if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_COMPLETE.ToString(), (short)CDefine.enumComplete.COMPLETE_ON))
            {
                pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_COMPLETE On");
            }
            else
            {
                pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_COMPLETE On");
            }

            // 트리거 OFF
            pDocument.SetTrigger(( int )CDefine.enumCamera.CAMERA_1 + iCameraIndex, CDefine.enumTrigger.TRIGGER_OFF);

            objTact.Stop();
            objResult.objResultCommon.strTactTime = objTact.ElapsedMilliseconds.ToString();
            pDocument.SetUpdateDisplayPMS(pDocument.GetInspectionIndex(), ( int )CFormMainProcess150.enumDisplayIndex.PMS);

            // 이미지 저장경로 넣기
            objResult.strSaveImagePath = pDocument.m_objConfig.GetSystemParameter().strImageSavePath;
            pDocument.SetInspectionResultAlign(pDocument.GetInspectionIndex(), (CInspectionResult.CResult)objResult.Clone());

            // 여기서 결과 디스플레이를 뿌리자
            for (int iLoopCount = 0; iLoopCount < (CDefine.DEF_MAX_COUNT_CROP_REGION - 3); iLoopCount++)
            {
                pDocument.SetUpdateDisplayResultVIDI(pDocument.GetInspectionIndex(), ( int )CFormMainProcess150.enumDisplayIndex.VIDI_1 + iLoopCount);
            }

            // 여기서 결과 디스플레이를 뿌리자
            for (int iLoopCount = 0; iLoopCount < (CDefine.DEF_MAX_COUNT_CROP_REGION - 3); iLoopCount++)
            {
                pDocument.SetUpdateDisplayResultMeasure(pDocument.GetInspectionIndex(), ( int )CFormMainProcess150.enumDisplayIndex.MEASURE_1 + iLoopCount);
            }

            // 이미지 저장
            SaveImage((CInspectionResult.CResult)objResult.Clone());
            // 택타임 측정
            pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_TACT_TIME_CAMERA_0 + iCameraIndex), objTact.ElapsedMilliseconds.ToString() + "ms");

            return(bReturn);
        }
Пример #4
0
        public void UpdateDisplayResult(int iPosition)
        {
            var pDocument   = CDocument.GetDocument;
            var pFormCommon = CFormCommon.GetFormCommon;

            do
            {
                CFormDisplay[] objFormDisplay = new CFormDisplay[m_objFormDisplayLeft.Length];

                bool bInit = true;
                for (int iLoopCount = 0; iLoopCount < m_objFormDisplayLeft.Length; iLoopCount++)
                {
                    if (21 == iPosition)
                    {
                        objFormDisplay[iLoopCount] = m_objFormDisplayLeft[iLoopCount] as CFormDisplay;
                    }
                    else if (23 == iPosition)
                    {
                        objFormDisplay[iLoopCount] = m_objFormDisplayRight[iLoopCount] as CFormDisplay;
                    }
                    else
                    {
                        bInit = false;
                        break;
                    }
                }

                if (false == bInit)
                {
                    break;
                }


                CInspectionResult.CResult objResult = pDocument.GetInspectionResultAlign(iPosition);

                if (null == objFormDisplay)
                {
                    break;
                }

                objFormDisplay[( int )enumDisplayIndex.OIRGINAL].BeginInvoke(objFormDisplay[( int )enumDisplayIndex.OIRGINAL].m_objDelegateUpdateDisplay3D, objResult);

                // 여기서 결과 디스플레이를 뿌리자
                for (int iLoopCount = 0; iLoopCount < CDefine.DEF_MAX_COUNT_CROP_REGION; iLoopCount++)
                {
                    //                     if( 21 == iPosition )
                    //                         obj = m_objFormDisplayLeft[ ( int )enumDisplayIndex.MEASURE_1 + iLoopCount ] as CFormDisplay;
                    //                     else if( 23 == iPosition )
                    //                         obj = m_objFormDisplayRight[ ( int )enumDisplayIndex.MEASURE_1 + iLoopCount ] as CFormDisplay;


                    //obj.BeginInvoke( obj.m_objDelegateUpdateDisplayMeasure3D, objResult );
                    objFormDisplay[( int )enumDisplayIndex.MEASURE_1 + iLoopCount].BeginInvoke(objFormDisplay[( int )enumDisplayIndex.MEASURE_1 + iLoopCount].m_objDelegateUpdateDisplayMeasure3D, objResult);
                }

                if (CDefine.enumResult.RESULT_OK == objResult.objResultCommon.eResult)
                {
                    if (21 == iPosition)
                    {
                        pFormCommon.SetButtonColor(this.BtnTitleCaseLeft, pFormCommon.COLOR_WHITE, pFormCommon.COLOR_GREEN);
                    }
                    else
                    {
                        pFormCommon.SetButtonColor(this.BtnTitleCaseRight, pFormCommon.COLOR_WHITE, pFormCommon.COLOR_GREEN);
                    }
                }
                else
                {
                    if (21 == iPosition)
                    {
                        pFormCommon.SetButtonColor(this.BtnTitleCaseLeft, pFormCommon.COLOR_WHITE, pFormCommon.COLOR_RED);
                    }
                    else
                    {
                        pFormCommon.SetButtonColor(this.BtnTitleCaseRight, pFormCommon.COLOR_WHITE, pFormCommon.COLOR_RED);
                    }
                }
            } while(false);
        }
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //생성 :
        //추가 :
        //목적 : 검사 시작
        //설명 :
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        public bool DoProcessInspection(int iCameraIndex)
        {
            bool      bReturn   = false;
            var       pDocument = CDocument.GetDocument;
            Stopwatch objTact   = new Stopwatch();

            Stopwatch objStopwatch = new Stopwatch();

            string strPlcCameraName = string.Format("CAMERA_{0}", iCameraIndex + 1);

            pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "DoProcessInspection");

            //PLC객체
            HLDevice.CDevicePLC objPLC = pDocument.m_objProcessMain.m_objPLC;
            // 결과구조체
            CInspectionResult.CResult objResult          = new CInspectionResult.CResult();
            CConfig.CRecipeParameter  objRecipeParameter = pDocument.m_objConfig.GetRecipeParameter(iCameraIndex);
            int iAlarmCode = ( int )CDefine.enumVisionAlarmType.NONE;

            do
            {
                // 택타임 측정
                objTact.Start();

                // 셀ID를 읽음
                string strCellID = ReadCellID();
                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Read Cell ID : " + strCellID);

                // string strCellID = "";
                // PLC 데이터 읽기
                short[] iReadData = new short[( int )CDefine.enumPLCInputIndex.PLC_FINAL];
                m_objPLC.HLReadWordFromPLC(CDefine.enumPLCInputIndex.PLC_MODEL_CHANGE.ToString(), iReadData.Length, ref iReadData);

                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Read Recipe ID : " + iReadData[( int )CDefine.enumPLCInputIndex.PLC_MODEL_CHANGE].ToString());
                // 레시피 체크
                if (false == DoProcessRecipe(iReadData[( int )CDefine.enumPLCInputIndex.PLC_MODEL_CHANGE]))
                {
                    break;
                }

                //검사 위치 Read
                int iCurrentInspectionIndex = iReadData[( int )CDefine.enumPLCInputIndex.PLC_INSPECTION_INDEX] - 1;

                //읽어온 검사 위치가 설정 수 보다 큰 경우 Error 후 종료
                if (iCurrentInspectionIndex > objRecipeParameter.iCountInspectionPosition)
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "INSPECTION POSITION OVER");
                    iAlarmCode = ( int )CDefine.enumVisionAlarmType.INSPECTION_POSITION_OVER_RANGE;
                    break;
                }

                // 티치모드이면 저장되어있는 포지션을 바로 사용하자
                CConfig.CSystemParameter objSystemParameter = pDocument.m_objConfig.GetSystemParameter();
                if (true == objSystemParameter.bVidiTeachMode)
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Teach Mode");
                    iCurrentInspectionIndex = pDocument.GetInspectionIndex();
                }

                if (0 > iCurrentInspectionIndex)
                {
                    iCurrentInspectionIndex = 0;
                }
                // 검사인덱스를 가지고 있고
                pDocument.SetInspectionIndex(iCurrentInspectionIndex);

                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Inspection Index : " + (iCurrentInspectionIndex + 1).ToString());

                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Grab Start");
                // 그랩
                objStopwatch.Start();
                if (false == DoProcessTrigger(iCameraIndex))
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Grab Fail");
                    iAlarmCode = ( int )CDefine.enumVisionAlarmType.GRAB_FAIL;

                    // Busy Off
                    if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_BUSY.ToString(), (short)CDefine.enumVisionStatus.STATUS_IDLE))
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]Vision_Status_Busy Off");
                    }
                    else
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]Vision_Status_Busy Off");
                    }

                    break;
                }
                objStopwatch.Stop();
                CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "Grab Sequence TactTime : " + objStopwatch.ElapsedMilliseconds.ToString());

                // Busy Off
                if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_BUSY.ToString(), ( short )CDefine.enumVisionStatus.STATUS_IDLE))
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]Vision_Status_Busy Off");
                }
                else
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]Vision_Status_Busy Off");
                }

                // 이미지 만들기
                objStopwatch.Restart();
                CProcessVisionProcess150Gocator obj = m_objProcessVisionProcess150[iCameraIndex] as CProcessVisionProcess150Gocator;
                obj.SetCommand(CProcessVisionProcess150Gocator.enumCommand.CMD_PROCESS_IMAGE_DATA);

                // Busy Off
                int iTimeOut    = 25000;
                int iTimePeriod = 3;
                while (CProcessVisionProcess150Gocator.enumCommand.CMD_IDLE != obj.GetCommand() && iTimeOut > 0)
                {
                    iTimeOut -= iTimePeriod;
                    Thread.Sleep(iTimePeriod);
                }
                objStopwatch.Stop();
                CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "Image Data Process Sequence TactTime : " + objStopwatch.ElapsedMilliseconds.ToString());
                if (0 >= iTimeOut)
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Image Data Process  Time Out");
                    iAlarmCode = ( int )CDefine.enumVisionAlarmType.PMS_IMAGE_SETTING_FAIL;
                    break;
                }

                if (CProcessVisionProcess150Gocator.enumStatus.STS_ERROR == obj.GetStatus())
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Image Data Process  NG");
                    iAlarmCode = ( int )CDefine.enumVisionAlarmType.PMS_IMAGE_SETTING_FAIL;
                    break;
                }
                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Set Data Process");

                objStopwatch.Restart();

                //////////////////////////////////////////////////
                // 이미지 획득 완료 시 검사 진행
                objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex;
                //Vidi Start
                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Inspection Start");
                objStopwatch.Restart();
                obj.SetCommand(CProcessVisionProcess150Gocator.enumCommand.CMD_START_INSPECTION);
                iTimeOut    = 25000;
                iTimePeriod = 3;
                while (CProcessVisionProcess150Gocator.enumCommand.CMD_IDLE != obj.GetCommand() && iTimeOut > 0)
                {
                    iTimeOut -= iTimePeriod;
                    Thread.Sleep(iTimePeriod);
                }
                objStopwatch.Stop();
                CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "Inspection Sequence TactTime : " + objStopwatch.ElapsedMilliseconds.ToString());

                if (0 >= iTimeOut)
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Inspection Time Out");
                    objResult = pDocument.GetInspectionResultAlign(iCurrentInspectionIndex);
                    objResult.objResultCommon.strCellID           = strCellID;
                    objResult.objResultCommon.eResult             = CDefine.enumResult.RESULT_NG;
                    objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex;
                    iAlarmCode = ( int )CDefine.enumVisionAlarmType.VIDI_INSPECTION_FAIL;
                    break;
                }
                if (CProcessVisionProcess150Gocator.enumStatus.STS_ERROR == obj.GetStatus())
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + iCameraIndex), "Inspection Run NG");
                    objResult = pDocument.GetInspectionResultAlign(iCurrentInspectionIndex);
                    objResult.objResultCommon.strCellID           = strCellID;
                    objResult.objResultCommon.eResult             = CDefine.enumResult.RESULT_NG;
                    objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex;
                    iAlarmCode = ( int )CDefine.enumVisionAlarmType.VIDI_INSPECTION_FAIL;
                    break;
                }

                // 여기서 결과 도출
                objResult = pDocument.GetInspectionResultAlign(iCurrentInspectionIndex);
                objResult.objResultCommon.strCellID = strCellID;


                // 최종결과는 양품으로 설정하고, 1개라도 NG가 나오면 NG로 바꾸자
                objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_OK;
                // 여기에 결과를 채우자, 일단은 1,0으로 채움
                // 1포지션에 검사결과가 5개씩 있다고 가정
                objResult.objResultCommon.iInspectionPosition = iCurrentInspectionIndex;

                short[] iResult = new short[objResult.objResultCommon.iVidiResultCount]; // ( int )CDefine.enumResultIndex.RESULT_FINAL ];
                for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.iVidiResultCount; iLoopCount++)
                {
                    // 일단 1보다 작으면 양품으로 테스트하자
                    if (objRecipeParameter.objInspectionParameter[iCurrentInspectionIndex].dVidiScore < objResult.objResultCommon.objVidiScore[iLoopCount])
                    {
                        objResult.objResultCommon.objVidiResult.Add(CDefine.enumResult.RESULT_OK);
                        iResult[iLoopCount] = 1;
                    }
                    else
                    {
                        objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_NG;
                        objResult.objResultCommon.objVidiResult.Add(CDefine.enumResult.RESULT_NG);
                        iAlarmCode = ( int )CDefine.enumVisionAlarmType.VIDI_INSPECTION_FAIL;
                    }
                    string strResult = string.Format("INDEX : {0}, VIDI_Score : {1:F2}, VIDI_Result : {2}", iLoopCount + 1, objResult.objResultCommon.objVidiScore[iLoopCount], CDefine.enumResult.RESULT_OK == objResult.objResultCommon.objVidiResult[iLoopCount] ? "OK" : "NG");
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), strResult);
                }

                for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.iVidiResultCount; iLoopCount++)
                {
                    // 일단 1보다 작으면 양품으로 테스트하자
                    if (0 >= objResult.objResultCommon.obj3DListHeightOverBlobCountHigh[iLoopCount] && 0 >= objResult.objResultCommon.obj3DListHeightOverBlobCountLow[iLoopCount])
                    {
                        objResult.objResultCommon.objMeasureResult.Add(CDefine.enumResult.RESULT_OK);
                        iResult[iLoopCount] = 1;
                    }
                    else
                    {
                        objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_NG;
                        objResult.objResultCommon.objMeasureResult.Add(CDefine.enumResult.RESULT_NG);
                        iAlarmCode = ( int )CDefine.enumVisionAlarmType.HEIGHT_OVER;
                    }

                    string strResult = string.Format(",POSITION: {0}, REGION: {1}, HEIGHT_MAX_OVER_REGION_COUNT : {2}, HEIGHT_MIN_OVER_REGION_COUNT : {3}, HEIGHT_RESULT : {4}", iCurrentInspectionIndex + 1, iLoopCount + 1, objResult.objResultCommon.obj3DListHeightOverBlobCountHigh[iLoopCount], objResult.objResultCommon.obj3DListHeightOverBlobCountLow[iLoopCount], CDefine.enumResult.RESULT_OK == objResult.objResultCommon.objMeasureResult[iLoopCount] ? "OK" : "NG");
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), strResult);
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_RESULT_MEASURE_3D_HEIGHT), strResult, false);
                }

                for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.iVidiResultCount; iLoopCount++)
                {
                    // 일단 1보다 작으면 양품으로 테스트하자
                    if (objRecipeParameter.objInspectionParameter[iCurrentInspectionIndex].d3DWeldWidthMax > objResult.objResultCommon.obj3DListWeldWidth[iLoopCount] && objRecipeParameter.objInspectionParameter[iCurrentInspectionIndex].d3DWeldWidthMin < objResult.objResultCommon.obj3DListWeldWidth[iLoopCount])
                    {
                        objResult.objResultCommon.objMeasureResult3DWidth.Add(CDefine.enumResult.RESULT_OK);
                        iResult[iLoopCount] = 1;
                    }
                    else
                    {
                        objResult.objResultCommon.eResult = CDefine.enumResult.RESULT_NG;
                        objResult.objResultCommon.objMeasureResult3DWidth.Add(CDefine.enumResult.RESULT_NG);
                        iAlarmCode = ( int )CDefine.enumVisionAlarmType.WELD_WIDTH_OVER;
                    }
                    string strResult = string.Format(",POSITION: {0}, REGION: {1} , WELD WIDTH : {2:F3}, WELD_WIDTH_RESULT : {3}", iCurrentInspectionIndex + 1, iLoopCount + 1, objResult.objResultCommon.obj3DListWeldWidth[iLoopCount], CDefine.enumResult.RESULT_OK == objResult.objResultCommon.objMeasureResult3DWidth[iLoopCount] ? "OK" : "NG");
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), strResult);
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_RESULT_MEASURE_3D_WELD_WIDTH), strResult, false);
                }


                for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.iVidiResultCount; iLoopCount++)
                {
                    // 일단 1보다 작으면 양품으로 테스트하자
                    string strResult = string.Format(",POSITION : {0}, REGION : {1}, SAMPLE HEIGHT DATA, ", iCurrentInspectionIndex + 1, iLoopCount + 1);
                    for (int iLoopSample = 0; iLoopSample < objResult.objResultCommon.obj3DListSampleHeightData[iLoopCount].Count; iLoopSample++)
                    {
                        strResult += (string.Format("{0:F3},", objResult.objResultCommon.obj3DListSampleHeightData[iLoopCount][iLoopSample]));
                    }
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_MEASURE_3D_HEIGHT_SAMPLE), strResult, false);
                }

                //String strPLCAddressName = string.Format( "PC_INSPECTION_RESULT_{0}", iCurrentInspectionIndex * ( int )CDefine.enumResultIndex.RESULT_FINAL );
                //String strPLCAddressName = string.Format(CDefine.enumPCOutIndex.PC_INSPECTION_RESULT_1.ToString() );

                //if ( false == m_objPLC.HLWriteWordFromPLC( strPLCAddressName, iResult.Length, iResult ) )
                //    pDocument.SetUpdateLog( ( CDefine.enumLogType )( ( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex ), "[SEND_PLC RESULT][FAIL]"+ strPLCAddressName  );
                //else
                //    pDocument.SetUpdateLog( ( CDefine.enumLogType )( ( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex ), "[SEND_PLC RESULT]" + strPLCAddressName );



                bReturn = true;
            } while(false);
            bool bInspectResult = false;

            // 에러코드
            if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_ALARM_CODE.ToString(), ( short )iAlarmCode))
            {
                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]Set AlarmCode");
            }
            else
            {
                pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]Set AlarmCode");
            }

            if (false == bReturn)
            {
                if (true == pDocument.m_objConfig.GetSystemParameter().bPassMode)
                {
                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "VISION PASS MODE");

                    if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_OK.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON))
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_OK On");
                    }
                    else
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_OK On");
                    }

                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "VISION PASS MODE : FINAL_RESULT_OK");
                    bInspectResult = true;
                }
                else
                {
                    if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_NG.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON))
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_NG On");
                    }
                    else
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_NG On");
                    }

                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "FINAL_RESULT_NG");
                    bInspectResult = false;
                }
            }
            else
            {
                if (CDefine.enumResult.RESULT_OK == objResult.objResultCommon.eResult)
                {
                    if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_OK.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON))
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_OK On");
                    }
                    else
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_OK On");
                    }

                    pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "FINAL_RESULT_OK");
                    bInspectResult = true;
                }
                else
                {
                    if (true == pDocument.m_objConfig.GetSystemParameter().bPassMode)
                    {
                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "VISION PASS MODE");

                        if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_OK.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON))
                        {
                            pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_OK On");
                        }
                        else
                        {
                            pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_OK On");
                        }

                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "VISION PASS MODE : FINAL_RESULT_OK");
                        bInspectResult = true;
                    }
                    else
                    {
                        if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_INSPECTION_NG.ToString(), ( short )CDefine.enumComplete.COMPLETE_ON))
                        {
                            pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_INSPECTION_NG On");
                        }
                        else
                        {
                            pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_INSPECTION_NG On");
                        }

                        pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_RESULT_STAGE_0 + iCameraIndex), "FINAL_RESULT_NG");
                        bInspectResult = false;
                    }
                }
            }
            pDocument.SetDisplayResult(pDocument.GetInspectionIndex(), bInspectResult);

            if (false == m_objPLC.HLWriteWordFromPLC(CDefine.enumPCOutIndex.PC_COMPLETE.ToString(), (short)CDefine.enumComplete.COMPLETE_ON))
            {
                pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC][FAIL]PC_COMPLETE On");
            }
            else
            {
                pDocument.SetUpdateLog((CDefine.enumLogType)((int)CDefine.enumLogType.LOG_VISION_INTERFACE_CAMERA_0 + iCameraIndex), "[SEND_PLC]PC_COMPLETE On");
            }

            // 트리거 OFF
            pDocument.SetTrigger(( int )CDefine.enumCamera.CAMERA_1 + iCameraIndex, CDefine.enumTrigger.TRIGGER_OFF);

            objTact.Stop();

            CInspectionResult.CInspectionHistoryData objHistory = new CInspectionResult.CInspectionHistoryData();
            objHistory.strCellID = objResult.objResultCommon.strCellID;
            objHistory.iPosition = pDocument.GetInspectionIndex() + 1;
            objHistory.iTactTime = ( int )objTact.ElapsedMilliseconds;
            objHistory.strResult = CDefine.enumResult.RESULT_OK == objResult.objResultCommon.eResult ? "OK" : "NG";
            objHistory.strNgType = ((CDefine.enumVisionAlarmType)iAlarmCode).ToString();

            for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.objVidiScore.Count; iLoopCount++)
            {
                objHistory.dVidiScore[iLoopCount] = objResult.objResultCommon.objVidiScore[iLoopCount];
                if (iLoopCount < objResult.objResultCommon.objVidiResult.Count)
                {
                    objHistory.strVidiResult[iLoopCount] = CDefine.enumResult.RESULT_OK == objResult.objResultCommon.objVidiResult[iLoopCount] ? "OK" : "NG";
                }
                else
                {
                    objHistory.strVidiResult[iLoopCount] = "NG";
                }
            }


            for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.objVidiScore.Count; iLoopCount++)
            {
                if (iLoopCount < objResult.objResultCommon.objMeasureResult.Count)
                {
                    objHistory.str3dHeightResult[iLoopCount] = CDefine.enumResult.RESULT_OK == objResult.objResultCommon.objMeasureResult[iLoopCount] ? "OK" : "NG";
                }
                else
                {
                    objHistory.str3dHeightResult[iLoopCount] = "NG";
                }
            }

            //double dResolution = CDocument.GetDocument.m_objConfig.GetCameraParameter( ( int )CDefine.enumCamera.CAMERA_1 ).dResolution;
            for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.objVidiScore.Count; iLoopCount++)
            {
                if (iLoopCount >= objResult.objResultCommon.obj3DListWeldWidth.Count)
                {
                    objHistory.dMeasureWidth[iLoopCount]  = 0;
                    objHistory.dMeasureHeight[iLoopCount] = 0;
                }
                else
                {
                    objHistory.dMeasureWidth[iLoopCount] = objResult.objResultCommon.obj3DListWeldWidth[iLoopCount];
                }
                if (iLoopCount < objResult.objResultCommon.objMeasureResult3DWidth.Count)
                {
                    objHistory.strMeasureResult[iLoopCount] = CDefine.enumResult.RESULT_OK == objResult.objResultCommon.objMeasureResult3DWidth[iLoopCount] ? "OK" : "NG";
                }
                else
                {
                    objHistory.strMeasureResult[iLoopCount] = "NG";
                }
            }

            // 높이 샘플데이터
            for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.objVidiScore.Count; iLoopCount++)
            {
                if (iLoopCount >= objResult.objResultCommon.obj3DListSampleHeightData[iLoopCount].Count)
                {
                    objHistory.dMeasureHeight[iLoopCount] = 0;
                }
                else
                {
                    objHistory.dMeasureHeight[iLoopCount] = objResult.objResultCommon.obj3DListSampleHeightData[iLoopCount].Max();
                }
            }

            for (int iLoopCount = 0; iLoopCount < objResult.objResultCommon.objVidiScore.Count; iLoopCount++)
            {
                if (iLoopCount < objResult.objResultCommon.objMeasureResult.Count)
                {
                    objHistory.dMeasureStartX[iLoopCount] = objResult.objResultCommon.objMeasureLine[iLoopCount].dStartX;
                    objHistory.dMeasureStartY[iLoopCount] = objResult.objResultCommon.objMeasureLine[iLoopCount].dStartY;
                    objHistory.dMeasureEndX[iLoopCount]   = objResult.objResultCommon.objMeasureLine[iLoopCount].dEndX;
                    objHistory.dMeasureEndY[iLoopCount]   = objResult.objResultCommon.objMeasureLine[iLoopCount].dEndY;
                }
            }

            objHistory.iMeasureLineFindCount = objResult.objResultCommon.objMeasureLine.Count;
            objHistory.dPatternPositionX     = objResult.objResultCommon.dPatternPositionX;
            objHistory.dPatternPositionY     = objResult.objResultCommon.dPatternPositionY;

            objResult.strSaveImagePath = pDocument.m_objConfig.GetSystemParameter().strImageSavePath;

            if ("" == objResult.objResultCommon.strCellID)
            {
                objResult.objResultCommon.strCellID = System.DateTime.Now.ToString("HH.mm.ss");
                objHistory.strCellID = objResult.objResultCommon.strCellID;
            }

            string strToday     = string.Format("{0:D4}-{1:D2}-{2:D2}", DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
            string strPosition  = "Position_" + (objResult.objResultCommon.iInspectionPosition + 1).ToString();
            string strImagePath = objResult.strSaveImagePath + "\\" + strToday + "\\" + objResult.objResultCommon.eResult.ToString() + "\\" + objResult.objResultCommon.strCellID + "\\" + strPosition + "\\";

            objHistory.strImagePath = strImagePath;
            // 데이터베이스 레포트 업데이트
            pDocument.m_objProcessDatabase.m_objDatabaseSendMessage.SetInsertHistoryAlign(objHistory);



            objTact.Stop();
            objResult.objResultCommon.strTactTime = objTact.ElapsedMilliseconds.ToString();
            //  pDocument.SetUpdateDisplayPMS( pDocument.GetInspectionIndex(), ( int )CFormMainProcess150.enumDisplayIndex.PMS );

            //// 이미지 저장경로 넣기
            objResult.strSaveImagePath = pDocument.m_objConfig.GetSystemParameter().strImageSavePath;
            pDocument.SetInspectionResultAlign(pDocument.GetInspectionIndex(), (CInspectionResult.CResult)objResult.Clone());

            // 여기서 결과 디스플레이를 뿌리자
            for (int iLoopCount = 0; iLoopCount < CDefine.DEF_MAX_COUNT_CROP_REGION; iLoopCount++)
            {
                pDocument.SetUpdateDisplayResultVIDI(pDocument.GetInspectionIndex(), ( int )CFormMainProcess150Gocator.enumDisplayIndex.VIDI_1 + iLoopCount);
            }
            //
            // 여기서 결과 디스플레이를 뿌리자
            for (int iLoopCount = 0; iLoopCount < CDefine.DEF_MAX_COUNT_CROP_REGION; iLoopCount++)
            {
                pDocument.SetUpdateDisplayResultMeasure(pDocument.GetInspectionIndex(), ( int )CFormMainProcess150Gocator.enumDisplayIndex.MEASURE_1 + iLoopCount);
            }
            pDocument.SetUpdateDisplay3D(pDocument.GetInspectionIndex(), ( int )CFormMainProcess150Gocator.enumDisplayIndex.IMAGE);
            // 이미지 저장
            Save3DData((CInspectionResult.CResult)objResult.Clone());
            // 배면 결과만 뿌리기
            pDocument.SetDisplayResultMonitor(pDocument.GetInspectionIndex());
            // 택타임 측정
            pDocument.SetUpdateLog((CDefine.enumLogType)(( int )CDefine.enumLogType.LOG_VISION_TACT_TIME_CAMERA_0 + iCameraIndex), objTact.ElapsedMilliseconds.ToString() + "ms");

            return(bReturn);
        }
Пример #6
0
        public void CallbackPMSDone()
        {
            Stopwatch objStopWatch = new Stopwatch();

            objStopWatch.Start();
            try
            {
                // PMS 이미지 완료되면, Inspect를 호출해서 비디 검사를 태웁시다
                var pDocument = CDocument.GetDocument;
                CInspectionResult.CResult objResult = new CInspectionResult.CResult();
                objResult = pDocument.GetInspectionResultAlign(pDocument.GetInspectionIndex());

                //int Width = objResult.objResultCommon.objInputGrabOriginalImageBitmap[ 0 ].Width;
                int Width  = m_iStride;
                int Height = objResult.objResultCommon.objInputGrabOriginalImageBitmap[0].Height;
                int iIndex;

                if (CDefine.enumInspectionType.TYPE_VIDI == m_eInspectionType)
                {
                    iIndex = Convert.ToInt32(EN_IMAGE_TYPE.IMAGE_ALBEDO);
                    m_ppbResultPMS[iIndex] = new byte[Width * Height];
                    IntPtr pAlbedo = m_PMSMix.GetAledoImagePMS();
                    Marshal.Copy(pAlbedo, m_ppbResultPMS[iIndex], 0, Width * Height);
                    objResult.objResultCommon.objPMSImageBitmap[iIndex] = BytesToBitmapGrey(m_ppbResultPMS[iIndex], Width, Height);
                    objResult.objResultCommon.objPMSImage[iIndex]       = new CogImage8Grey(objResult.objResultCommon.objPMSImageBitmap[iIndex]);

                    iIndex = Convert.ToInt32(EN_IMAGE_TYPE.IMAGE_Q);
                    m_ppbResultPMS[iIndex] = new byte[Width * Height];
                    IntPtr pQ = m_PMSMix.GetQImagePMS();
                    Marshal.Copy(pQ, m_ppbResultPMS[iIndex], 0, Width * Height);
                    objResult.objResultCommon.objPMSImageBitmap[iIndex] = BytesToBitmapGrey(m_ppbResultPMS[iIndex], Width, Height);
                    objResult.objResultCommon.objPMSImage[iIndex]       = new CogImage8Grey(objResult.objResultCommon.objPMSImageBitmap[iIndex]);

                    iIndex = Convert.ToInt32(EN_IMAGE_TYPE.IMAGE_P);
                    m_ppbResultPMS[iIndex] = new byte[Width * Height];
                    IntPtr pP = m_PMSMix.GetPImagePMS();
                    Marshal.Copy(pP, m_ppbResultPMS[iIndex], 0, Width * Height);
                    objResult.objResultCommon.objPMSImageBitmap[iIndex] = BytesToBitmapGrey(m_ppbResultPMS[iIndex], Width, Height);
                    objResult.objResultCommon.objPMSImage[iIndex]       = new CogImage8Grey(objResult.objResultCommon.objPMSImageBitmap[iIndex]);
                }
                else
                {
                    iIndex = Convert.ToInt32(EN_IMAGE_TYPE.IMAGE_ALBEDO);
                    m_ppbResultPMS[iIndex] = new byte[Width * Height];
                    IntPtr pAlbedo = m_PMSMix.GetAledoImagePMS();
                    Marshal.Copy(pAlbedo, m_ppbResultPMS[iIndex], 0, Width * Height);
                    objResult.objResultCommon.objPMSImageBitmapMeasure[iIndex] = BytesToBitmapGrey(m_ppbResultPMS[iIndex], Width, Height);
                    objResult.objResultCommon.objPMSImageMeasure[iIndex]       = new CogImage8Grey(objResult.objResultCommon.objPMSImageBitmapMeasure[iIndex]);

                    iIndex = Convert.ToInt32(EN_IMAGE_TYPE.IMAGE_Q);
                    m_ppbResultPMS[iIndex] = new byte[Width * Height];
                    IntPtr pQ = m_PMSMix.GetQImagePMS();
                    Marshal.Copy(pQ, m_ppbResultPMS[iIndex], 0, Width * Height);
                    objResult.objResultCommon.objPMSImageBitmapMeasure[iIndex] = BytesToBitmapGrey(m_ppbResultPMS[iIndex], Width, Height);
                    objResult.objResultCommon.objPMSImageMeasure[iIndex]       = new CogImage8Grey(objResult.objResultCommon.objPMSImageBitmapMeasure[iIndex]);

                    iIndex = Convert.ToInt32(EN_IMAGE_TYPE.IMAGE_P);
                    m_ppbResultPMS[iIndex] = new byte[Width * Height];
                    IntPtr pP = m_PMSMix.GetPImagePMS();
                    Marshal.Copy(pP, m_ppbResultPMS[iIndex], 0, Width * Height);
                    objResult.objResultCommon.objPMSImageBitmapMeasure[iIndex] = BytesToBitmapGrey(m_ppbResultPMS[iIndex], Width, Height);
                    objResult.objResultCommon.objPMSImageMeasure[iIndex]       = new CogImage8Grey(objResult.objResultCommon.objPMSImageBitmapMeasure[iIndex]);
                }

                pDocument.SetInspectionResultAlign(pDocument.GetInspectionIndex(), (CInspectionResult.CResult)objResult.Clone());
                ProcessDoneEvent();
            }
            catch { }

            //CDocument.GetDocument.SetUpdateLog( CDefine.enumLogType.LOG_ETC, "PMS CallBack Image Process TactTime : " + objStopWatch.ElapsedMilliseconds.ToString() );
        }
Пример #7
0
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //생성 :
        //추가 :
        //목적 : 이미지 검사
        //설명 : 4장의 이미지를 PMS통해 합친다.
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        public bool SetPMSImage()
        {
            bool bReturn   = false;
            var  pDocument = CDocument.GetDocument;

            // 검사 결과 구조체
            CInspectionResult.CResult objResult = new CInspectionResult.CResult();
            // 에러 로그
            string    strErrorLog  = string.Format("CProcessVisionProcess60 {0} SetPMSImage ", m_iCameraIndex);
            Stopwatch objStopWatch = new Stopwatch();

            objStopWatch.Start();
            do
            {
                //pDocument.SetUpdateLog( ( CDefine.enumLogType )( ( int )CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0 + m_iCameraIndex ), strErrorLog );
                objResult = pDocument.GetInspectionResultAlign(pDocument.GetInspectionIndex());

                try {
                    List <byte[]> objImageByte;

                    CogImageToByteArr(objResult.objResultCommon.objInputGrabOriginImage, out objImageByte);

                    int[] iImageSize = new int[objImageByte.Count];
                    for (int i = 0; i < objImageByte.Count; i++)
                    {
                        iImageSize[i] = objImageByte[i].Length;
                    }

                    bool bImageSizeSame = true;
                    for (int i = 0; i < objImageByte.Count; i++)
                    {
                        if (iImageSize[0] != iImageSize[i])
                        {
                            bImageSizeSame = false;
                            CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_VISION_PROCESS_CAMERA_0, "Set PMSImage Setting Fail");
                            break;
                        }
                    }

                    if (false == bImageSizeSame)
                    {
                        break;
                    }

                    int iWidth  = objResult.objResultCommon.objInputGrabOriginalImageBitmap[0].Width;
                    int iHeight = objResult.objResultCommon.objInputGrabOriginalImageBitmap[0].Height;



                    CogImage8Grey         objCogImage = new CogImage8Grey(objResult.objResultCommon.objInputGrabOriginImage[0]);
                    ICogImage8PixelMemory pmr         = objCogImage.Get8GreyPixelMemory(CogImageDataModeConstants.Read, 0, 0, iWidth, iHeight);
                    m_iStride = pmr.Stride;

                    iWidth = m_iStride;


                    for (int i = 0; i < objImageByte.Count; i++)
                    {
                        if (null != m_objMatImage[i])
                        {
                            m_objMatImage[i].Release();
                        }
                        m_objMatImage[i] = new Mat(iHeight, iWidth, MatType.CV_8UC1, objImageByte[i]);
                    }

                    m_PMSMix.SetPMSParameters(m_objMatImage[0].Cols, m_objMatImage[0].Rows, Constants.nThreshold);
                    m_PMSMix.SetMatImages(m_objMatImage[0].Cols, m_objMatImage[0].Rows, Constants.ImageNum, m_objMatImage);
                    m_PMS.DoStartProcess(Constants.ImageNum, m_objMatImage[0].Cols, m_objMatImage[0].Rows);
                }
                catch (Exception ex)
                {
                    Trace.WriteLine("CPMSManager.cs -> SetPMSImage ---" + ex.StackTrace);
                    CDocument.GetDocument.SetUpdateLog(CDefine.enumLogType.LOG_ETC, "CPMSManager.cs -> SetPMSImage ---" + ex.ToString());
                    break;
                }
                bReturn = true;
            } while (false);
            //CDocument.GetDocument.SetUpdateLog( CDefine.enumLogType.LOG_ETC, "Set PMSImage Process TactTime : " + objStopWatch.ElapsedMilliseconds.ToString() );
            pDocument.SetInspectionResultAlign(pDocument.GetInspectionIndex(), (CInspectionResult.CResult)objResult.Clone());

            return(bReturn);
        }
Пример #8
0
        public void drawChart(WinChartViewer viewer)
        {
            var pDocument = CDocument.GetDocument;

            CInspectionResult.CResult objResult = pDocument.GetInspectionResultAlign(m_iPositionInspection);

            do
            {
                double[,] objData = { { 0, 0 }, { 0, 0 } };

                try {
                    if (enumImageType.IMAGE_ORIGIN == m_eImageType)
                    {
                        if (null != objResult.objResultCommon.obj3DDataHeightCrop2d)
                        {
                            objData = objResult.objResultCommon.obj3DDataHeightCrop2d;
                        }
                    }
                    else
                    {
                        if (null != objResult.objResultCommon.obj3DResultHeightData && m_iPositionCrop < objResult.objResultCommon.obj3DResultHeightData.Count)
                        {
                            objData = objResult.objResultCommon.obj3DResultHeightData[m_iPositionCrop];
                        }
                    }



                    double[] xData = new double[objData.GetLength(0) * objData.GetLength(1)];
                    double[] yData = new double[objData.GetLength(0) * objData.GetLength(1)];
                    double[] zData = new double[objData.GetLength(0) * objData.GetLength(1)];

                    int temp = 0;

                    //                     for( int x = 0; x < objData.GetLength( 1 ); x++ ) {
                    //                         for( int y = 0; y < objData.GetLength( 0 ); y++ ) {
                    //                             xData[ temp ] = x;
                    //                             yData[ temp ] = y;
                    //                             zData[ temp ] = objData[ y, x ];
                    //                             temp += 1;
                    //                         }
                    //                     }

                    int iX = 0, iY = 0;
                    for (int x = objData.GetLength(1) - 1; x >= 0; x--)
                    {
                        iY = 0;
                        for (int y = objData.GetLength(0) - 1; y >= 0; y--)
                        {
                            //for( int y = 0; y < objData.GetLength( 0 ); y++ ) {
                            xData[temp] = x;
                            yData[temp] = y;
                            zData[temp] = objData[iY, x];
                            if (enumImageType.IMAGE_CROP == m_eImageType)
                            {
                                if (-1 < objData[iY, x])
                                {
                                    zData[temp] = objData[iY, x];
                                }
                                else
                                {
                                    zData[temp] = -1;
                                }
                            }


                            temp += 1;
                            iY++;
                        }
                        iX++;
                    }

                    zData[0] = 0.5;
                    zData[1] = -0.5;

                    c = null;
                    // Create a SurfaceChart object of size 720 x 600 pixels
                    c = new SurfaceChart(1082, 698);

                    // Set the center of the plot region at (330, 290),
                    //and set width x depth x height to
                    // 360 x 360 x 270 pixels
                    c.setPlotRegion(1082 / 2, 698 / 2, 700, 400, 400);

                    // Set the data to use to plot the chart
                    c.setData(xData, yData, zData);

                    // Spline interpolate data to a 80 x 80 grid for a smooth surface
                    c.setInterpolation(150, 150);

                    // Set the view angles
                    c.setViewAngle(elevationAngle, rotationAngle);

                    // Check if draw frame only during rotation
                    if (isDragging && true /*DrawFrameOnRotate.Checked*/)
                    {
                        c.setShadingMode(Chart.RectangularFrame);
                    }

                    // Add a color axis (the legend) in which the left center is anchored
                    //at (650, 270). Set the length to 200 pixels and the labels on the
                    //right side.
                    c.setColorAxis(1000, 270, Chart.Left, 200, Chart.Right);

                    // Set the x, y and z axis titles using 10 points Arial Bold font
                    c.xAxis().setTitle("X", "Arial Bold", 15);
                    c.yAxis().setTitle("Y", "Arial Bold", 15);

                    // Set axis label font
                    c.xAxis().setLabelStyle("Arial", 10);
                    c.yAxis().setLabelStyle("Arial", 10);
                    c.zAxis().setLabelStyle("Arial", 10);
                    c.colorAxis().setLabelStyle("Arial", 10);

                    // Output the chart
                    viewer.Chart = c;
                } catch (Exception ex) {
                    pDocument.SetUpdateLog(CDefine.enumLogType.LOG_VISION_EXCEPTION_CAMERA_0, "Draw Chart : " + ex.ToString());
                }
            } while(false);
        }
Пример #9
0
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //생성 :
        //추가 :
        //목적 : 초기화
        //설명 :
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        private bool Initialize()
        {
            bool bReturn   = false;
            var  pDocument = CDocument.GetDocument;

            do
            {
                m_eImageType          = enumImageType.IMAGE_CROP;
                m_iPositionInspection = m_objReportImage.iInspectionIndex;
                m_iPositionCrop       = 0;
                // 폼 초기화
                if (false == InitializeForm())
                {
                    break;
                }

                winChartViewer1.updateViewPort(true, false);
                initChartViewer(winChartViewer1);
                timer1.Start();

                m_objResult = new CInspectionResult.CResult();



                string strImagePath = m_objReportImage.strImagePath;
                string strFilePath  = "";
                // 폴더 내 파일 목록 불러오기
                try {
                    for (int iLoopHeightChart = 0; iLoopHeightChart < CDefine.DEF_MAX_COUNT_CROP_REGION; iLoopHeightChart++)
                    {
                        strFilePath = "";
                        string[] arFileNames = System.IO.Directory.GetFiles(strImagePath + "\\");
                        // 폴더 내의 파일 수만큼 루프
                        for (int iLoopCount = 0; iLoopCount < arFileNames.Length; iLoopCount++)
                        {
                            if (-1 != arFileNames[iLoopCount].IndexOf("HEIGHT_RESULT_" + iLoopHeightChart.ToString()))
                            {
                                strFilePath = arFileNames[iLoopCount];
                                break;
                            }
                        }

                        if ("" != strFilePath)
                        {
                            FileStream   objFileStream   = new FileStream(strFilePath, FileMode.Open, FileAccess.Read);
                            StreamReader objStreamReader = new StreamReader(strFilePath, Encoding.UTF8);

                            string        strReadData     = "";
                            List <string> objListReadData = new List <string>();
                            while ((strReadData = objStreamReader.ReadLine()) != null)
                            {
                                objListReadData.Add(strReadData);
                            }

                            string[] strWidthLength = objListReadData[0].Split(',');
                            double[,] objHeightData = new double[objListReadData.Count, strWidthLength.Length - 1];
                            for (int iLoopFileHeight = 0; iLoopFileHeight < objHeightData.GetLength(0); iLoopFileHeight++)
                            {
                                string[] strData = objListReadData[iLoopFileHeight].Split(',');
                                for (int iLoopFileWidth = 0; iLoopFileWidth < objHeightData.GetLength(1); iLoopFileWidth++)
                                {
                                    objHeightData[iLoopFileHeight, iLoopFileWidth] = double.Parse(strData[iLoopFileWidth]);
                                }
                            }
                            m_objResult.objResultCommon.obj3DResultHeightData.Add(objHeightData);
                            objStreamReader.Close();
                            objFileStream.Close();
                        }
                    }
                } catch (Exception ex) {
                    System.Diagnostics.Trace.WriteLine(ex.Message);
                }



                ReloadChart();
                winChartViewer1.MouseUsage = WinChartMouseUsage.ScrollOnDrag;
                bReturn = true;
            } while(false);

            return(bReturn);
        }