/*
* 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);
}
}
}
}