using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; namespace DrillTools { /// /// 启动选择窗口的 ViewModel,承载基础信息显示和叠板计算 /// public class StartupSelectionViewModel : INotifyPropertyChanged { #region 现有显示属性 private string _fileName = string.Empty; /// /// 文件名(不含扩展名) /// public string FileName { get => _fileName; set => SetProperty(ref _fileName, value); } private double _minDrillDiameter; /// /// 最小钻咀直径(显示用,已排除 0.749mm) /// public double MinDrillDiameter { get => _minDrillDiameter; set => SetProperty(ref _minDrillDiameter, value); } private double _minSlotDiameter; /// /// 最小槽刀直径(显示用) /// public double MinSlotDiameter { get => _minSlotDiameter; set => SetProperty(ref _minSlotDiameter, value); } private double _minEADiameter; /// /// 最小EA刀直径(显示用) /// public double MinEADiameter { get => _minEADiameter; set => SetProperty(ref _minEADiameter, value); } private bool _isPpDrillTape; /// /// 是否为 PP 钻带 /// public bool IsPpDrillTape { get => _isPpDrillTape; set => SetProperty(ref _isPpDrillTape, value); } private double _ppXSpacing; /// /// PP X 间距 /// public double PpXSpacing { get => _ppXSpacing; set => SetProperty(ref _ppXSpacing, value); } private double _ppYSpacing; /// /// PP Y 间距 /// public double PpYSpacing { get => _ppYSpacing; set => SetProperty(ref _ppYSpacing, value); } private bool _hasOuter3175Spacing; /// /// 是否有 3.175 外围孔间距 /// public bool HasOuter3175Spacing { get => _hasOuter3175Spacing; set => SetProperty(ref _hasOuter3175Spacing, value); } private double _outer3175XSpacing; /// /// 3.175 外围孔 X 间距 /// public double Outer3175XSpacing { get => _outer3175XSpacing; set => SetProperty(ref _outer3175XSpacing, value); } private double _outer3175YSpacing; /// /// 3.175 外围孔 Y 间距 /// public double Outer3175YSpacing { get => _outer3175YSpacing; set => SetProperty(ref _outer3175YSpacing, value); } #endregion #region 新增叠板计算属性 private string _boardThicknessInput = string.Empty; /// /// 板厚输入(原始文本) /// public string BoardThicknessInput { get => _boardThicknessInput; set { if (SetProperty(ref _boardThicknessInput, value)) TryCalculateStackCount(); } } private string _copperThicknessInput = string.Empty; /// /// 铜厚输入(原始文本,单位 oz) /// public string CopperThicknessInput { get => _copperThicknessInput; set { if (SetProperty(ref _copperThicknessInput, value)) TryCalculateStackCount(); } } private string _stackCountResult = string.Empty; /// /// 叠板计算结果文本(如"建议叠板:4 张"或错误提示) /// public string StackCountResult { get => _stackCountResult; set => SetProperty(ref _stackCountResult, value); } private string _stackCountDetail = string.Empty; /// /// 叠板计算明细文本 /// public string StackCountDetail { get => _stackCountDetail; set => SetProperty(ref _stackCountDetail, value); } #endregion #region 叠板计算用最小刀径(不排除 0.749mm) /// /// 叠板计算用的最小钻针直径(包含 0.749mm,由调用方遍历 Tools 独立计算) /// public double StackCalcMinDrill { get; set; } /// /// 叠板计算用的最小槽刀直径(尾号 1 槽刀,由调用方按尾号标准独立计算) /// public double StackCalcMinSlot { get; set; } /// /// 叠板计算用的最小 EA 刀直径(尾号 2/6 EA 型槽刀,由调用方按尾号标准独立计算) /// public double StackCalcMinEA { get; set; } #endregion #region 计算方法 /// /// 输入变化时自动尝试计算叠板数 /// 两个输入均有效时计算,否则静默清空结果 /// private void TryCalculateStackCount() { // 两个输入都不为空且可解析为正数时才执行计算 if (double.TryParse(BoardThicknessInput, out double boardThickness) && boardThickness > 0 && double.TryParse(CopperThicknessInput, out double copperThickness) && copperThickness > 0) { var result = StackCountCalculator.Calculate( boardThickness, copperThickness, StackCalcMinDrill, StackCalcMinSlot, StackCalcMinEA); if (result.Success) { StackCountResult = $"建议叠板:{result.RecommendedCount} 张"; StackCountDetail = result.Detail; } else { StackCountResult = "无法计算"; StackCountDetail = string.IsNullOrEmpty(result.Detail) ? result.Message : $"{result.Message}\n{result.Detail}"; } } else { // 输入不完整,静默清空 StackCountResult = string.Empty; StackCountDetail = string.Empty; } } #endregion #region INotifyPropertyChanged 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)); } #endregion } }