- 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>
73 lines
2.7 KiB
C#
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()));
|
|
}
|
|
}
|
|
}
|