using Aurora.Api; using VisionCommon; using System; namespace VisionSequence.Aligner { /// /// 패턴 검출 결과 아이템 /// public class PatternResultItem : ICloneable { /// 검출 시간 public string Time { get; set; } /// FOV ID public string FovId { get; set; } /// 패턴 ID public string PatternId { get; set; } /// 패턴 이름 public string PatternName { get; set; } /// 패턴 타입 public string PatternType { get; set; } /// 패턴 검출 이미지 좌표 X public double IX { get; set; } /// 패턴 검출 이미지 좌표 Y public double IY { get; set; } /// 패턴 검출 자재 좌표 X public double SX { get; set; } /// 패턴 검출 자재 좌표 Y public double SY { get; set; } /// 패턴 검출 각도 public double Angle { get; set; } /// 패턴 검출 점수 public double Score { get; set; } /// 패턴 검출 수행 시간 public double TactTime { get; set; } /// 패턴 검출 상태 public string Status { get; set; } /// /// 파라미터 복제(PatternResultItem) /// /// PatternResultItem public object Clone() { return new PatternResultItem() { Time = this.Time, FovId = this.FovId, PatternId = this.PatternId, PatternName = this.PatternName, PatternType = this.PatternType, IX = this.IX, IY = this.IY, SX = this.SX, SY = this.SY, Angle = this.Angle, Score = this.Score, TactTime = this.TactTime, Status = this.Status }; } } /// /// 패턴 검출 결과 아이템 매니저 /// public class PatternResultItemManager : ItemManagerBase { private static readonly object _Lock = new object(); private static readonly Logger _VisionLog = new Logger("PatternResult", VisionKeys.LogKey); /// /// 패턴 검출 결과를 패턴 검출 아이템으로 변환한다. /// /// 서브 시스템 키 정보 /// 패턴 검출 결과 /// 패턴 검출 아이템 public static PatternResultItem GetPatternResultItem(SubSysInfo subSysInfo, PatternResult patternResult) { double ix = 0; double iy = 0; double sx = 0; double sy = 0; double angle = 0; double score = 0; foreach (BaseResult result in patternResult.Results) { SetBaseResultParams(patternResult, result, ref ix, ref iy, ref sx, ref sy, ref angle, ref score); break; } lock (_Lock) { return new PatternResultItem() { Time = GetTimeStamp(subSysInfo, patternResult), FovId = patternResult.FovId.ToString(), PatternId = $"{patternResult.PatternIndex.PatternId}_{patternResult.PatternIndex.PatternSubId}", PatternName = patternResult.PatternName, PatternType = GetSimpePatternType(patternResult.PatternType), IX = ix, IY = iy, SX = CoordUnitValueConverter.GetCoordUnitValue(sx), SY = CoordUnitValueConverter.GetCoordUnitValue(sy), Angle = angle, Score = score, TactTime = patternResult.TactTimeInMilliSec, Status = GetSimpleStatus(patternResult.Status) }; } } private static void SetBaseResultParams( PatternResult patternResult, BaseResult result, ref double ix, ref double iy, ref double sx, ref double sy, ref double angle, ref double score) { try { _VisionLog.W("[START]"); _VisionLog.I($"PatternName : {patternResult.PatternName}"); _VisionLog.I($"PatternType : {patternResult.PatternType}"); _VisionLog.I($"PatternId : {patternResult.PatternIndex.PatternId}_{patternResult.PatternIndex.PatternSubId}"); if (patternResult.Status != eFoundStatus.NotFound) { ix = result.ImagePosition.X; iy = result.ImagePosition.Y; sx = result.MaterialPosition.X; sy = result.MaterialPosition.Y; _VisionLog.I($"I({ix:F1}, {iy:F1})"); _VisionLog.I($"W({sx:F3}, {sy:F3})"); switch (patternResult.PatternType) { case ePatternType.ImageModelFinder: angle = result.Angle.Degree; _VisionLog.I($"Angle : {angle}"); score = (result as ModelFinderResult).Score; _VisionLog.I($"Score : {score}"); break; case ePatternType.PatternMatching: angle = result.Angle.Degree; _VisionLog.I($"Angle : {angle}"); score = (result as PatternMatchingResult).Score; _VisionLog.I($"Score : {score}"); break; case ePatternType.ShapeModelFinder: // Shape -> Angle (X) score = (result as ModelFinderResult).Score; // Shape는 ModelFinder로 캐스팅. _VisionLog.I($"Score : {score}"); break; case ePatternType.LineFinder: angle = result.Angle.Degree; _VisionLog.I($"Angle : {angle}"); // Line -> Score (X) break; } _VisionLog.I($"TactTimeInMilliSec : {patternResult.TactTimeInMilliSec} ms"); } _VisionLog.I($"Status : {patternResult.Status}"); _VisionLog.W("[END]"); } catch (Exception) { } } private static string GetSimpePatternType(ePatternType patternType) { switch (patternType) { case ePatternType.ImageModelFinder: return "Model"; case ePatternType.PatternMatching: return "Patten"; case ePatternType.ShapeModelFinder: return "Shape"; case ePatternType.LineFinder: return "Line"; case ePatternType.EdgeFinder: return "Edge"; } return patternType.ToString(); } private static string GetSimpleStatus(eFoundStatus status) { if (status == eFoundStatus.FoundOK) { return "OK"; } else { return "NG"; } } } }