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
}
}