using Aurora; using System; using System.ComponentModel; using System.Linq; using System.Windows; using System.Windows.Threading; using VisionCommon; using VisionUI; using VisionUI.Camera; namespace WeldingCommon.Views { /// /// 레시피 화면에서 토글로 띄우는 "스캐너 카메라 + 모션" 창. /// - 카메라: 매뉴얼 화면(Machine_B)과 충돌하지 않도록 전용 displayType(Machine_C)로 별도 인스턴스 생성. /// - 모션: 매뉴얼 UCScannerMotion 을 그대로 재사용하되, publish 모드 VM 을 주입해 /// 버튼 입력값을 이벤트(EVENT_SCANNER_COMMAND_MOVE)로 발행 → 매뉴얼 측 VM 이 실제 이동 수행. /// - 닫기: Dispose 하지 않고 Hide → 언제든 다시 Show 가능. /// public partial class WDScannerCamMotion : Window { private const eDisplayType DisplayType = eDisplayType.Machine_C; private delegate void HideWindow(); public WDScannerCamMotion(IAuroraEnvironment aurora, string scannerId) { InitializeComponent(); motionView.DataContext = new UCScannerMotionViewModel(aurora, scannerId, publishMode: true); CreateScannerCameraView(); } private void CreateScannerCameraView() { if (gridScannerCameraView.Children.Count == 0) { var fovInfo = VisionRecipeManager.GetFovInfos().FirstOrDefault(); if (fovInfo != null) { var cameraView = IpViewManager.CreateCameraView(fovInfo, DisplayType); gridScannerCameraView.Children.Add(cameraView); } } } private void Window_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) { bool isVisible = (bool)e.NewValue; if (isVisible) { CameraUcManager.Instance.StartLiveAll(DisplayType); } else { CameraUcManager.Instance.StopLiveAll(); } } protected override void OnClosing(CancelEventArgs e) { // 닫기 버튼/Alt+F4 시에도 파괴하지 않고 숨김 처리(재사용 유지). CameraUcManager.Instance.StopLiveAll(); e.Cancel = true; Dispatcher.BeginInvoke(DispatcherPriority.Normal, new HideWindow(() => this.Hide())); } } }