/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora.Api; using MilCommon; using VisionCommon; using Hermes; using Matrox.MatroxImagingLibrary; using System; using System.IO; using System.Drawing; using VisionCommonUI; namespace MilPattern { public class Code : PatternBase, IPatternFinder, IDisposable { public string FILE_EXT_PATTERN { get; set; } = ".mco"; private CodeParamExt _paramExt = null; private Logger _logger; private PatternInfo _patternInfo; private MIL_ID _contextId = MIL.M_NULL; private MIL_ID _resultContextId = MIL.M_NULL; public Code(PatternInfo patternInfo) { _patternInfo = patternInfo; _logger = new Logger( $"Code_{patternInfo.GetPatternIndex()}"); InitContext(); } private void InitContext() { if (E1.OK != Load()) { Create(); } } #region IPatternFinder 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; } FreeContexts(); _contextId = MilCodeRead.LoadContext(_patternInfo.MilSystemId, patternFilePath); _resultContextId = MilCodeRead.CreateResultContext(_contextId); _paramExt = LoadParamExt(); return E1.OK; } public int Save() { var patternFilePath = GetPatternFilePath(); var patternDirPath = Path.GetDirectoryName(patternFilePath); if (!Directory.Exists(patternDirPath)) { Directory.CreateDirectory(patternDirPath); } SaveParamExt(_paramExt); return MilCodeRead.SaveContext(_contextId, patternFilePath); } public int Create() { FreeContexts(); _contextId = MilCodeRead.CreateContext(_patternInfo.MilSystemId); _resultContextId = MilCodeRead.CreateResultContext(_contextId); _paramExt = LoadParamExt(); return E1.OK; } public int Remove() { FreeContexts(); var patternFilePath = GetPatternFilePath(); var patternDirPath = Path.GetDirectoryName(patternFilePath); if (Directory.Exists(patternDirPath)) { Directory.Delete(patternDirPath, recursive: true); } return E1.OK; } public ROI GetFindROI() { return _paramExt.FindROI; } public int SetFindROI(ROI findRoi) { if (ROI.IsNullOrEmpty(findRoi)) { return E1.GENERIC; } _paramExt.FindROI = findRoi.Clone() as ROI; return E1.OK; } public IRunParam GetRunParam() { var runParam = MilCodeRead.GetRunParam(_contextId); runParam.CodeParamExt = _paramExt.Clone() as CodeParamExt; return runParam; } public int SetRunParam(IRunParam runParam) { FreeContexts(); Create(); _paramExt = ((CodeRunParam)runParam).CodeParamExt.Clone() as CodeParamExt; return MilCodeRead.SetRunParam(_contextId, runParam); } public PatternResult Find(object image) { return Find((MIL_ID)image, _paramExt.FindROI); } public PatternResult Find(object image, ROI findRoi) { MIL_ID cropImage = MIL.M_NULL; var patternResult = new PatternResult() { Status = eFoundStatus.NotFound }; try { if (!ROI.IsNullOrEmpty(findRoi)) { cropImage = MilEnvironment.CropImage((MIL_ID)image, findRoi); patternResult = MilCodeRead.Find(_contextId, _resultContextId, cropImage, _paramExt); if (patternResult.Status != eFoundStatus.NotFound) { var imageCenter = MilEnvironment.GetImageCenter((MIL_ID)image); foreach (CodeResult result in patternResult.Results) { result.ImagePosition = result.ImagePosition + findRoi.LeftTop as ImagePoint; result.Offset = result.ImagePosition - imageCenter as ImagePoint; } } } } catch (Exception e) { _logger.E(e.Message); } finally { MilEnvironment.FreeImage(cropImage); } return patternResult; } public PatternResult GetNotFoundPatternResult() { return MilCodeRead.GetNotFoundPatternResult(); } public object GetTool() { return _contextId; } public void Draw( PatternResult patternResult, ICameraDisplay cameraDisplay, bool isFixturePattern = false) { MilCodeRead.Draw(patternResult, cameraDisplay as IMilCameraDisplay); } public Bitmap GetThumbnail() { return ThumbnailImage.Code(); } #endregion #region IDisposible public void Dispose() { FreeContexts(); } private void FreeContexts() { MilCodeRead.FreeContext(_contextId); MilCodeRead.FreeContext(_resultContextId); _contextId = MIL.M_NULL; _resultContextId = MIL.M_NULL; } #endregion #region Code Specific internal CodeParamExt LoadParamExt() { return CodeParamExt.Load(PatternConstants.GetSubPatternDirPath(_patternInfo)); } internal int SaveParamExt(CodeParamExt codeParamExt) { return CodeParamExt.Save( PatternConstants.GetSubPatternDirPath(_patternInfo), codeParamExt); } #endregion } }