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