Files
XplorePlane/XplorePlane/ViewModels/Main/ViewportPanelViewModel.cs
T
zhengxuan.zhang 94924da3a4 Merge branch 'Develop/XP' into turbo-002-cnc
# Conflicts:
#	XplorePlane/App.xaml.cs
#	XplorePlane/ViewModels/Main/MainViewModel.cs
#	XplorePlane/ViewModels/Main/ViewportPanelViewModel.cs
#	XplorePlane/Views/Main/MainWindow.xaml
#	XplorePlane/Views/Main/ViewportPanelView.xaml
2026-04-24 14:36:06 +08:00

161 lines
5.3 KiB
C#

using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using System;
using System.Windows;
using System.Windows.Media;
using XP.Common.Logging.Interfaces;
using XplorePlane.Events;
using XplorePlane.Services.MainViewport;
namespace XplorePlane.ViewModels
{
/// <summary>
/// 主界面实时图像 ViewModel,统一承接显示状态和测量状态。
/// </summary>
public class ViewportPanelViewModel : BindableBase
{
private readonly ILoggerService _logger;
private readonly IMainViewportService _mainViewportService;
private readonly IEventAggregator _eventAggregator;
private ImageSource _imageSource;
private string _imageInfo = "等待探测器图像...";
private MeasurementToolMode _currentMeasurementMode = MeasurementToolMode.None;
private Point? _measurePoint1;
private Point? _measurePoint2;
private string _measurementResult;
public ViewportPanelViewModel(
IMainViewportService mainViewportService,
IEventAggregator eventAggregator,
ILoggerService logger)
{
_mainViewportService = mainViewportService ?? throw new ArgumentNullException(nameof(mainViewportService));
_eventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(eventAggregator));
_logger = logger?.ForModule<ViewportPanelViewModel>() ?? throw new ArgumentNullException(nameof(logger));
CancelMeasurementCommand = new DelegateCommand(ExecuteCancelMeasurement);
_mainViewportService.StateChanged += OnMainViewportStateChanged;
_eventAggregator.GetEvent<MeasurementToolEvent>()
.Subscribe(OnMeasurementToolActivated, ThreadOption.UIThread);
UpdateFromState(updateInfo: true);
}
public ImageSource ImageSource
{
get => _imageSource;
set => SetProperty(ref _imageSource, value);
}
public string ImageInfo
{
get => _imageInfo;
set => SetProperty(ref _imageInfo, value);
}
public MeasurementToolMode CurrentMeasurementMode
{
get => _currentMeasurementMode;
set
{
if (SetProperty(ref _currentMeasurementMode, value))
{
RaisePropertyChanged(nameof(IsMeasuring));
RaisePropertyChanged(nameof(MeasurementModeText));
}
}
}
public bool IsMeasuring => CurrentMeasurementMode != MeasurementToolMode.None;
public string MeasurementModeText => CurrentMeasurementMode switch
{
MeasurementToolMode.PointDistance => "点点距测量 - 请在图像上点击第一个点",
MeasurementToolMode.PointLineDistance => "点线距测量 - 请按工具提示继续操作",
MeasurementToolMode.Angle => "角度测量 - 功能待接入",
MeasurementToolMode.ThroughHoleFillRate => "通孔填锡率测量 - 功能待接入",
_ => string.Empty
};
public Point? MeasurePoint1
{
get => _measurePoint1;
set => SetProperty(ref _measurePoint1, value);
}
public Point? MeasurePoint2
{
get => _measurePoint2;
set => SetProperty(ref _measurePoint2, value);
}
public string MeasurementResult
{
get => _measurementResult;
set => SetProperty(ref _measurementResult, value);
}
public DelegateCommand CancelMeasurementCommand { get; }
public void ResetMeasurementState()
{
MeasurePoint1 = null;
MeasurePoint2 = null;
MeasurementResult = null;
if (CurrentMeasurementMode == MeasurementToolMode.None)
{
ImageInfo = _mainViewportService.CurrentDisplayInfo;
}
}
private void ExecuteCancelMeasurement()
{
_eventAggregator.GetEvent<MeasurementToolEvent>().Publish(MeasurementToolMode.None);
ImageInfo = "测量已取消";
}
private void OnMeasurementToolActivated(MeasurementToolMode mode)
{
CurrentMeasurementMode = mode;
ResetMeasurementState();
if (mode == MeasurementToolMode.None)
{
ImageInfo = _mainViewportService.CurrentDisplayInfo;
}
else
{
ImageInfo = MeasurementModeText;
}
_logger.Info("测量工具模式切换: {Mode}", mode);
}
private void OnMainViewportStateChanged(object sender, EventArgs e)
{
try
{
Application.Current?.Dispatcher?.BeginInvoke(new Action(() => UpdateFromState(updateInfo: CurrentMeasurementMode == MeasurementToolMode.None)));
}
catch (Exception ex)
{
_logger.Error(ex, "刷新主界面实时图像失败");
}
}
private void UpdateFromState(bool updateInfo)
{
ImageSource = _mainViewportService.CurrentDisplayImage;
if (updateInfo)
{
ImageInfo = _mainViewportService.CurrentDisplayInfo;
}
}
}
}