- 레시피 컨트롤박스에 '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>
65 lines
2.4 KiB
C#
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()));
|
|
}
|
|
}
|
|
}
|