/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora.Api; using Aurora.View; using VisionCommon; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Reactive.Linq; using System.Threading.Tasks; using System.Windows; using VisionInspector; using System.Reactive.Disposables; namespace VisionUI.Inspector { /// /// 어태치 검사 로그 뷰 모델 /// public class AttachInspLogViewModel : NotifyPropertyChangedBase { private Logger _Logger = new Logger(typeof(AttachInspLogViewModel).Name); private ObservableCollection _AttachInspResultItems; /// 어태치 검사 결과 아이템 집합 public ObservableCollection AttachInspResultItems { get => _AttachInspResultItems; set => SetProperty(ref _AttachInspResultItems, value); } private DateTime selectedDate; /// 선택된 날짜 public DateTime SelectedDate { get => selectedDate; set { SetProperty(ref selectedDate, value); CalendarChanged(value); } } private SubSysInfo _SubSysInfo; private SubSysRecipe _SubSysRecipe; private CsvManager _CsvManager = new CsvManager(); /// /// 생성자 /// /// 서브시스템 정보 public AttachInspLogViewModel(SubSysInfo subSysInfo) { _SubSysInfo = subSysInfo; _SubSysRecipe = VisionRecipeManager.GetSubSysRecipe(_SubSysInfo); AttachInspResultItems = new ObservableCollection(); SelectedDate = DateTime.Now.Date; SetObservable(); } private void SetObservable() { var disposable = VisionEnv.AuroraEnv.EventObservable.AsObservable(VisionEventId.UPDATE_ATTACH_INSP_RESULT). Where(x => x.From == _SubSysInfo.GetKey()).Subscribe(attachInspResult => UpdateAttachInspResult(attachInspResult)); DisposableManager.AddDisposable(eDpsGroupKey.SubMenu_AttachInsp, disposable); } /// /// 어태치 검사 결과 업데이트 /// /// 이벤트 메세지 public void UpdateAttachInspResult(EventMessage msg) { var attachInspResult = msg.Param as AttachInspResult; Application.Current.Dispatcher.BeginInvoke( new Action(() => { AttachInspResultItems.Add(AttachInspResultItemManager.GetAttachInspResultItem(_SubSysInfo, attachInspResult)); })); // Dispatcher에 같이 넣을 경우, 전체적으로 느려질 수 있음 Task.Run(() => { PrintAttachInspResult(attachInspResult); }); } // 부착 검사 결과를 화면에 텍스트로 뿌린다. private void PrintAttachInspResult(AttachInspResult attachInspResult) { var displayType = attachInspResult.DisplayType; //var fovInfo = VisionRecipeManager.GetLastFovInfo(_SubSysInfo); var fovInfo = VisionRecipeManager.GetFovInfo(_SubSysInfo, attachInspResult.FovId); var cameraDisplay = CameraDisplayManager.GetDisplay(fovInfo, displayType); var msgs = new List(); msgs.Add(string.Format("FovId : {0}", attachInspResult.FovId)); msgs.Add(string.Format("MeasureW : {0:F3}", ConvertCoordUnit(attachInspResult.MeasureW))); msgs.Add(string.Format("SpecW : {0}", ConvertCoordUnit(attachInspResult.SpecW))); msgs.Add(string.Format("ErrW : {0:F3}", ConvertCoordUnit(attachInspResult.ErrW))); msgs.Add(string.Format("MeasureH : {0:F3}", ConvertCoordUnit(attachInspResult.MeasureH))); msgs.Add(string.Format("SpecH : {0}", ConvertCoordUnit(attachInspResult.SpecH))); msgs.Add(string.Format("ErrH : {0:F3}", ConvertCoordUnit(attachInspResult.ErrH))); msgs.Add(string.Format("Status : {0}", attachInspResult.InspStatus)); eColor color = IpViewManager.GetGraphicColor(attachInspResult.InspStatus); ImagePoint printPos = new ImagePoint(30, 20); cameraDisplay.AddTextList(color, printPos, msgs); } private double ConvertCoordUnit(double value) { if (VisionSettingManager.VisionSetting.CoordUnit == eCoordUnit.UM) { return MathUtil.ConvertUnitMilliToMicro(value); } return value; } private void CalendarChanged(DateTime dateTime) { LoadCsv(dateTime); } private void LoadCsv(DateTime dateTime) { try { AttachInspResultItems?.Clear(); List items = _CsvManager.LoadCsv(_SubSysInfo, dateTime, eSaveDataType.AttachInsp); if (items != null) { // 로드할 파일이 없으면 items가 null임. foreach (AttachInspResultItem item in items) { AttachInspResultItems.Add(item); } } } catch (Exception e) { _Logger.FuncE(e.Message); } } } }