to3796zw 9c1daaee1d fix: Busy bit 위치 변경 및 Scanner Cam 팝업 모션 수정
- Laser On Display 타이밍을 맞추기 위해 PC_WELD_BUSY bit
  기록 위치 변경 (SeqAutoRunPTOP)
- 레시피 Scanner Cam 팝업(WDScannerCamMotion)을 직접 실행
  모드(publishMode:false)로 변경하고, 창 표시 시 모니터
  타이머/Limit 초기화를 호출해 모션 미동작·좌표 0 고정 해소
- 작업일지 2026-06-26 추가, Laser Interface 문서 갱신

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-26 15:02:21 +09:00

73 lines
2.7 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();
private readonly UCScannerMotionViewModel _MotionVM;
public WDScannerCamMotion(IAuroraEnvironment aurora, string scannerId)
{
InitializeComponent();
_MotionVM = new UCScannerMotionViewModel(aurora, scannerId, publishMode: false);
motionView.DataContext = _MotionVM;
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;
// 팝업 창에선 UCScannerMotion의 IsVisible 트리거가 발동하지 않으므로
// 모니터 타이머 시작 + Limit 초기화를 직접 호출한다.
_MotionVM.CMD_VisibleChanged.Execute(isVisible);
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()));
}
}
}