/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora; using Aurora.Api; using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows; using VisionCommon; using VisionCalibrator; using VisionSequence.Setup; using System.Linq; using System.Reactive.Linq; using VisionCommonUI; using VisionCommonUI.Resources; using System.Reactive.Disposables; namespace VisionUI.Setup { /// /// 캘리브레이션 뷰 모델 /// class CalViewModel : INotifyPropertyChanged { private Logger Log = new Logger("CalViewModel"); private ISequence _CalSeq; private SubSysInfo _SubSysInfo; private List _CalItems; public event PropertyChangedEventHandler PropertyChanged; /// 캘리브레이션 세팅 뷰 모델 public CalSettingViewModel _CalSettingViewModel; /// 캘리브레이션 로그 뷰 모델 public CalLogViewModel _CalLogViewModel; /// 캘리브레이션 파라미터 뷰 모델 public CalParamViewModel _CalParamViewModel; /// /// 생성자 /// /// 서브시스템 정보 public CalViewModel(SubSysInfo subSysInfo) { _SubSysInfo = subSysInfo; _CalItems = new List(); var disposable = VisionEnv.AuroraEnv.EventObservable.AsObservable(VisionEventId.UPDATE_CAL_SUB_SEQ_LOG) //.Select(msg => ((ValueTuple)msg.Param)) .Select(msg => msg.Param) .ObserveOnDispatcher() .Subscribe(x => UpdateLog((PlanItem)x)); DisposableManager.AddDisposable(eDpsGroupKey.SubMenu_Calibration, disposable); } /// /// 캘리브레이션 세팅 뷰 모델 설정(할당 및 이벤트 연결) /// /// 캘리브레이션 세팅 뷰 모델 public void SetCalSettingViewModel(CalSettingViewModel calSettingViewModel) { _CalSettingViewModel = calSettingViewModel; _CalSettingViewModel.CalPlanCreated += PlanCreated; _CalSettingViewModel.CancelSequence += SequenceStop; } /// /// 캘리브레이션 로그 뷰 모델 설정(할당) /// /// 캘리브레이션 로그 뷰 모델 public void SetCalLogViewModel(CalLogViewModel calLogViewModel) { _CalLogViewModel = calLogViewModel; } /// /// 캘리브레이션 파라미터 뷰 모델 설정(할당) /// /// 캘리브레이션 파라미터 뷰 모델 public void SetCalParamViewModel(CalParamViewModel calParamViewModel) { _CalParamViewModel = calParamViewModel; } private void UpdateLog(PlanItem item) { if(_CalLogViewModel != null) { var planItem = item.Clone(); if (VisionSettingManager.VisionSetting.CoordUnit == eCoordUnit.UM) { planItem.X = $"{MathUtil.ConvertUnitMilliToMicro(Double.Parse(planItem.X))}"; planItem.Y = $"{MathUtil.ConvertUnitMilliToMicro(Double.Parse(planItem.Y))}"; } Application.Current.Dispatcher.Invoke(() => _CalLogViewModel.PlanListItems.Add(planItem)); UpdateCsvLog(planItem); } } private void PlanCreated(object sender, CalSeqParams e) { _CalLogViewModel.PlanListItems.Clear(); ClearCsvLog(); var InitParam = e; CalSeqParams calProcSeqParam = new CalSeqParams(); calProcSeqParam.SubSysInfo = InitParam.SubSysInfo; calProcSeqParam.DisplayType = InitParam.DisplayType; calProcSeqParam.PlanItems = InitParam.PlanItems.ToList(); calProcSeqParam.CalSetupRecipe = InitParam.CalSetupRecipe; _CalSeq = VisionEnv.AuroraEnv.SequenceEntry[VisionKeys.CalSeqKey]; _CalSeq?.Start(calProcSeqParam, OnCompleted); } private void OnCompleted(SequenceActionResult SeqResult) { if (SeqResult.Param == null) { MessageBoxUtil.ShowMessageBoxError( string.Format(StrTokens.MSG_E_CalSeqStop)); return; } var results = SeqResult.Param as CalCalculateResultParams; if (results.Results.Count > 0) { _CalParamViewModel.SetCalResult(results.Results, _CalSettingViewModel.CalSetupRecipe); SaveCsvLog(); } else { MessageBoxUtil.ShowMessageBoxError( string.Format(StrTokens.MSG_E_CalCalculationStop)); } } private void ClearCsvLog() { _CalItems.Clear(); } private void UpdateCsvLog(PlanItem item) { _CalItems.Add(CalItemManager.GetCalItem(_SubSysInfo, item)); } private void SaveCsvLog() { var csvManager = new CsvManager(); csvManager.SaveCsv(_SubSysInfo, _CalItems, eSaveDataType.Calibration); } private void SequenceStop(object sender, EventArgs e) { if (_CalSeq == null) return; _CalSeq.EmergencyStop(); } private void NotifyPropertyChanged(string propName) { PropertyChanged?.Invoke( this, new PropertyChangedEventArgs(propName)); } } }