NohDoyeon241104 4ed35cb94a feat: 레시피 화면에서 스캐너 카메라+모션 토글 창 추가 (이벤트 구동)
- 레시피 컨트롤박스에 'Scanner Cam' 버튼 추가 → 카메라+모션 창 Show/Hide 토글
- WDScannerCamMotion: 전용 displayType(Machine_C) 카메라뷰 + 매뉴얼 UCScannerMotion 재사용
- UCScannerMotionViewModel: publish/execute 모드 분리
  - 레시피(publish): 입력값을 EVENT_SCANNER_COMMAND_MOVE 로 발행
  - 매뉴얼(execute): 이벤트 구독해 동일 메소드로 실제 스캐너 이동(인터락 그대로 재사용)
- Move/Jog/Home 메소드를 인자형으로 리팩터해 UI·이벤트 경로가 같은 본체 공유
- 분석 문서 추가(docs/분석/2026/06/23)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 17:03:21 +09:00

65 lines
2.4 KiB
C#

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
{
/// <summary>
/// 레시피 화면에서 토글로 띄우는 "스캐너 카메라 + 모션" 창.
/// - 카메라: 매뉴얼 화면(Machine_B)과 충돌하지 않도록 전용 displayType(Machine_C)로 별도 인스턴스 생성.
/// - 모션: 매뉴얼 UCScannerMotion 을 그대로 재사용하되, publish 모드 VM 을 주입해
/// 버튼 입력값을 이벤트(EVENT_SCANNER_COMMAND_MOVE)로 발행 → 매뉴얼 측 VM 이 실제 이동 수행.
/// - 닫기: Dispose 하지 않고 Hide → 언제든 다시 Show 가능.
/// </summary>
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()));
}
}
}