/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora.Api; using System; using System.Windows; using System.Windows.Controls; using DevExpress.Xpf.Charts; using VisionCommon; using VisionSequence.Setup; using System.Reactive.Linq; using System.Reactive.Disposables; namespace VisionUI.Setup { /// /// 오토포커스 뷰 /// AutoFocusView.xaml behind code /// public partial class AutoFocusView : UserControl, IUpdateRecipe, IDisposable { private static Logger _Logger; private FovInfo _FovInfo; private FovRecipe _FovRecipe; /// /// 생성자 /// /// Fov 정보 public AutoFocusView(FovInfo fovInfo) { _FovInfo = fovInfo; _FovRecipe = VisionRecipeManager.GetFovRecipe(_FovInfo); _Logger = new Logger($"AutoFocusView[{_FovInfo.SubSysName}][{_FovRecipe.FovName}]"); InitializeComponent(); } private void Init() { CreateCameraView(); SetObservable(); } private void CreateCameraView() { var cameraView = IpViewManager.CreateCameraView(_FovInfo, eDisplayType.AutoFocus); gridCameraView.Children.Add(cameraView); } private void SetObservable() { var disposable = VisionEnv.AuroraEnv.EventObservable.AsObservable(VisionEventId.UPDATE_AUTO_FOCUS_BEST_POS). Where(x => x.From == _FovInfo.GetKey()).Subscribe(autoFocusLog => UpdateAutoFocusBestPos(autoFocusLog)); DisposableManager.AddDisposable(eDpsGroupKey.SubMenu_AutoFocus, disposable); } /// /// 오토포커스를 최선의 위치로 업데이트 (비동기) /// /// 이벤트 메세지 public void UpdateAutoFocusBestPos(EventMessage msg) { Application.Current.Dispatcher.BeginInvoke( new Action(() => { try { var autoFocusLog = msg.Param as AutoFocusLog; dataGridAutoFocus.SelectedIndex = autoFocusLog.Step - 1; XYDiagram2D diagram = (XYDiagram2D)graphAutoFocus.Diagram; AxisX2D axisX = new AxisX2D(); AxisY2D axisY = new AxisY2D(); diagram.AxisX = axisX; diagram.AxisY = axisY; ConstantLine constantLineX = new ConstantLine() { Value = autoFocusLog.Step, }; axisX.ConstantLinesBehind.Add(constantLineX); ConstantLine constantLineY = new ConstantLine() { Value = autoFocusLog.Sharpness, }; axisY.ConstantLinesBehind.Add(constantLineY); } catch (Exception e) { _Logger.FuncE(e.Message); } })); } private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { bool isVisible = (bool)e.NewValue; if (isVisible == true) { RefreshVisionRecipes(); Init(); (DataContext as AutoFocusViewModel).LoadCsvNow(); } else { ISequence seq = VisionEnv.AuroraEnv.SequenceEntry[VisionKeys.AutoFocusSeqKey]; if (seq != null) { if (seq.RunState != SequenceRunState.Idle) { seq.EmergencyStop(); } } Dispose(); } } public void RefreshVisionRecipes() { _FovInfo = VisionRecipeManager.GetFovInfo(_FovInfo); (DataContext as AutoFocusViewModel).RefreshVisionRecipes(); } public void UpdateRecipeFromFile() { (DataContext as AutoFocusViewModel).UpdateRecipeFromFile(); } public void UpdateRecipeFromUI() { throw new NotImplementedException(); } #region Dispose public void Dispose() { RemoveCameraView(); } private void RemoveCameraView() { foreach (var child in gridCameraView.Children) { if (child is UserControl view) { IpViewManager.DisposeCameraView(view); } } gridCameraView.Children.Clear(); } #endregion } }