/* * 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; namespace CogPattern { /// /// LineFinder 클래스 /// public class LineFinder : PatternBase, IPatternFinder, IDisposable { /// public string FILE_EXT_PATTERN { get; set; } = "_FindLine.vpp"; private readonly Logger _logger; private readonly PatternInfo _patternInfo; private CogFindLineTool _CogFindLineTool; /// /// LineFinder 생성자 /// /// 패턴 정보 public LineFinder(PatternInfo patternInfo) { _patternInfo = patternInfo; _logger = new Logger( $"LineFinder_{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; } _CogFindLineTool = CogMeasureLine.LoadTool(patternFilePath); return E1.OK; } /// /// 라인파인더 저장 /// /// 성공여부 public int Save() { var patternFilePath = GetPatternFilePath(); var patternDirPath = Path.GetDirectoryName(patternFilePath); if (!Directory.Exists(patternDirPath)) { Directory.CreateDirectory(patternDirPath); } return CogMeasureLine.SaveTool(_CogFindLineTool, patternFilePath); } /// /// 라인파인더 툴 생성 /// /// 성공여부 public int Create() { FreeTool(); _CogFindLineTool = CogMeasureLine.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 CogMeasureLine.GetFindROI(_CogFindLineTool); } /// /// ROI 설정 /// /// ROI 정보 /// 성공여부 public int SetFindROI(ROI findRoi) { return CogMeasureLine.SetFindROI(_CogFindLineTool, findRoi); } /// /// 실행인자 가져오기 /// /// 실행인자 public IRunParam GetRunParam() { return CogMeasureLine.GetRunParam(_CogFindLineTool); } /// /// 실행인자 설정 /// /// 실행인자 /// 성공여부 public int SetRunParam(IRunParam runParam) { return CogMeasureLine.SetRunParam(_CogFindLineTool, runParam); } /// /// 패턴 찾기 /// /// 이미지 /// 패턴결과 public PatternResult Find(object image) { return CogMeasureLine.Find(_CogFindLineTool, (ICogImage)image); } /// /// 패턴 찾기 /// /// 이미지 /// ROI 영역 /// 패턴 결과 public PatternResult Find(object image, ROI findRoi) { return CogMeasureLine.Find(_CogFindLineTool, (ICogImage)image, findRoi); } /// /// 결과 없음 가져오기 /// /// PatternResult public PatternResult GetNotFoundPatternResult() { return CogMeasureLine.GetNotFoundPatternResult(); } /// /// 라인툴 가져오기 /// /// object public object GetTool() { return _CogFindLineTool; } /// /// 패턴 그리기 /// /// 패턴 결과 /// Display /// 픽스처 여부 public void Draw( PatternResult patternResult, ICameraDisplay cameraDisplay, bool isFixturePattern = false) { CogMeasureLine.Draw(_CogFindLineTool, patternResult, cameraDisplay as ICogCameraDisplay); CogMeasureLine.DrawCaliperROI(_CogFindLineTool, cameraDisplay as ICogCameraDisplay, patternResult.FindRoi); } /// /// 썸네일 가져오기 /// /// 비트맵 public Bitmap GetThumbnail() { try { var imageSize = ThumbnailUtil.GetImageSize(); var thumnailImage = new Bitmap( imageSize.Width, imageSize.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); var findRoi = GetFindROI(); var center = new ImagePoint(imageSize.Width / 2, imageSize.Height / 2); using (var graphics = Graphics.FromImage(thumnailImage)) { var pen = new Pen(new SolidBrush(Color.FromKnownColor(KnownColor.White)), 3); var lineStart = MathUtil.Rotate(new ImagePoint(0, (int)center.Y), findRoi.Angle, center); var lineEnd = MathUtil.Rotate(new ImagePoint(imageSize.Width, (int)center.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() { CogMeasureLine.FreeTool(_CogFindLineTool); } #endregion } }