Kyungshin-Welder/AuroraVision/VisionUI/Aligner/PatternDistanceLogViewModel.cs
2026-01-26 14:51:28 +09:00

135 lines
5.8 KiB
C#

/*
* 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 Aurora.Api.DataType;
namespace VisionUI.Aligner {
/// <summary>
/// 패턴 Distance 로그 뷰 모델
/// </summary>
public class PatternDistanceLogViewModel : NotifyPropertyChangedBase {
private Logger _Logger = new Logger(typeof(PatternDistanceLogViewModel).Name);
private ObservableCollection<PatternDistanceResultItem> patternDistanceResultItems;
public ObservableCollection<PatternDistanceResultItem> PatternDistanceResultItems { get => patternDistanceResultItems; set => SetProperty(ref patternDistanceResultItems, value); }
private DateTime selectedDate;
/// <summary>선택된 날짜</summary>
public DateTime SelectedDate { get => selectedDate; set { SetProperty(ref selectedDate, value); CalendarChanged(value); } }
private SubSysInfo _SubSysInfo;
private SubSysRecipe _SubSysRecipe;
private CsvManager _CsvManager = new CsvManager();
/// <summary>
/// 생성자
/// </summary>
/// <param name="subSysInfo">서브시스템 정보</param>
public PatternDistanceLogViewModel(SubSysInfo subSysInfo) {
_SubSysInfo = subSysInfo;
_SubSysRecipe = VisionRecipeManager.GetSubSysRecipe(_SubSysInfo);
PatternDistanceResultItems = new ObservableCollection<PatternDistanceResultItem>();
SelectedDate = DateTime.Now.Date;
SetObservable();
}
private void SetObservable() {
var disposable = VisionEnv.AuroraEnv.EventObservable.AsObservable(VisionEventId.UPDATE_PATTERN_DISTANCE_RESULTS).
Where(x => x.From == _SubSysInfo.GetKey()).Subscribe(patternDistanceResult => UpdatePatternDistanceResults(patternDistanceResult));
DisposableManager.AddDisposable(eDpsGroupKey.SubMenu_Align, disposable);
}
/// <summary>
/// 패턴 Distance 결과값 업데이트
/// </summary>
/// <param name="msg">이벤트 메세지</param>
public void UpdatePatternDistanceResults(EventMessage msg) {
var patternDistanceResults = msg.Param as List<PatternDistanceResult>;
Application.Current.Dispatcher.BeginInvoke(
new Action(() => {
foreach (PatternDistanceResult result in patternDistanceResults) {
if ((_SubSysRecipe.AlignRecipes[0].ProcParams.ProcFovType == eProcFovType.C2_F4_MV) && patternDistanceResults.Count > 1) {
if (result.StartFov == eFovId.Fov1 && result.EndFov == eFovId.Fov2) {
continue;
}
}
PatternDistanceResultItems.Add(PatternDistanceResultItemManager.GetPatternDistanceResultItem(_SubSysInfo, result));
}
}));
// Dispatcher에 같이 넣을 경우, 전체적으로 느려질 수 있음
Task.Run(() => { PrintPatternDistanceResult(patternDistanceResults); });
}
// 패턴 거리검사 결과를 화면에 텍스트로 뿌린다.
private void PrintPatternDistanceResult(List<PatternDistanceResult> patternDistanceResults) {
var fovInfo = VisionRecipeManager.GetLastFovInfo(_SubSysInfo);
var cameraDisplay = CameraDisplayManager.GetDisplay(fovInfo);
var colorTestList = new List<ColorText>();
foreach (PatternDistanceResult result in patternDistanceResults) {
eColor color = (result.InspStatus == InspStatus.NG) ? eColor.Red : eColor.Green;
string msg = string.Format(
"{0}_{1} / D : {2:F3} / E : {3:F3} / S : {4}",
result.StartFov, result.EndFov, result.Distance, result.ErrRange, result.InspStatus);
colorTestList.Add(new ColorText(color, msg));
}
var cameraAgent = CameraAgentManager.GetCameraAgent(fovInfo);
var imageSize = cameraAgent.GetImageSize();
var textPosY = GetTextPosY(imageSize, patternDistanceResults.Count);
cameraDisplay.AddColorTextList(new ImagePoint(30, textPosY), colorTestList, 75);
}
private double GetTextPosY(ImageSize imageSize, int count) {
switch (count) {
case 1:
return imageSize.Height - 75;
case 2:
return imageSize.Height - 150;
case 3:
return imageSize.Height - 225;
case 4:
return imageSize.Height - 300;
case 5:
return imageSize.Height - 375;
case 6:
default:
return imageSize.Height - 450;
}
}
private void CalendarChanged(DateTime dateTime) {
LoadCsv(dateTime);
}
private void LoadCsv(DateTime dateTime) {
try {
PatternDistanceResultItems?.Clear();
List<PatternDistanceResultItem> items =
_CsvManager.LoadCsv<PatternDistanceResultItem>(_SubSysInfo, dateTime, eSaveDataType.PatternDistance);
if (items != null) { // 로드할 파일이 없으면 items가 null임.
foreach (PatternDistanceResultItem item in items) {
PatternDistanceResultItems.Add(item);
}
}
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
}
}
}