/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora.Api; using Aurora.Api.DataType; using CogCommon; using VisionCommon; using Hermes; using Cognex.VisionPro; using CogCamera; using CogPattern; using System; using System.Collections.Generic; using System.Linq; using System.Reactive.Linq; using System.Runtime.InteropServices; using System.Windows; using System.Windows.Controls; using VisionCalibrator; using Cognex.VisionPro.Display; using Cognex.VisionPro.PMAlign; namespace CogUI { /// /// Interaction logic for CameraDisplay.xaml /// public partial class CameraDisplay : UserControl, ICogCameraDisplay, IUpdateRecipe, IDisposable { private Logger _Logger; private CamConfig _CamConfig; private CameraBase _CameraDev; private FovInfo _FovInfo; private FovRecipe _FovRecipe; private PatternRecipe _PatternRecipe; private Calibrator _Calibrator; private ImageSize _ImageSize; private eDisplayType _DisplayType; private IDisposable _EventDisposable; private Dictionary _PatternInfos = new Dictionary(); private GridGuideLine _gridGuideLine; private CogRuler _CogRuler; private CogPointMarker _trainOrigin; private CogRectangleAffine _trainRoi; //private CogRectangleAffine _findRoi; private Dictionary _findRois = new Dictionary(); private bool _Initialized = false; public CameraDisplay() { InitializeComponent(); } public void SetPatternInfo(PatternInfo patternInfo, eRoiIdx roiIdx = eRoiIdx.Roi0) { _PatternInfos[roiIdx] = patternInfo; } public int Init(CameraBase cameraDev, eDisplayType displayType, CamConfig camConfig, FovInfo fovInfo, FovRecipe fovRecipe) { if (_Initialized) { return E1.OK; } _Logger = new Logger(string.Format("CameraDisplay[{0}]", fovRecipe.FovName)); _CameraDev = cameraDev; _CamConfig = camConfig; _DisplayType = displayType; _FovInfo = fovInfo; _FovRecipe = fovRecipe; _PatternRecipe = VisionRecipeManager.GetPatternRecipe(_FovInfo.ToSubSysInfo(), _FovInfo.FovId); _Calibrator = CalibratorManager.GetCalibrator(_FovInfo); _CogRuler = new CogRuler(cogDisplay, fovInfo); _ImageSize = _CameraDev?.GetImageSize(); InitCogDisplay(); CreateGraphics(); DrawGuideLines(); _Initialized = true; return E1.OK; } private void InitCogDisplay() { cogDisplay.AutoFitWithGraphics = true; cogDisplay.VerticalScrollBar = false; cogDisplay.HorizontalScrollBar = false; cogDisplay.BackColor = System.Drawing.Color.Black; cogDisplay.AutoFit = true; cogDisplay.ContextFitImage += CogDisplay_ContextFitImage; cogDisplay.MouseWheel += CogDisplay_MouseWheel; cogDisplay.MouseMove += CogDisplay_MouseMove; UpdateDefaultStatusBar(); } private void CogDisplay_ContextFitImage(object sender, EventArgs e) { UpdateCurrentZoomToStatusBar(e); } private void CogDisplay_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e) { UpdateCurrentZoomToStatusBar(e); } private void CogDisplay_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { UpdateCurrentPointToStatusBar(e); } private void UpdateDefaultStatusBar() { curZoom.Text = $"Zoom ({0:F3})"; var defaultPoint = new ImagePoint(_ImageSize.Width, _ImageSize.Height); curImagePoint.Text = defaultPoint.ToString(); curStaticPoint.Text = defaultPoint.ToString(); } private void CreateGraphics() { CreateTrainOrigin(); CreateTrainRoi(); CreateFindRoi(); _gridGuideLine = new GridGuideLine(cogDisplay, _FovInfo); } public void DrawGuideLines() { var calFovRecipe = VisionRecipeManager.GetCalFovRecipe(_FovInfo); var centerPos = new ImagePoint(_ImageSize.Width / 2, _ImageSize.Height / 2); var color = CogColorConstants.Orange; var lineStyle = CogGraphicLineStyleConstants.Dot; _gridGuideLine.DrawGuideLines(_ImageSize, centerPos, 1, lineStyle, color, CogConstants.KEY_GUIDE_LINE, calFovRecipe.ErrRotationX); //_gridGuideLine.DrawRefLine(_ImageSize, calFovRecipe.ErrRotationX); //_gridGuideLine.DrawCoordDirection(_ImageSize); } private void CreateTrainOrigin() { _trainOrigin = new CogPointMarker(); _trainOrigin.GraphicDOFEnable = CogPointMarkerDOFConstants.Position; _trainOrigin.Interactive = true; _trainOrigin.Color = GraphicColors.PatternTrainROI; _trainOrigin.DragColor = GraphicColors.PatternTrainROI; _trainOrigin.SelectedColor = GraphicColors.SelectedROI; _trainOrigin.LineWidthInScreenPixels = CogConstants.LINE_WIDTH_IN_SCREEN_PIXELS; _trainOrigin.DraggingStopped += new CogDraggingStoppedEventHandler(TrainOriginDraggingStopped); _trainOrigin.Visible = false; } private void CreateTrainRoi() { _trainRoi = new CogRectangleAffine(); _trainRoi.GraphicDOFEnable = CogRectangleAffineDOFConstants.All; _trainRoi.Interactive = true; _trainRoi.Color = GraphicColors.PatternTrainROI; _trainRoi.DragColor = GraphicColors.PatternTrainROI; _trainRoi.SelectedColor = GraphicColors.SelectedROI; _trainRoi.LineWidthInScreenPixels = CogConstants.LINE_WIDTH_IN_SCREEN_PIXELS; _trainRoi.Changed += Changed_TrainRoi; _trainRoi.Visible = false; } private void CreateFindRoi(eRoiIdx roiIdx = eRoiIdx.Roi0) { if (!_findRois.ContainsKey(roiIdx)) { _findRois[roiIdx] = new CogRectangleAffine(); _findRois[roiIdx].GraphicDOFEnable = CogRectangleAffineDOFConstants.All; _findRois[roiIdx].Interactive = true; _findRois[roiIdx].Color = GraphicColors.PatternFindROI; _findRois[roiIdx].DragColor = GraphicColors.PatternFindROI; _findRois[roiIdx].SelectedColor = GraphicColors.SelectedROI; _findRois[roiIdx].LineWidthInScreenPixels = CogConstants.LINE_WIDTH_IN_SCREEN_PIXELS; _findRois[roiIdx].Changed += Changed_FindRoi; _findRois[roiIdx].Visible = false; } } private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e) { if (IsLoaded && (e.WidthChanged || e.HeightChanged)) { FitImage(); } } private void UserControl_Loaded(object sender, RoutedEventArgs e) { FitImage(); } public void ClearImage() { CogEnvironment.ClearImage(cogDisplay.Image); } public int FitImage(ImageSize imageSize) { try { return FitImage(); } catch (Exception e) { _Logger.FuncE(e.Message); } return E1.GENERIC; } public int FitImage() { try { cogDisplay.Fit(true); UpdateCurrentZoomToStatusBar(null); return E1.OK; } catch (Exception e) { _Logger.FuncE(e.Message); } return E1.GENERIC; } public int SetImage(object image) { ICogImage srcImage = (ICogImage)image; ICogImage dstImage = null; if (cogDisplay.Image == null) { dstImage = new CogImage8Grey(srcImage.Width, srcImage.Height); } else { dstImage = cogDisplay.Image; } CogEnvironment.CopyImage(srcImage, ref dstImage); cogDisplay.Image = dstImage; return E1.OK; } public bool IsSetImage() { if (cogDisplay.Image != null) { return true; } else { return false; } } public object GetImageObject() { return (object)cogDisplay.Image; } public ICogImage GetImage() { return cogDisplay.Image; } public CamRecipe GetCamRecipe() { return _FovRecipe.CamRecipe; } public FovInfo GetDisplayFovInfo() { return _FovInfo; } public eDisplayType GetDisplayType() { return _DisplayType; } public CogDisplay GetDisplay() { return cogDisplay; } public int RulerModeOn(eDisplayMode displayMode) { switch (displayMode) { case eDisplayMode.DistanceAngle: _CogRuler.SetDistanceAngleMode(); break; case eDisplayMode.Position: _CogRuler.SetPositionMode(); break; case eDisplayMode.Circle: _CogRuler.SetCircleMode(); break; case eDisplayMode.MovePosition: _CogRuler.SetMovePositionMode(); break; default: break; } return E1.OK; } public int RulerModeOff() { _CogRuler.Clear(true); return E1.OK; } public void SetWideGridGuideLine() { if (cogDisplay.Image != null) { _gridGuideLine.WideOn(CogEnvironment.GetImageSize(cogDisplay.Image)); } } public void SetNarrowGridGuideLine() { if (cogDisplay.Image != null) { _gridGuideLine.NarrowOn(CogEnvironment.GetImageSize(cogDisplay.Image)); } } public void SetWideGridGuideLine_ErrRotation() { if (cogDisplay.Image != null) { _gridGuideLine.WideOn(CogEnvironment.GetImageSize(cogDisplay.Image), true); } } public void SetNarrowGridGuideLine_ErrRotation() { if (cogDisplay.Image != null) { _gridGuideLine.NarrowOn(CogEnvironment.GetImageSize(cogDisplay.Image), true); } } public void ClearGridGuidLine() { _gridGuideLine.Clear(); } public int SetPatternTracking(Cross newCross) { if (_PatternRecipe.TrackingParam.Enabled) { PatternTrackingManager.AddCross(_FovInfo, newCross); } return E1.OK; } public int DrawPatternTrackings(List newCrosses) { ClearPatternTrackingGraphics(); if (_PatternRecipe.TrackingParam.Enabled) { Application.Current.Dispatcher.BeginInvoke( new System.Action(() => { var color = ColorConverter.ConvertColor(eColor.Orange); var crossTrackings = PatternTrackingManager.GetCrosses(_FovInfo, _PatternRecipe.TrackingParam.Count + 1); RemoveDuplicateCross(newCrosses, crossTrackings); DisplayDrawer.AddCrosses(cogDisplay, color, crossTrackings, CogConstants.KEY_PATTERN_TRACKING); })); } return E1.OK; } private void RemoveDuplicateCross(List newCrosses, List crossTrackings) { foreach (Cross newCross in newCrosses) { for (int i = 0; i < crossTrackings.Count; i++) { if (crossTrackings[i].Equals(newCross)) { crossTrackings.Remove(newCross); } } } } /// /// 레퍼런스 위치에 십자가 그리기 /// /// 십자가 길이 /// 십자가 색상 public void DrawRefCross(int length = 10, eColor color = eColor.Yellow) { var refPointRecipe = VisionRecipeManager.GetRefPointRecipe(_FovInfo); if (refPointRecipe == null) { _Logger.E($"refPointRecipe is null"); return; } ImagePoint refPos = GetRefPos(_ImageSize); AddCross(new Cross(refPos, length), color); } private ImagePoint GetRefPos(ImageSize imageSize) { var calibrator = CalibratorManager.GetCalibrator(_FovInfo); var staticRefPoint = VisionRecipeManager.GetRefPoint(_FovInfo); var imageRefPoint = calibrator.TransformToImagePoint(staticRefPoint, imageSize); return new ImagePoint(imageRefPoint.X, imageRefPoint.Y); } public int AddCross(Cross cross, eColor color) { return AddCross(cross, ColorConverter.ConvertColor(color)); } public int AddCross(Cross cross, CogColorConstants color) { DisplayDrawer.AddCross(cogDisplay, color, cross, CogConstants.KEY_CROSS); return E1.OK; } public int AddCrosses(List crosses, CogColorConstants color) { DisplayDrawer.AddCrosses(cogDisplay, color, crosses, CogConstants.KEY_CROSS); return E1.OK; } public int AddLine(eColor color, ImagePoint p1, ImagePoint p2) { return AddLine(ColorConverter.ConvertColor(color), p1, p2); } public int AddLine(CogColorConstants color, ImagePoint p1, ImagePoint p2) { DisplayDrawer.AddLine(cogDisplay, color, p1, p2, CogConstants.KEY_LINE); return E1.OK; } public int AddVectors(CogColorConstants color, ImagePoint startPoint, List endPoints) { DisplayDrawer.AddVectors(cogDisplay, color, startPoint, endPoints, CogConstants.KEY_VECTOR); return E1.OK; } public int AddTrainOrigin(Cross trainOrigin) { if (HasTrainOrigin()) { DisplayDrawer.RemoveInteractiveGraphic(cogDisplay, CogConstants.KEY_TRAIN_ORIGIN); } int markerSize = 100; _trainOrigin.SetCenterRotationSize(trainOrigin.Origin.X, trainOrigin.Origin.Y, trainOrigin.Angle.Radian, markerSize); _trainOrigin.Visible = true; DisplayDrawer.AddInteractiveGraphic(cogDisplay, _trainOrigin, CogConstants.KEY_TRAIN_ORIGIN, false); return E1.OK; } private void TrainOriginDraggingStopped(object sender, CogDraggingEventArgs e) { try { CogPointMarker marker = e.DragGraphic as CogPointMarker; _Logger.FuncI($"{_trainOrigin.X}, {_trainOrigin.Y}"); } catch (Exception ex) { _Logger.FuncE("{0}", ex.Message); } } public Cross GetTrainOrigin() { if (!HasTrainOrigin()) { return new Cross(new ImagePoint(0, 0)); } return new Cross(new ImagePoint(_trainOrigin.X, _trainOrigin.Y)); } public bool HasTrainOrigin() { return DisplayDrawer.ExistsGetInteractiveGraphic(cogDisplay, CogConstants.KEY_TRAIN_ORIGIN); } public void UpdateRadiusOfTrainOrigin(double radius) { } public void AddRoi(ROI roi, eColor color, bool isRotatable = false) { if (ROI.IsNullOrEmpty(roi)) { DisplayDrawer.AddRoi(cogDisplay, ColorConverter.ConvertColor(color), roi, CogConstants.KEY_ROI); } } public int AddTrainRoi(ImagePoint imageCenter, bool isRotatable = false) { var length = 200; return AddTrainRoi(new ROI(imageCenter, length, length, new Angle()), isRotatable); } public int AddTrainRoi(ROI trainRoi, bool isRotatable = false) { if (HasTrainRoi()) { DisplayDrawer.RemoveInteractiveGraphic(cogDisplay, CogConstants.KEY_TRAIN_ROI); } _trainRoi.Visible = true; // trainRoi의 Angle은 패턴 로드 시점에 trainOrigin에 의해 미리 Set되어 있다. _trainRoi.SetCenterLengthsRotationSkew(trainRoi.CenterX, trainRoi.CenterY, trainRoi.Width, trainRoi.Height, trainRoi.Angle.Radian, 0); //_trainRoi.SetCenterLengthsRotationSkew(trainRoi.CenterX, trainRoi.CenterY, trainRoi.Width, trainRoi.Height, trainRoi.Angle.Radian, 0); DisplayDrawer.AddInteractiveGraphic(cogDisplay, _trainRoi, CogConstants.KEY_TRAIN_ROI, false); return E1.OK; } private void Changed_TrainRoi(object sender, CogChangedEventArgs e) { try { var trainRoiAffine = sender as CogRectangleAffine; _trainOrigin.Rotation = trainRoiAffine.Rotation; if (_GraEventSubscribers?.Count > 0) { _GraEventSubscribers[_PatternInfos[eRoiIdx.Roi0]]?.UpdateAngleOfRoi(eGraRoiType.TrainRoi, CogMisc.RadToDeg(trainRoiAffine.Rotation)); } } catch (Exception ex) { _Logger.FuncE("{0}", ex.Message); } } public ROI GetTrainRoi() { if (!HasTrainRoi()) { return new ROI(0, 0, 0, 0); } var convParam = ConvertDoubleToInt(_trainRoi.CenterX, _trainRoi.CenterY, _trainRoi.SideXLength, _trainRoi.SideYLength); return new ROI( convParam.centerX, convParam.centerY, convParam.width, convParam.height, Angle.CreateWithDegree(CogMisc.RadToDeg(_trainRoi.Rotation))); } private (double centerX, double centerY, int width, int height) ConvertDoubleToInt(double centerX, double centerY, double width, double height) { int left = (int)Math.Round(centerX - width / 2.0); int top = (int)Math.Round(centerY - height / 2.0); int right = (int)Math.Round(centerX + width / 2.0); int bottom = (int)Math.Round(centerY + height / 2.0); int intWidth = right - left; int intHeight = bottom - top; double dbCenterX = left + intWidth * 0.5; double dbCenterY = top + intHeight * 0.5; return (dbCenterX, dbCenterY, intWidth, intHeight); } public void UpdateAngleOfTrainRoi(double roiAngle) { if (HasTrainRoi()) { _trainRoi.Rotation = CogMisc.DegToRad(roiAngle); } } public bool HasTrainRoi() { return DisplayDrawer.ExistsGetInteractiveGraphic(cogDisplay, CogConstants.KEY_TRAIN_ROI); } public int AddDefaultFindRoi(ImageSize imageSize, bool isRotatable = false) { if (HasFindRoi()) { DisplayDrawer.RemoveInteractiveGraphic(cogDisplay, string.Format(CogConstants.KEY_FIND_ROI, eRoiIdx.Roi0)); } var roi = RoiUtil.GetDefaultFindRoi(imageSize); return AddFindRoi(roi, isRotatable); } public int AddFindRoi(ROI findRoi, bool isRotatable = false) { if (HasFindRoi()) { DisplayDrawer.RemoveInteractiveGraphic(cogDisplay, string.Format(CogConstants.KEY_FIND_ROI, findRoi.RoiIdx)); } _findRois[findRoi.RoiIdx].Color = ColorConverter.ConvertColor(findRoi.RoiColor); _findRois[findRoi.RoiIdx].SetCenterLengthsRotationSkew(findRoi.CenterX, findRoi.CenterY, findRoi.Width, findRoi.Height, findRoi.Angle.Radian, 0); _findRois[findRoi.RoiIdx].Visible = true; DisplayDrawer.AddInteractiveGraphic(cogDisplay, _findRois[findRoi.RoiIdx], string.Format(CogConstants.KEY_FIND_ROI, findRoi.RoiIdx), false); return E1.OK; } private void Changed_FindRoi(object sender, CogChangedEventArgs e) { try { var findRoiAffine = sender as CogRectangleAffine; if (_GraEventSubscribers?.Count > 0) { _GraEventSubscribers[_PatternInfos[eRoiIdx.Roi0]]?.UpdateAngleOfRoi(eGraRoiType.FindRoi, CogMisc.RadToDeg(findRoiAffine.Rotation)); } } catch (Exception ex) { _Logger.FuncE("{0}", ex.Message); } } public ROI GetFindRoi(eRoiIdx roiIdx = eRoiIdx.Roi0) { if (!HasFindRoi()) { return new ROI(); } var convParam = ConvertDoubleToInt(_findRois[roiIdx].CenterX, _findRois[roiIdx].CenterY, _findRois[roiIdx].SideXLength, _findRois[roiIdx].SideYLength); return new ROI( convParam.centerX, convParam.centerY, convParam.width, convParam.height, Angle.CreateWithDegree(CogMisc.RadToDeg(_findRois[roiIdx].Rotation))); } public void UpdateAngleOfFindRoi(double roiAngle) { if (HasFindRoi()) { _findRois[eRoiIdx.Roi0].Rotation = CogMisc.DegToRad(roiAngle); } } public bool HasFindRoi(eRoiIdx roiIdx = eRoiIdx.Roi0) { return DisplayDrawer.ExistsGetInteractiveGraphic(cogDisplay, string.Format(CogConstants.KEY_FIND_ROI, roiIdx)); } public void ClearFindRoi(eRoiIdx roiIdx = eRoiIdx.Roi0) { if (HasFindRoi(roiIdx)) { ClearFindGraphics(); } } public void DrawTrainEdge(PatternAgentBase patternAgent, PatternInfo patternInfo) { DisplayDrawer.AddTrainEdge(cogDisplay, patternAgent, patternInfo); } public void DrawBlobEdge(PatternAgentBase patternAgent, PatternInfo patternInfo) { DisplayDrawer.AddBlobEdge(cogDisplay, patternAgent, patternInfo); } public int AddPatternResultFindRoi(CogDisplay cogDisplay, CogColorConstants color, List findRois) { foreach (var roi in findRois) { AddPatternResultFindRoi(cogDisplay, color, roi); } return E1.OK; } public int AddPatternResultFindRoi(CogDisplay cogDisplay, CogColorConstants color, ROI findRoi) { if (ROI.IsNullOrEmpty(findRoi)) { var imageSize = CogEnvironment.GetImageSize(GetImage()); var defaultFindRoi = RoiUtil.GetDefaultFindRoi(imageSize); DisplayDrawer.AddRoi(cogDisplay, color, defaultFindRoi, string.Format(CogConstants.KEY_FIND_ROI, eRoiIdx.Roi0)); } else { DisplayDrawer.AddRoi(cogDisplay, color, findRoi, string.Format(CogConstants.KEY_FIND_ROI, eRoiIdx.Roi0)); } return E1.OK; } public int AddTextList(eColor color, ImagePoint p, List msgs) { return AddTextList(ColorConverter.ConvertColor(color), p, msgs); } public int AddTextList(object color, ImagePoint p, List msgs) { DisplayDrawer.AddTextList(cogDisplay, (CogColorConstants)color, p, msgs, CogConstants.KEY_PATTERN_RESULT); return E1.OK; } public int AddTextList(object color, ImagePoint p, List msgs, int lineInterval) { DisplayDrawer.AddTextList(cogDisplay, (CogColorConstants)color, p, msgs, CogConstants.KEY_PATTERN_RESULT, lineInterval); return E1.OK; } public int AddColorTextList(ImagePoint p, List colorTextList) { DisplayDrawer.AddColorTextList(cogDisplay, p, colorTextList, CogConstants.KEY_PATTERN_RESULT); return E1.OK; } public int AddColorTextList(ImagePoint p, List colorTextList, int lineInterval) { DisplayDrawer.AddColorTextList(cogDisplay, p, colorTextList, CogConstants.KEY_PATTERN_RESULT, lineInterval); return E1.OK; } public int ClearAllGraphics() { DisplayDrawer.ClearGraphics(cogDisplay); return E1.OK; } public int ClearMeasureGraphics(eGraphicToClear graphicToClear = eGraphicToClear.ALL) { DisplayDrawer.RemoveGraphic(cogDisplay, graphicToClear, CogConstants.KEY_PATTERN_RESULT); DisplayDrawer.RemoveGraphic(cogDisplay, graphicToClear, CogConstants.KEY_CROSS); DisplayDrawer.RemoveGraphic(cogDisplay, graphicToClear, CogConstants.KEY_LINE); DisplayDrawer.RemoveGraphic(cogDisplay, graphicToClear, CogConstants.KEY_BLOB); return E1.OK; } public int ClearTrainGraphics(eGraphicToClear graphicToClear = eGraphicToClear.ALL) { DisplayDrawer.RemoveGraphic(cogDisplay, graphicToClear, CogConstants.KEY_TRAIN_ORIGIN); DisplayDrawer.RemoveGraphic(cogDisplay, graphicToClear, CogConstants.KEY_TRAIN_ROI); DisplayDrawer.RemoveGraphic(cogDisplay, graphicToClear, CogConstants.KEY_TRAIN_RESULT); DisplayDrawer.RemoveGraphic(cogDisplay, graphicToClear, CogConstants.KEY_MASK); return E1.OK; } public int ClearFindGraphics(eGraphicToClear graphicToClear = eGraphicToClear.ALL) { DisplayDrawer.RemoveGraphic(cogDisplay, graphicToClear, string.Format(CogConstants.KEY_FIND_ROI, eRoiIdx.Roi0)); DisplayDrawer.RemoveGraphic(cogDisplay, graphicToClear, CogConstants.KEY_CALIPER_ROI); return E1.OK; } public int ClearPatternTrackingGraphics(eGraphicToClear graphicToClear = eGraphicToClear.ALL) { DisplayDrawer.RemoveGraphic(cogDisplay, graphicToClear, CogConstants.KEY_PATTERN_TRACKING); return E1.OK; } public void ClearFindLabelNumGraphicsAll() { //foreach (var itemPair in _findLabelNumGraphicsDic) { // MilGraphics milGraphics = itemPair.Value; // milGraphics?.Clear(); //} //_findLabelNumGraphicsDic.Clear(); } // 메인 화면에 _FovInfo에 해당하는 디스플레이만 보이기 public void SetVisibility() { var fovUiPos = VisionRecipeManager.GetFovUiPos(_FovRecipe, _DisplayType); CameraViewManager.Instance.SetVisibilities(_FovInfo, fovUiPos, _DisplayType); } private void cogDisplay_DoubleClick(object sender, EventArgs e) { FitImage(); } private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { bool isVisible = (bool)e.NewValue; if (isVisible == true) { RefreshVisionRecipes(); } } public void RefreshVisionRecipes() { if (_FovInfo != null) { _FovRecipe = VisionRecipeManager.GetFovRecipe(_FovInfo); _PatternRecipe = VisionRecipeManager.GetPatternRecipe(_FovInfo.ToSubSysInfo(), _FovInfo.FovId); } } public void UpdateRecipeFromFile() { throw new NotImplementedException(); } public void UpdateRecipeFromUI() { throw new NotImplementedException(); } private void UpdateCurrentZoomToStatusBar(EventArgs e) { if (cogDisplay.Image == null) { return; } double imageZoom = Math.Round(cogDisplay.Zoom, 2); double displayZoom = GetDisplayZoom(); Application.Current.Dispatcher.BeginInvoke( new System.Action(() => { curZoom.Text = $"Zoom (X{imageZoom / displayZoom:F2}, {imageZoom:F2})"; })); } private double GetDisplayZoom() { double displayZoomX = (double)cogDisplay.ClientSize.Width / cogDisplay.Image.Width; double displayZoomY = (double)cogDisplay.ClientSize.Height / cogDisplay.Image.Height; return Math.Round(Math.Min(displayZoomX, displayZoomY), 2); } private void UpdateCurrentPointToStatusBar(System.Windows.Forms.MouseEventArgs e) { if (cogDisplay.Image == null) { return; } var screenPoint = new ImagePoint(e.X, e.Y); var imagePoint = _CogRuler.TransformScreenPointToImagePoint(screenPoint); curImagePoint.Text = imagePoint.ToString(); if (_Calibrator != null) { var staticPoint = _Calibrator.TransformToCalibratedSpace(imagePoint, _ImageSize); curStaticPoint.Text = staticPoint.ToString(); } } #region TrainRoi & FindRoi Changed Event private Dictionary _GraEventSubscribers = new Dictionary(); public void SetGraEventSubscriber(PatternInfo patternInfo, object viewModel) { _GraEventSubscribers[patternInfo] = viewModel as IGraEventSubscriber; } private void ClearGraEventSubscribers() { _GraEventSubscribers.Clear(); } #endregion #region IDisposible public void Dispose() { if (!_Initialized) { return; } RemoveObservable(); RemoveHookFunc(); RemoveGraphics(); ClearGraEventSubscribers(); _Initialized = false; } private void RemoveHookFunc() { cogDisplay.ContextFitImage -= CogDisplay_ContextFitImage; cogDisplay.MouseWheel -= CogDisplay_MouseWheel; cogDisplay.MouseMove -= CogDisplay_MouseMove; } private void RemoveGraphics() { ClearAllGraphics(); _gridGuideLine = null; _trainOrigin = null; _trainRoi = null; for (int i = 0; i < _findRois.Count; i++) { _findRois[(eRoiIdx)i] = null; } } private void RemoveObservable() { _EventDisposable?.Dispose(); _EventDisposable = null; } #endregion } }