feat: 基础信息叠板计算功能

- 新增 StackCountCalculator: 数字化规则表(短槽刀/EA刀10×4、槽刀10×4、钻针10×6),公开Calculate方法,输入校验,查表逻辑,16oz铜厚递减
- 新增 StartupSelectionViewModel: 替换匿名DataContext,保留所有显示属性,新增板厚/铜厚输入、计算结果/明细、CanCalculate
- 新增 NonEmptyToVisibilityConverter
- 修改 StartupSelectionWindow.xaml: 增宽680px,新增3行(输入+结果+明细),计算按钮在基础信息内部
- 修改 StartupSelectionWindow.xaml.cs: 构造函数接收ViewModel,新增计算按钮事件
- 修改 App.xaml.cs: 构建ViewModel实例,CalculateStackMinDiameters独立遍历Tools(含0.749mm,排除机台码)
- 修改 App.xaml: 注册NonEmptyToVisibilityConverter
This commit is contained in:
2026-06-27 16:24:45 +08:00
parent e27636dd93
commit fa697c9fd0
7 changed files with 919 additions and 31 deletions

View File

@@ -5,6 +5,7 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Collections.ObjectModel;
namespace DrillTools
{
@@ -60,20 +61,28 @@ namespace DrillTools
double outer3175XSpacing = viewModel.Outer3175XSpacing;
double outer3175YSpacing = viewModel.Outer3175YSpacing;
var selectionViewModel = new StartupSelectionViewModel
{
FileName = Path.GetFileNameWithoutExtension(filePath),
MinDrillDiameter = minDrill,
MinSlotDiameter = minSlot,
MinEADiameter = minEA,
IsPpDrillTape = isPpDrillTape,
PpXSpacing = ppXSpacing,
PpYSpacing = ppYSpacing,
HasOuter3175Spacing = hasOuter3175Spacing,
Outer3175XSpacing = outer3175XSpacing,
Outer3175YSpacing = outer3175YSpacing
};
// 叠板计算用的最小刀径独立遍历 Tools 计算,包含 0.749mm
CalculateStackMinDiameters(viewModel.Tools, selectionViewModel);
var selectionWindow = new StartupSelectionWindow(
filePath,
selectionViewModel,
canClearParameters,
canGeneratePpDrillTape,
canScaleDrillTape,
minDrill,
minSlot,
minEA,
isPpDrillTape,
ppXSpacing,
ppYSpacing,
hasOuter3175Spacing,
outer3175XSpacing,
outer3175YSpacing);
canScaleDrillTape);
selectionWindow.ShowDialog();
switch (selectionWindow.SelectedAction)
@@ -290,5 +299,48 @@ namespace DrillTools
return supportedExtensions.Contains(extension);
}
/// <summary>
/// 从 MainWindowViewModel.Tools 独立遍历计算叠板用最小刀径
/// 分类逻辑与 UpdateMinDiameterInfo 一致,但不排除 0.749mm
/// 槽刀分类映射Slot/DustSlot/DeburrSlot → 槽刀EASlot/EASlot2 → EA刀Drill → 钻针
/// </summary>
private static void CalculateStackMinDiameters(
ObservableCollection<ToolItem> tools,
StartupSelectionViewModel selectionViewModel)
{
double minDrill = 0;
double minSlot = 0;
double minEA = 0;
foreach (var tool in tools)
{
// 机台码刀具ToolType.MachineCode是固定孔位不参与叠板计算
if (tool.ToolType == ToolType.MachineCode)
continue;
var category = ToolItem.GetToolCategory(tool.ToolSuffixType);
switch (category)
{
case ToolCategory.Drill:
if (minDrill == 0 || tool.Diameter < minDrill)
minDrill = tool.Diameter;
break;
case ToolCategory.Slot:
if (minSlot == 0 || tool.Diameter < minSlot)
minSlot = tool.Diameter;
break;
case ToolCategory.EA:
if (minEA == 0 || tool.Diameter < minEA)
minEA = tool.Diameter;
break;
}
}
selectionViewModel.StackCalcMinDrill = minDrill;
selectionViewModel.StackCalcMinSlot = minSlot;
selectionViewModel.StackCalcMinEA = minEA;
}
}
}