public static bool TeachTeacherROI( string RecipeName, EuresysDoublePatternMatcher PatternMatcher_, PatternMatcherParameters PatternMatcherParameters_, EROIBW8 eROIForPatternTeaching1_, EROIBW8 eROIForPatternTeaching2_, iEuresysROI MatcherEROI, PointF WaferCenterPoint, WaferOrientation patternOrientation) { string PatternFilePath_One = PatternMatcherParameterHelper.GetLeftPatternFilePath(RecipeName); string PatternFilePath_Two = PatternMatcherParameterHelper.GetRightPatternFilePath(RecipeName); string PatternImageFilePath_One = PatternMatcherParameterHelper.GetLeftPatternImageFilePath(RecipeName); string PatternImageFilePath_Two = PatternMatcherParameterHelper.GetRightPatternImageFilePath(RecipeName); PatternMatcher_.TeachAndSaveEMatcher( PatternMatcherParameters_, eROIForPatternTeaching1_, eROIForPatternTeaching2_, PatternFilePath_One, PatternFilePath_Two, PatternImageFilePath_One, PatternImageFilePath_Two); if (PatternMatcher_.Pattern1.IsVoid) { goto Fail; } if (PatternMatcher_.Pattern2.IsVoid) { goto Fail; } // Match EROIBW8 matcherROI = MatcherEROI.GetROI(0); PatternMatcher_.MatchPatterns(matcherROI); EMatcher eMatcher1 = PatternMatcher_.EMatcher1; EMatcher eMatcher2 = PatternMatcher_.EMatcher2; if (eMatcher1.NumPositions != 1) { string errorMessage = "Pattern 1: Number of patterns matched is not equal to one"; VisionLogger.Log(LogType.Exception, "PatternMatcherManager", errorMessage); VisionNotifier.AddNotification(errorMessage); goto Fail; } if (eMatcher2.NumPositions != 1) { string errorMessage = "Pattern 2: Number of patterns matched is not equal to one"; VisionLogger.Log(LogType.Exception, "PatternMatcherManager", errorMessage); VisionNotifier.AddNotification(errorMessage); goto Fail; } EROIBW8 matcherEROI_1 = MatcherEROI.GetROI(0); float OriginalXPos_pattern1 = eMatcher1.GetPosition(0).CenterX + (matcherEROI_1.OrgX); float OriginalYPos_pattern1 = eMatcher1.GetPosition(0).CenterY + (matcherEROI_1.OrgY); float OriginalXPos_pattern2 = eMatcher2.GetPosition(0).CenterX + (matcherEROI_1.OrgX); float OriginalYPos_pattern2 = eMatcher2.GetPosition(0).CenterY + (matcherEROI_1.OrgY); float WaferCenterXPos = WaferCenterPoint.X; float WaferCenterYPos = WaferCenterPoint.Y; PointF p1 = new PointF(OriginalXPos_pattern1, OriginalYPos_pattern1); PointF p2 = new PointF(OriginalXPos_pattern2, OriginalYPos_pattern2); float PatternDefaultAngleOffset = (float)CalculateAngleBetween3Points.Execute( p1, p2, WaferCenterPoint, 0, true, patternOrientation); // Replace value PatternMatcherParameters_.OriginalXPos_pattern1 = OriginalXPos_pattern1; PatternMatcherParameters_.OriginalYPos_pattern1 = OriginalYPos_pattern1; PatternMatcherParameters_.OriginalXPos_pattern2 = OriginalXPos_pattern2; PatternMatcherParameters_.OriginalYPos_pattern2 = OriginalYPos_pattern2; PatternMatcherParameters_.WaferCenterXPos = WaferCenterXPos; PatternMatcherParameters_.WaferCenterYPos = WaferCenterYPos; PatternMatcherParameters_.DefaultAngleOffset = PatternDefaultAngleOffset; return(true); Fail: return(false); }
public static EuresysDoubleMatcherResults CreateDoublePatternMatcherResult( EuresysDoublePatternMatcher matcher, EROIBW8 matcherEROI, float originalXPos_Pattern1, float originalYPos_Pattern1, PointF waferCenterPoint, double refAngle, WaferOrientation patternOrientation) { if (matcher == null) { throw new ArgumentNullException("matcher"); } if (!matcher.isPatternMatched_) { throw new ArgumentException("Pattern is not matched"); } if (matcher.EMatcher1.NumPositions < 1) { throw new ArgumentException("No occurance on EMatcher1"); } if (matcher.EMatcher2.NumPositions < 1) { throw new ArgumentException("No occurance on EMatcher2"); } if (matcher.EMatcher1.NumPositions > 1) { throw new ArgumentException("More than one occurance on EMatcher1"); } if (matcher.EMatcher2.NumPositions > 1) { throw new ArgumentException("More than one occurance on EMatcher2"); } if (matcher.EMatcher1.NumPositions != matcher.EMatcher2.NumPositions) { throw new ArgumentException("Occurance for EMatcher 1 and EMatcher 2 nota tally"); } EuresysDoubleMatcherResults result = new EuresysDoubleMatcherResults() { Angle1 = matcher.EMatcher1.GetPosition(0).Angle, ScaleX1 = matcher.EMatcher1.GetPosition(0).ScaleX, ScaleY1 = matcher.EMatcher1.GetPosition(0).ScaleY, CenterX1 = matcher.EMatcher1.GetPosition(0).CenterX + (float)(matcherEROI.OrgX), CenterY1 = matcher.EMatcher1.GetPosition(0).CenterY + (float)(matcherEROI.OrgY), Score1 = matcher.EMatcher1.GetPosition(0).Score, Angle2 = matcher.EMatcher2.GetPosition(0).Angle, ScaleX2 = matcher.EMatcher2.GetPosition(0).ScaleX, ScaleY2 = matcher.EMatcher2.GetPosition(0).ScaleY, CenterX2 = matcher.EMatcher2.GetPosition(0).CenterX + (float)(matcherEROI.OrgX), CenterY2 = matcher.EMatcher2.GetPosition(0).CenterY + (float)(matcherEROI.OrgY), Score2 = matcher.EMatcher2.GetPosition(0).Score, }; PointF p1 = new PointF(result.CenterX1, result.CenterY1); PointF p2 = new PointF(result.CenterX2, result.CenterY2); double angle = CalculateAngleBetween3Points.Execute(p1, p2, waferCenterPoint, refAngle, true, patternOrientation); if (angle > 45) { throw new Exception("angle should not be higher than 45 degree"); } if (angle < -45) { throw new Exception("angle should not be less than -45 degree"); } result.AngleBetweenResult = (float)angle; result.XOffset = originalXPos_Pattern1 - result.CenterX1; result.YOffset = originalYPos_Pattern1 - result.CenterY1; return(result); }
public static List <EuresysDoubleMatcherResults> CreateDoublePatternMatcherResults( EuresysDoublePatternMatcher matcher, List <EROIBW8> matcherEROIs, float originalXPos_Pattern1, float originalYPos_Pattern1, PointF centerPoint, double refTheta, WaferOrientation patternOrientation) { if (matcher == null) { throw new ArgumentNullException("matcher"); } if (matcherEROIs == null) { throw new ArgumentNullException("matcherEROIs"); } if (matcherEROIs.Count < 1) { throw new ArgumentException("matcherEROIs count cannot be less than one"); } if (!matcher.isPatternMatched_) { throw new ArgumentException("Pattern is not matched"); } if (matcher.EMatcher1.NumPositions < 1) { throw new ArgumentException("No occurance on EMatcher1"); } if (matcher.EMatcher2.NumPositions < 1) { throw new ArgumentException("No occurance on EMatcher2"); } if (matcher.EMatcher1.NumPositions != matcher.EMatcher2.NumPositions) { throw new ArgumentException("Occurance for EMatcher 1 and EMatcher 2 nota tally"); } List <EuresysDoubleMatcherResults> result_list = new List <EuresysDoubleMatcherResults>(); for (int i = 0; i < matcher.EMatcher1.NumPositions; i++) { EuresysDoubleMatcherResults result = new EuresysDoubleMatcherResults() { Angle1 = matcher.EMatcher1.GetPosition(i).Angle, ScaleX1 = matcher.EMatcher1.GetPosition(i).ScaleX, ScaleY1 = matcher.EMatcher1.GetPosition(i).ScaleY, //CenterX1 = matcher.EMatcher1.GetPosition(i).CenterX, //CenterY1 = matcher.EMatcher1.GetPosition(i).CenterY, CenterX1 = matcher.EMatcher1.GetPosition(i).CenterX + (float)(matcherEROIs[0].OrgX), CenterY1 = matcher.EMatcher1.GetPosition(i).CenterY + (float)(matcherEROIs[0].OrgY), Score1 = matcher.EMatcher1.GetPosition(i).Score, Angle2 = matcher.EMatcher2.GetPosition(i).Angle, ScaleX2 = matcher.EMatcher2.GetPosition(i).ScaleX, ScaleY2 = matcher.EMatcher2.GetPosition(i).ScaleY, //CenterX2 = matcher.EMatcher2.GetPosition(i).CenterX, //CenterY2 = matcher.EMatcher2.GetPosition(i).CenterY, CenterX2 = matcher.EMatcher2.GetPosition(i).CenterX + (float)(matcherEROIs[0].OrgX), CenterY2 = matcher.EMatcher2.GetPosition(i).CenterY + (float)(matcherEROIs[0].OrgY), Score2 = matcher.EMatcher2.GetPosition(i).Score, }; PointF p1 = new PointF(result.CenterX1, result.CenterY1); PointF p2 = new PointF(result.CenterX2, result.CenterY2); double angle = CalculateAngleBetween3Points.Execute(p1, p2, centerPoint, refTheta, true, patternOrientation); result.AngleBetweenResult = (float)angle; result.XOffset = originalXPos_Pattern1 - result.CenterX1; result.YOffset = originalYPos_Pattern1 - result.CenterY1; result_list.Add(result); } return(result_list); }