using Aurora; using System.Reactive.Linq; using System; using System.Windows; using Aurora.Api; using System.Collections.ObjectModel; using System.Windows.Input; using Aurora.View; using VisionCommon; using VisionSequence.Setup; using VisionCommonUI; using VisionCommonUI.Resources; using Aurora.Util.HislogPlus; using System.Collections.Generic; namespace VisionUI.Setup { /// /// 오토 포커스 뷰 모델 /// public class AutoFocusViewModel : Aurora.View.NotifyPropertyChangedBase, IUpdateRecipe { private Logger _Logger; private ISequence _Seq; private FovInfo _FovInfo; private FovRecipe _FovRecipe; private CsvManager _CsvManager = new CsvManager(); #region Binding Properties /// 오토포커스 로그 아이템 컬렉션 public ObservableCollection AutoFocusLogItems { get; set; } = new ObservableCollection(); /// 오토포커스 로그 아이템 컬렉션(Roughly) public ObservableCollection AutoFocusLogItems_Roughly { get; set; } = new ObservableCollection(); /// 오토포커스 로그 아이템 컬렉션(Delicately) public ObservableCollection AutoFocusLogItems_Delicately { get; set; } = new ObservableCollection(); private AutoFocusRecipe _AutoFocusRecipe; /// 오토포커스 레시피 public AutoFocusRecipe AutoFocusRecipe { get => _AutoFocusRecipe; set => SetProperty(ref _AutoFocusRecipe, value); } private DateTime selectedDate; /// 선택된 날짜 public DateTime SelectedDate { get => selectedDate; set { SetProperty(ref selectedDate, value); CalendarChanged(value); } } #endregion #region Button Commands public ICommand ButtonCommandSetFindRoi { get; set; } public ICommand ButtonCommandStart { get; set; } public ICommand ButtonCommandCancel { get; set; } public ICommand ButtonCommandSaveParams { get; set; } #endregion /// /// 생성자 /// /// Fov 정보 public AutoFocusViewModel(FovInfo fovInfo) { _FovInfo = fovInfo; _FovRecipe = VisionRecipeManager.GetFovRecipe(_FovInfo); _Logger = new Logger(string.Format("AutoFocusViewModel[{0}]", fovInfo.SubSysName)); ButtonCommandSetFindRoi = new DelegateCommand(new Action(DoSetFindRoi)); ButtonCommandStart = new DelegateCommand(new Action(DoStart)); ButtonCommandCancel = new DelegateCommand(new Action(DoCancel)); ButtonCommandSaveParams = new DelegateCommand(new Action(DoSaveParams)); SelectedDate = DateTime.Now.Date; UpdateRecipeFromFile(); SetObservable(); } private void SetObservable() { VisionEnv.AuroraEnv.EventObservable.AsObservable(VisionEventId.CLEAR_AUTO_FOCUS_LOG). Where(x => x.From == _FovInfo.GetKey()).Subscribe(_ => ClearAutoFocusLog()); VisionEnv.AuroraEnv.EventObservable.AsObservable(VisionEventId.UPDATE_AUTO_FOCUS_LOG). Where(x => x.From == _FovInfo.GetKey()).Subscribe(autoFocusLog => UpdateAutoFocusLog(autoFocusLog)); } /// /// 오토포커스 로그 클리어 /// public void ClearAutoFocusLog() { Application.Current.Dispatcher.BeginInvoke( new Action(() => { AutoFocusLogItems.Clear(); AutoFocusLogItems_Roughly.Clear(); AutoFocusLogItems_Delicately.Clear(); })); } /// /// 오토포커스 로그 업데이트 /// /// 이벤트 메세지 public void UpdateAutoFocusLog(EventMessage msg) { Application.Current.Dispatcher.BeginInvoke( new Action(() => { var log = msg.Param as AutoFocusLog; AutoFocusLogItems.Add(log); if(log.Mode == eFocusMode.Roughly.ToString()) { AutoFocusLogItems_Roughly.Add(log); } else if(log.Mode == eFocusMode.Delicately.ToString()) { AutoFocusLogItems_Delicately.Add(log); } })); } /// /// 찾는 ROI 등록 /// /// null public void DoSetFindRoi(object display = null) { AddSharpnessROI(); } /// /// 오토포커스 시퀀스 시작 /// /// null public void DoStart(object display = null) { if (AutoFocusRecipe == null) { MessageBoxUtil.ShowMessageBoxError( string.Format(StrTokens.MSG_E_AutoFocusRecipeIsNull)); return; } AutoFocusLogItems.Clear(); AutoFocusLogItems_Roughly.Clear(); AutoFocusLogItems_Delicately.Clear(); SetSharpnessRoi(); _Seq = Application.Current.AuroraEnv().SequenceEntry[VisionKeys.AutoFocusSeqKey]; _Seq?.Start(new SetupSeqParams_AutoFocus(_FovInfo, AutoFocusRecipe), OnCompleted); } /// /// 선명도 ROI 추가 /// public void AddSharpnessROI() { try { if (AutoFocusRecipe == null) { _Logger.FuncW("AutoFocusRecipe is null."); return; } var cameraDisplay = CameraDisplayManager.GetDisplay(_FovInfo, eDisplayType.AutoFocus); cameraDisplay.AddFindRoi(AutoFocusRecipe.SharpnessRoi, false, eColor.Orange); } catch (Exception e) { _Logger.FuncE("{0}", e.Message); } } private void UpdateSharpnessRoi() { var cameraDisplay = CameraDisplayManager.GetDisplay(_FovInfo, eDisplayType.AutoFocus); AutoFocusRecipe.SharpnessRoi = cameraDisplay.GetFindRoi(); if (AutoFocusRecipe.SharpnessRoi.Width == 0 && AutoFocusRecipe.SharpnessRoi.Height == 0) { AutoFocusRecipe.SharpnessRoi.CenterX = 1000; AutoFocusRecipe.SharpnessRoi.CenterY = 1000; AutoFocusRecipe.SharpnessRoi.Width = 200; AutoFocusRecipe.SharpnessRoi.Height = 300; } var autoFocusRecipe = VisionRecipeManager.GetAutoFocusRecipe(_FovInfo); AutoFocusRecipe.CopyTo(autoFocusRecipe); } private void SetSharpnessRoi() { var milCameraDisplay = CameraDisplayManager.GetDisplay(_FovInfo, eDisplayType.AutoFocus); AutoFocusRecipe.SharpnessRoi = milCameraDisplay.GetFindRoi(); } /// /// 오토포커스 시퀀스 완료후 작업내용 이벤트 핸들러 /// /// 오토포커스 시퀀스 완료 결과 private void OnCompleted(SequenceActionResult seqResult) { UpdateAutoFocusParams(seqResult.Param as SetupSeqResultParams_AutoFocus); } /// /// 시퀀스 정지 /// /// public void DoCancel(object display = null) { _Seq?.Stop(); //CancelSequence.Invoke(this, new EventArgs()); } /// /// 세이브 파라미터 /// /// null public void DoSaveParams(object display = null) { UpdateRecipeFromUI(); RecipeFileManager.SaveVisionRecipe(); } /// /// 오토포커스 파라미터들 업데이트 /// 최적의 Step | Sharpness | BestPosZ /// /// 오토포커스 셋업 시퀀스 결과 파라미터 public void UpdateAutoFocusParams(SetupSeqResultParams_AutoFocus autoFocusResult) { AutoFocusRecipe.BestStep = autoFocusResult.BestStep; AutoFocusRecipe.BestSharpness = autoFocusResult.BestSharpness; AutoFocusRecipe.BestPos = autoFocusResult.BestPosZ; } /// /// 현재 시간 기준으로 CSV 불러오기 /// public void LoadCsvNow() { DateTime dateTime = DateTime.Now; LoadCsv(dateTime); } private void CalendarChanged(DateTime dateTime) { LoadCsv(dateTime); } private void LoadCsv(DateTime dateTime) { try { AutoFocusLogItems.Clear(); AutoFocusLogItems_Roughly.Clear(); AutoFocusLogItems_Delicately.Clear(); List items = _CsvManager.LoadCsv(_FovInfo.ToSubSysInfo(), dateTime, eSaveDataType.AutoFocus); if (items != null) { foreach (AutoFocusLog item in items) { AutoFocusLogItems.Add(item); } } } catch (Exception e) { _Logger.FuncE(e.Message); } } public void RefreshVisionRecipes() { _FovRecipe = VisionRecipeManager.GetFovRecipe(_FovInfo); UpdateRecipeFromFile(); } public void UpdateRecipeFromFile() { var autoFocusRecipe = VisionRecipeManager.GetAutoFocusRecipe(_FovInfo); AutoFocusRecipe = autoFocusRecipe.Clone(); } public void UpdateRecipeFromUI() { UpdateSharpnessRoi(); } } }