using Aurora.Api; using VisionCommon; using Matrox.MatroxImagingLibrary; using System; using System.Windows; using System.Windows.Controls; using System.ComponentModel; using System.Runtime.CompilerServices; using MilCommon; using Aurora.Api.DataType; namespace MilUI { /// /// Interaction logic for ForceOkView.xaml /// public partial class ForceOkView : UserControl, INotifyPropertyChanged, IDisposable { protected Window _PatternSettingWindow = null; public event PropertyChangedEventHandler PropertyChanged; protected bool SetProperty( ref S storage, S value, [CallerMemberName] string propertyName = null) { if (Equals(storage, value)) return false; storage = value; OnPropertyChanged(propertyName); return true; } protected void OnPropertyChanged([CallerMemberName] string propertyName = null) => PropertyChanged?.Invoke( this, new PropertyChangedEventArgs(propertyName)); public Window ParentWindow { get; set; } public PatternInfo PatternInfo { get; set; } private bool _isForceOkEnabled = true; public bool IsForceOkEnabled { get => _isForceOkEnabled; set => SetProperty(ref _isForceOkEnabled, value); } private ImagePoint _forceOkPoint = new ImagePoint(); public ImagePoint ForceOkPoint { get => _forceOkPoint; set => SetProperty(ref _forceOkPoint, value); } public PatternResult NewFindResult { get; set; } private bool _isApplyButtonEnabled = false; public bool IsApplyButtonEnabled { get => _isApplyButtonEnabled; set => SetProperty(ref _isApplyButtonEnabled, value); } public bool IsApply { get; set; } = false; private Logger _logger = new Logger("ForceOkView"); private FovInfo _fovInfo; private PatternAgentBase _patternAgent; private CameraAgentBase _CameraAgent; private CameraView _cameraView; private CameraDisplay _cameraDisplay; private MIL_ID _displayId = MIL.M_NULL; private MIL_ID _findImageId = MIL.M_NULL; private MIL_ID _graphicContext = MIL.M_NULL; private MIL_ID _graphicList = MIL.M_NULL; private MIL_ID _trainOriginLabel = MIL.M_NULL; private MIL_ID COLOR_FORCE_OK_POINT = MIL.M_COLOR_RED; private MilGraphics _milGraphics; private int _crossLength = 100; private const double ZOOM_STEP = 0.1; private Angle _forceOkAngle = Angle.CreateWithDegree(0); public ForceOkView(FovInfo fovInfo, PatternInfo patternInfo, object findImage) { InitializeComponent(); _fovInfo = fovInfo; PatternInfo = patternInfo; SetForceOkEnabled(); SetCameraView(); SetDisplay(); SetCameraAgent(); SetPatternAgent(); LoadFindlImageToDisplay((MIL_ID)findImage); if (_isForceOkEnabled) { LoadTrainOrigin(); IsApplyButtonEnabled = true; SetDisplayMode(); } DataContext = this; } private void SetForceOkEnabled() { _isForceOkEnabled = VisionRecipeManager.IsForceOkEnaled(_fovInfo.ToSubSysInfo(), eAlignId.Align1); } private void SetCameraView() { _cameraView = new CameraView(_fovInfo, eDisplayType.ForceOk); gridCameraView.Children.Add(_cameraView); _cameraDisplay = _cameraView.GetDisplay(); } private void SetDisplay() { _displayId = _cameraDisplay.GetMilDisplayId(); _graphicContext = _cameraDisplay.GetGraphicContextId(); _graphicList = _cameraDisplay.GetGraphicListId(); _milGraphics = new MilGraphics(_displayId, _graphicList); } public ICameraDisplay GetDisplay() { return _cameraDisplay; } private void SetCameraAgent() { _CameraAgent = CameraAgentManager.GetCameraAgent(_fovInfo); } private void SetPatternAgent() { if (PatternInfo is FovPatternInfo) { _patternAgent = FovPatternAgentManager.GetAgent(_fovInfo.ToSubSysInfo()); } else { _patternAgent = CamPatternAgentManager.GetAgent(VisionRecipeManager.GetFovRecipe(_fovInfo).CamRecipe.CamId); } } public void Dispose() { _PatternSettingWindow?.Close(); if (_isForceOkEnabled) { ResetDisplayMode(); } MIL.MbufFree(_findImageId); _cameraView.Dispose(); } private void LoadFindlImageToDisplay(MIL_ID findImage) { MilEnvironment.FreeImage(_findImageId); _findImageId = MilEnvironment.CloneImage(findImage); _cameraView.SetImage(_findImageId); } private void LoadTrainOrigin() { if (_isForceOkEnabled && _patternAgent.IsTrainPattern(PatternInfo)) { var trainParam = _patternAgent.GetTrainParam(PatternInfo) as ImageTrainParam; _crossLength = (int)(trainParam.TrainRoi.Width * 0.5); ForceOkPoint = trainParam.TrainOrigin.Origin.Clone() as ImagePoint; } else { MIL_ID imageId = _cameraDisplay.GetImage(); ForceOkPoint = MilEnvironment.GetImageCenter(imageId); } SetForceOkPoint(ForceOkPoint); } private void SetDisplayMode() { var forceOkMode = new ForceOkMode(); forceOkMode.SetForceOkPoint = SetForceOkPoint; VisionEnv.AuroraEnv.EventPublisher.Publish( new EventMessage( _fovInfo.FovName, DiplayModeEvent.On, new DisplayModeParam( eDisplayType.ForceOk, forceOkMode))); } private void ResetDisplayMode() { VisionEnv.AuroraEnv.EventPublisher.Publish( new EventMessage( _fovInfo.FovName, DiplayModeEvent.Off, new DisplayModeParam( eDisplayType.ForceOk, null))); } private void ZoomMinus_Button_Click(object sender, RoutedEventArgs e) { _cameraDisplay.SetRelativeImageZoom(ZOOM_STEP * (-1)); } private void FitImage_Button_Click(object sender, RoutedEventArgs e) { _cameraDisplay.FitImage(MilEnvironment.GetImageSize(_findImageId)); } private void ZoomPlus_Button_Click(object sender, RoutedEventArgs e) { _cameraDisplay.SetRelativeImageZoom(ZOOM_STEP); } private void Edit_Button_Click(object sender, RoutedEventArgs e) { _cameraDisplay.ClearAllGraphics(); if (_PatternSettingWindow == null) { _patternAgent.ReloadPattern(PatternInfo); _PatternSettingWindow = PatternViewUtil.CreatePatternSettingWindow( _patternAgent, _patternAgent.GetMainPatternInfo(PatternInfo), _cameraDisplay, _fovInfo); if (_PatternSettingWindow != null) { (_PatternSettingWindow as IPatternSettingWindow).ResetPosition(); _PatternSettingWindow.Closed += OnWindowClosed; _PatternSettingWindow.Show(); } } else { if (_PatternSettingWindow.WindowState == WindowState.Minimized) { _PatternSettingWindow.WindowState = WindowState.Normal; } (_PatternSettingWindow as IPatternSettingWindow).ResetPosition(); } } private void OnWindowClosed(object sender, EventArgs e) { _cameraDisplay.ClearMeasureGraphics(); _PatternSettingWindow = null; } private void Grab_Button_Click(object sender, RoutedEventArgs e) { var image = (object)_findImageId; _CameraAgent.GrabSync(_cameraDisplay, ref image); _findImageId = (MIL_ID)image; } private void Find_Button_Click(object sender, RoutedEventArgs e) { var patternResult = _patternAgent.Find(PatternInfo, _cameraDisplay.GetImage(), _cameraDisplay); NewFindResult = patternResult; if (patternResult.Status == eFoundStatus.FoundOK) { if (patternResult.Results != null) { foreach (var result in patternResult.Results) { ForceOkPoint = result.ImagePosition; break; } } IsApplyButtonEnabled = true; _milGraphics.Remove(_trainOriginLabel); } else { if (_isForceOkEnabled) { Move(new ImagePoint(0, 0)); } else { IsApplyButtonEnabled = false; } } _cameraDisplay.ClearMeasureGraphics(); _patternAgent.Draw(PatternInfo, patternResult, _cameraDisplay); } private void Apply_Button_Click(object sender, RoutedEventArgs e) { IsApply = true; ParentWindow?.Close(); } private void Cancel_Button_Click(object sender, RoutedEventArgs e) { IsApply = false; ParentWindow?.Close(); } private void Move_Left_Up_Button_Click(object sender, RoutedEventArgs e) { Move(new ImagePoint( GetMoveStep() * (-1), GetMoveStep() * (-1))); } private void Move_Right_Up_Button_Click(object sender, RoutedEventArgs e) { Move(new ImagePoint( GetMoveStep(), GetMoveStep() * (-1))); } private void Move_Up_Button_Click(object sender, RoutedEventArgs e) { Move(new ImagePoint( 0, GetMoveStep() * (-1))); } private void Move_Left_Button_Click(object sender, RoutedEventArgs e) { Move(new ImagePoint( GetMoveStep() * (-1), 0)); } private void Move_Right_Button_Click(object sender, RoutedEventArgs e) { Move(new ImagePoint( GetMoveStep(), 0)); } private void Move_Left_Down_Button_Click(object sender, RoutedEventArgs e) { Move(new ImagePoint( GetMoveStep() * (-1), GetMoveStep())); } private void Move_Down_Button_Click(object sender, RoutedEventArgs e) { Move(new ImagePoint(0, GetMoveStep())); } private void Move_Right_Down_Button_Click(object sender, RoutedEventArgs e) { Move(new ImagePoint( GetMoveStep(), GetMoveStep())); } private void Rotate_Clock_Wise_Button_Click(object sender, RoutedEventArgs e) { Rotate(_forceOkAngle + Angle.CreateWithDegree(GetMoveStep())); } private void Rotate_Counter_Clock_Wise_Button_Click(object sender, RoutedEventArgs e) { Rotate(_forceOkAngle - Angle.CreateWithDegree(GetMoveStep())); } private double GetMoveStep() { return Convert.ToDouble(trainOriginMoveStep.Value); } private void Move(ImagePoint moveOffset) { var movePoint = (ForceOkPoint + moveOffset) as ImagePoint; SetForceOkPoint(movePoint); } private void Rotate(Angle moveAngle) { SetForceOkPoint(ForceOkPoint, moveAngle); } private void Center_Button_Click(object sender, RoutedEventArgs e) { var imageCenter = MilEnvironment.GetImageCenter(_findImageId); SetForceOkPoint(imageCenter, new Angle()); } private void SetForceOkPoint(ImagePoint forceOkPoint, Angle forceAngle = null) { MIL_ID imageId = _cameraDisplay.GetImage(); if (imageId == MIL.M_NULL) { return; } ImageSize imageSize = MilEnvironment.GetImageSize(imageId); _crossLength = Math.Max(imageSize.Width, imageSize.Height); if (IsOutOfImageArea(forceOkPoint, imageSize)) { return; } if (_milGraphics.HasGraphicLabel(_trainOriginLabel)) { _milGraphics.Remove(_trainOriginLabel); _cameraDisplay.ClearMeasureGraphics(); } ForceOkPoint = forceOkPoint.Clone() as ImagePoint; Cross forceCross = null; if (forceAngle == null) { forceCross = new Cross(ForceOkPoint, _forceOkAngle, _crossLength); } else { forceCross = new Cross(ForceOkPoint, forceAngle, _crossLength); _forceOkAngle = forceAngle.Clone() as Angle; } DisplayDrawer.AddCross( _displayId, _graphicContext, _graphicList, COLOR_FORCE_OK_POINT, _milGraphics, forceCross); _trainOriginLabel = _milGraphics.GetLastLabel(); } private static bool IsOutOfImageArea(ImagePoint forceOkPoint, ImageSize imageSize) { return forceOkPoint.X < 0 || forceOkPoint.Y < 0 || imageSize.Width - 1 < forceOkPoint.X || imageSize.Height - 1 < forceOkPoint.Y; } } }