135 lines
5.8 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|