using System; using System.Collections.Generic; using System.ComponentModel; using System.Runtime.CompilerServices; namespace DrillTools { /// /// 涨缩参数输入模式 /// public enum ScalingMode { /// 倍率模式 Ratio, /// PPM 模式 Ppm } /// /// 钻带涨缩窗口视图模型 /// public class DrillScalingViewModel : INotifyPropertyChanged { private ScalingMode _mode = ScalingMode.Ratio; private string _inputX = "1.0"; private string _inputY = "1.0"; /// /// 缩放模式(倍率 / PPM) /// public ScalingMode Mode { get => _mode; set { if (SetProperty(ref _mode, value)) { OnPropertyChanged(nameof(ModeLabelX)); OnPropertyChanged(nameof(ModeLabelY)); OnPropertyChanged(nameof(ModeDescription)); } } } /// /// X 方向输入值(原始字符串) /// public string InputX { get => _inputX; set => SetProperty(ref _inputX, value); } /// /// Y 方向输入值(原始字符串) /// public string InputY { get => _inputY; set => SetProperty(ref _inputY, value); } /// /// X 方向标签文本(根据模式变化) /// public string ModeLabelX => Mode == ScalingMode.Ratio ? "倍率 X" : "PPM X"; /// /// Y 方向标签文本(根据模式变化) /// public string ModeLabelY => Mode == ScalingMode.Ratio ? "倍率 Y" : "PPM Y"; /// /// 模式说明文本 /// public string ModeDescription => Mode == ScalingMode.Ratio ? "倍率模式:直接输入缩放倍率(如 1.0005)" : "PPM 模式:输入百万分率(如 500 表示 +500ppm)"; /// /// 计算后的 X 方向实际缩放倍率 /// public double Kx { get { if (!double.TryParse(_inputX, out double value)) return 1.0; return Mode == ScalingMode.Ratio ? value : 1.0 + value / 1e6; } } /// /// 计算后的 Y 方向实际缩放倍率 /// public double Ky { get { if (!double.TryParse(_inputY, out double value)) return 1.0; return Mode == ScalingMode.Ratio ? value : 1.0 + value / 1e6; } } /// /// 验证输入是否有效 /// /// 验证结果,null 表示有效,非 null 为错误消息 public string? Validate() { if (!double.TryParse(_inputX, out double xVal)) return "X 值不是有效的数字"; if (!double.TryParse(_inputY, out double yVal)) return "Y 值不是有效的数字"; if (Mode == ScalingMode.Ratio) { if (xVal <= 0) return "倍率 X 必须大于 0"; if (yVal <= 0) return "倍率 Y 必须大于 0"; } return null; } public event PropertyChangedEventHandler? PropertyChanged; protected bool SetProperty(ref T field, T value, [CallerMemberName] string? propertyName = null) { if (EqualityComparer.Default.Equals(field, value)) return false; field = value; OnPropertyChanged(propertyName); return true; } protected virtual void OnPropertyChanged([CallerMemberName] string? propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } }