using AuroraUIComponent.Util; using System; using System.Linq; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using VisionCommon; using VisionUI.Pattern; using VisionUI; using static WeldingCommon.Views.UCManualRCCOperationViewModel; using VisionUI.Camera; namespace WeldingCommon.Views { /// /// Interaction logic for UCManualRCCOperation.xaml /// public partial class UCManualRCCOperation : UserControl { private UCManualRCCOperationViewModel _ViewModel; private System.Windows.Point _StartPoint; private System.Windows.Point _OriginPoint; private double _InitialScaleX; private double _InitialScaleY; private FovInfo _FovInfo; private UserControl _CameraView; public UCManualRCCOperation(UCManualRCCOperationViewModel viewModel) { InitializeComponent(); _ViewModel = viewModel; DataContext = _ViewModel; ImageControl.MouseWheel += ImageCanvas_MouseWheel; ImageControl.MouseLeftButtonDown += ImageCanvas_MouseLeftButtonDown; ImageControl.MouseLeftButtonUp += ImageCanvas_MouseLeftButtonUp; ImageControl.MouseMove += ImageCanvas_MouseMove; _FovInfo = VisionRecipeManager.GetFovInfos().FirstOrDefault(); CreateRCCCameraView(); // Store the initial scale of the image this.Loaded += (s, e) => { var transformGroup = (TransformGroup)ImageControl.RenderTransform; var scaleTransform = (ScaleTransform)transformGroup.Children[0]; _InitialScaleX = scaleTransform.ScaleX; _InitialScaleY = scaleTransform.ScaleY; }; } private void CreateRCCCameraView() { if (gridRCCCameraView.Children.Count == 0) { var fovInfo = VisionRecipeManager.GetFovInfos().FirstOrDefault(); if (fovInfo != null) { // 패턴을 찾는 공정이 있으므로 eDisplayType을 반드시 Pattern으로 해야 한다. _CameraView = IpViewManager.CreateCameraView(fovInfo, eDisplayType.Pattern); gridRCCCameraView.Children.Add(_CameraView); } } } private void ImageCanvas_MouseWheel(object sender, MouseWheelEventArgs e) { var position = e.GetPosition(ImageControl); var transformGroup = (TransformGroup)ImageControl.RenderTransform; var scaleTransform = (ScaleTransform)transformGroup.Children[0]; var translateTransform = (TranslateTransform)transformGroup.Children[1]; double zoom = e.Delta > 0 ? 0.5 : -0.5; double newScaleX = scaleTransform.ScaleX + zoom; double newScaleY = scaleTransform.ScaleY + zoom; // Ensure the new scale is not smaller than the initial scale if (newScaleX < _InitialScaleX || newScaleY < _InitialScaleY) { newScaleX = _InitialScaleX; newScaleY = _InitialScaleY; } // Calculate the new position of the image to keep the zoom centered on the mouse pointer double offsetX = position.X - (position.X * newScaleX / scaleTransform.ScaleX); double offsetY = position.Y - (position.Y * newScaleY / scaleTransform.ScaleY); scaleTransform.ScaleX = newScaleX; scaleTransform.ScaleY = newScaleY; translateTransform.X -= offsetX; translateTransform.Y -= offsetY; } private void ImageCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (e.ButtonState == MouseButtonState.Pressed) { _StartPoint = e.GetPosition(this); _OriginPoint = new System.Windows.Point(ImageTranslateTransform.X, ImageTranslateTransform.Y); ImageControl.Cursor = Cursors.Hand; ImageControl.CaptureMouse(); } } private void ImageCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { ImageControl.ReleaseMouseCapture(); ImageControl.Cursor = Cursors.Arrow; } private void ImageCanvas_MouseMove(object sender, MouseEventArgs e) { if (ImageControl.IsMouseCaptured) { Vector v = _StartPoint - e.GetPosition(this); ImageTranslateTransform.X = _OriginPoint.X - v.X; ImageTranslateTransform.Y = _OriginPoint.Y - v.Y; } } #region Grid ContourCorrectionInfoList private void PasteCommand_Executed_ContourCorrectionInfoList(object sender, ExecutedRoutedEventArgs e) { //if (GridEditorContourCorrectionInfoList.PasteFromClipboard(null)) { // GridEditorContourCorrectionInfoList.CommitEdit(); // GridEditorContourCorrectionInfoList.Items.Refresh(); //} } private void UserControl_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { bool isVisible = (bool)e.NewValue; if (isVisible == true) { CreatePatternListView(); } else { CameraUcManager.Instance.StopLiveAll(); Dispose(); } } private void Dispose() { foreach (var child in gridPatternListView.Children) { if (child is PatternListView patternListView) { patternListView = null; } } gridPatternListView.Children.Clear(); } private void GridEditorContourCorrectionInfoList_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) { if (_ViewModel != null) { foreach (var item in e.RemovedCells) { if (item.Item is ContourCorrectionInfo) { _ViewModel.SelectedContourCorrectionInfoList.Remove(item.Item as ContourCorrectionInfo); } } foreach (var item in e.AddedCells) { if (item.Item is ContourCorrectionInfo) { var newItem = item.Item as ContourCorrectionInfo; if (!_ViewModel.SelectedContourCorrectionInfoList.Contains(newItem)) { _ViewModel.SelectedContourCorrectionInfoList.Add(newItem); } } } } } private void GridEditorContourCorrectionInfoList_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { if (!IsVisible) { _ViewModel.SelectedContourCorrectionInfoList.Clear(); //GridEditorContourCorrectionInfoList.UnselectAllCells(); } else { } } private void CreatePatternListView() { var patterrnListView = new PatternListView(_FovInfo); var patternSettingViewModel = IpViewManager.CreatePatternListViewModel(_FovInfo, _CameraView); patterrnListView.DataContext = patternSettingViewModel; gridPatternListView.Children.Add(patterrnListView); } private void GridEditorContourCorrectionInfoList_KeyDown(object sender, KeyEventArgs e) { if (e.Key == Key.Escape) { if (sender is DataGrid dg) { dg.SelectedItem = null; } if (sender is System.Windows.Controls.ListBox lb) { lb.SelectedItem = null; } } } #endregion } }