/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora.Api; using CogCommon; using VisionCommon; using Hermes; using Cognex.VisionPro; using Cognex.VisionPro.Caliper; using System; using System.IO; using System.Drawing; using System.Collections.Generic; namespace CogPattern { /// /// Caliper 클래스 /// public class Caliper : PatternBase, IPatternFinder, IDisposable { /// public string FILE_EXT_PATTERN { get; set; } = "_Caliper.vpp"; private readonly Logger _logger; private readonly PatternInfo _patternInfo; private CogCaliperTool _CogCaliperTool; /// /// Caliper 생성자 /// /// 패턴 정보 public Caliper(PatternInfo patternInfo) { _patternInfo = patternInfo; _logger = new Logger( $"Caliper_{patternInfo.GetPatternIndex()}"); Init(); } private void Init() { if (E1.OK != Load()) { Create(); } } /// /// 패턴의 경로 가져오기 /// /// 문자열 public string GetPatternFilePath(string patternName = PatternConstants.FILE_NAME_PATTERN) { return Path.Combine(new string[] { PatternConstants.GetSubPatternDirPath(_patternInfo), patternName + FILE_EXT_PATTERN }); } /// /// 캘리퍼 불러오기 /// /// 성공유무 public int Load() { var patternFilePath = GetPatternFilePath(); if (!File.Exists(patternFilePath)) { _logger.I($"Pattern File does NOT exist : {patternFilePath}"); return E2.NOT_FOUND; } _CogCaliperTool = CogMeasureWidth.LoadTool(patternFilePath); return E1.OK; } /// /// 캘리퍼 저장 /// /// 성공유무 public int Save() { var patternFilePath = GetPatternFilePath(); var patternDirPath = Path.GetDirectoryName(patternFilePath); if (!Directory.Exists(patternDirPath)) { Directory.CreateDirectory(patternDirPath); } return CogMeasureWidth.SaveTool(_CogCaliperTool, patternFilePath); } /// /// 캘리퍼 생성 /// /// 성공유무 public int Create() { FreeTool(); _CogCaliperTool = CogMeasureWidth.CreateTool(); return E1.OK; } /// /// 캘리퍼 제거 /// /// 성공유무 public int Remove() { FreeTool(); var patternFilePath = GetPatternFilePath(); var patternDirPath = Path.GetDirectoryName(patternFilePath); if (Directory.Exists(patternDirPath)) { Directory.Delete(patternDirPath, recursive: true); } return E1.OK; } /// /// ROI 가져오기 /// /// ROI public ROI GetFindROI() { return CogMeasureWidth.GetFindROI(_CogCaliperTool); } /// /// ROI 설정 /// /// ROI /// 성공유무 public int SetFindROI(ROI findRoi) { return CogMeasureWidth.SetFindROI(_CogCaliperTool, findRoi); } /// /// 실행인자 가져오기 /// /// IRunParam public IRunParam GetRunParam() { return CogMeasureWidth.GetRunParam(_CogCaliperTool); } /// /// 실행인자 설정하기 /// /// 실행인자 /// 성공유무 public int SetRunParam(IRunParam runParam) { return CogMeasureWidth.SetRunParam(_CogCaliperTool, runParam); } /// /// 패턴 찾기 /// /// 이미지 /// 패턴결과 public PatternResult Find(object image) { return CogMeasureWidth.Find(_CogCaliperTool, (ICogImage)image); } /// /// 패턴 찾기 /// /// 이미지 /// ROI영역 /// PatternResult public PatternResult Find(object image, ROI findRoi) { return CogMeasureWidth.Find(_CogCaliperTool, (ICogImage)image, findRoi); } /// /// 결과없음 가져오기 /// /// PatternResult public PatternResult GetNotFoundPatternResult() { return CogMeasureWidth.GetNotFoundPatternResult(); } /// /// 캘리퍼 object로 가져오기 /// /// object public object GetTool() { return _CogCaliperTool; } /// /// 결과 그리기 /// /// 패턴결과 /// Display /// 픽스쳐 여무 public void Draw( PatternResult patternResult, ICameraDisplay cameraDisplay, bool isFixturePattern = false) { CogMeasureWidth.Draw(_CogCaliperTool, patternResult, cameraDisplay as ICogCameraDisplay); } /// /// 썸네일 가져오기 /// /// 비트맵 public Bitmap GetThumbnail() { try { var offsets = new List() { new ImagePoint(0, 5), new ImagePoint(0, -5) }; var imageSize = ThumbnailUtil.GetImageSize(); var center = new ImagePoint(imageSize.Width / 2, imageSize.Height / 2); var thumnailImage = new Bitmap( imageSize.Width, imageSize.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); var pen = new Pen(new SolidBrush(Color.FromKnownColor(KnownColor.White)), 3); var findRoi = GetFindROI(); using (var graphics = Graphics.FromImage(thumnailImage)) { for (int i = 0; i < 2; i++) { var lineStart = MathUtil.Rotate(new ImagePoint(0, (int)center.Y + offsets[i].Y), findRoi.Angle, center); var lineEnd = MathUtil.Rotate(new ImagePoint(imageSize.Width, (int)center.Y + offsets[i].Y), findRoi.Angle, center); graphics.DrawLine( pen, new Point((int)lineStart.X, (int)lineStart.Y), new Point((int)lineEnd.X, (int)lineEnd.Y)); } } return thumnailImage; } catch (Exception e) { _logger.FuncE(e.Message); } return ThumbnailUtil.GetDefaultImage(); } #region IDisposible /// /// 자원 회수 /// public void Dispose() { FreeTool(); } private void FreeTool() { CogMeasureWidth.FreeTool(_CogCaliperTool); } #endregion } }