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 {
///
/// 패턴 Distance 로그 뷰 모델
///
public class PatternDistanceLogViewModel : NotifyPropertyChangedBase {
private Logger _Logger = new Logger(typeof(PatternDistanceLogViewModel).Name);
private ObservableCollection patternDistanceResultItems;
public ObservableCollection PatternDistanceResultItems { get => patternDistanceResultItems; set => SetProperty(ref patternDistanceResultItems, 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 PatternDistanceLogViewModel(SubSysInfo subSysInfo) {
_SubSysInfo = subSysInfo;
_SubSysRecipe = VisionRecipeManager.GetSubSysRecipe(_SubSysInfo);
PatternDistanceResultItems = new ObservableCollection();
SelectedDate = DateTime.Now.Date;
SetObservable();
}
private void SetObservable() {
VisionEnv.AuroraEnv.EventObservable.AsObservable(VisionEventId.UPDATE_PATTERN_DISTANCE_RESULTS).
Where(x => x.From == _SubSysInfo.GetKey()).Subscribe(patternDistanceResult => UpdatePatternDistanceResults(patternDistanceResult));
}
///
/// 패턴 Distance 결과값 업데이트
///
/// 이벤트 메세지
public void UpdatePatternDistanceResults(EventMessage msg) {
var patternDistanceResults = msg.Param as List;
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 patternDistanceResults) {
var fovInfo = VisionRecipeManager.GetLastFovInfo(_SubSysInfo);
var cameraDisplay = CameraDisplayManager.GetDisplay(fovInfo);
var colorTestList = new List();
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 items =
_CsvManager.LoadCsv(_SubSysInfo, dateTime, eSaveDataType.PatternDistance);
if (items != null) { // 로드할 파일이 없으면 items가 null임.
foreach (PatternDistanceResultItem item in items) {
PatternDistanceResultItems.Add(item);
}
}
}
catch (Exception e) {
_Logger.FuncE(e.Message);
}
}
}
}