diff --git a/App.xaml.cs b/App.xaml.cs
index 096172d..e41972d 100644
--- a/App.xaml.cs
+++ b/App.xaml.cs
@@ -54,8 +54,23 @@ namespace DrillTools
bool isPpDrillTape = viewModel.IsPpDrillTape;
double ppXSpacing = viewModel.PpXSpacing;
double ppYSpacing = viewModel.PpYSpacing;
+ bool hasOuter3175Spacing = viewModel.HasOuter3175Spacing;
+ double outer3175XSpacing = viewModel.Outer3175XSpacing;
+ double outer3175YSpacing = viewModel.Outer3175YSpacing;
- var selectionWindow = new StartupSelectionWindow(filePath, canClearParameters, canGeneratePpDrillTape, minDrill, minSlot, minEA, isPpDrillTape, ppXSpacing, ppYSpacing);
+ var selectionWindow = new StartupSelectionWindow(
+ filePath,
+ canClearParameters,
+ canGeneratePpDrillTape,
+ minDrill,
+ minSlot,
+ minEA,
+ isPpDrillTape,
+ ppXSpacing,
+ ppYSpacing,
+ hasOuter3175Spacing,
+ outer3175XSpacing,
+ outer3175YSpacing);
selectionWindow.ShowDialog();
switch (selectionWindow.SelectedAction)
diff --git a/MainWindow.xaml b/MainWindow.xaml
index 7c655a8..d8ba892 100644
--- a/MainWindow.xaml
+++ b/MainWindow.xaml
@@ -205,6 +205,7 @@
+
@@ -259,6 +260,21 @@
Text="{Binding MinEADiameter, StringFormat=F3}" />
+
+
+
+
+
+
diff --git a/MainWindowViewModel.cs b/MainWindowViewModel.cs
index 854b802..2736720 100644
--- a/MainWindowViewModel.cs
+++ b/MainWindowViewModel.cs
@@ -36,6 +36,9 @@ namespace DrillTools
private bool _isPpDrillTape;
private double _ppXSpacing;
private double _ppYSpacing;
+ private bool _hasOuter3175Spacing;
+ private double _outer3175XSpacing;
+ private double _outer3175YSpacing;
private const int SwRestore = 9;
private const int SvsiSelect = 0x1;
@@ -239,6 +242,33 @@ namespace DrillTools
set => SetProperty(ref _ppYSpacing, value);
}
+ ///
+ /// 是否存在3.175外围孔间距信息
+ ///
+ public bool HasOuter3175Spacing
+ {
+ get => _hasOuter3175Spacing;
+ set => SetProperty(ref _hasOuter3175Spacing, value);
+ }
+
+ ///
+ /// 3.175外围孔X间距(单位mm)
+ ///
+ public double Outer3175XSpacing
+ {
+ get => _outer3175XSpacing;
+ set => SetProperty(ref _outer3175XSpacing, value);
+ }
+
+ ///
+ /// 3.175外围孔Y间距(单位mm)
+ ///
+ public double Outer3175YSpacing
+ {
+ get => _outer3175YSpacing;
+ set => SetProperty(ref _outer3175YSpacing, value);
+ }
+
///
/// 从钻带内容加载刀具信息
///
@@ -248,6 +278,7 @@ namespace DrillTools
DrillTapeContent = drillTapeContent;
Tools.Clear();
OriginalTools.Clear(); // 清空原始刀具顺序
+ UpdateOuter3175SpacingInfo();
try
{
@@ -348,6 +379,7 @@ namespace DrillTools
// 计算PP钻带间距
UpdatePpSpacingInfo();
+ UpdateOuter3175SpacingInfo();
// 启动菜单的预检查和非调整刀序动作会关闭此开关,避免排序提示抢在菜单前弹出。
if (ShouldCheckSortFileOnLoad && !string.IsNullOrEmpty(OriginalFilePath))
@@ -888,6 +920,9 @@ namespace DrillTools
// 计算并更新最小直径信息
UpdateMinDiameterInfo();
+ // 计算3.175外围孔间距
+ UpdateOuter3175SpacingInfo();
+
// 加载示例钻带内容
DrillTapeContent = @"M48
;厚铜板参数-镀膜-EA-250618
@@ -1742,6 +1777,63 @@ M30";
System.Diagnostics.Debug.WriteLine($"=== 计算完成 ===");
}
+ ///
+ /// 更新3.175外围孔间距信息
+ ///
+ private void UpdateOuter3175SpacingInfo()
+ {
+ HasOuter3175Spacing = false;
+ Outer3175XSpacing = 0;
+ Outer3175YSpacing = 0;
+
+ var targetTool = Tools.FirstOrDefault(tool => Math.Abs(tool.Diameter - 3.175) < 0.001);
+ if (targetTool?.HoleLocations == null || targetTool.HoleLocations.Count == 0)
+ return;
+
+ var points = ExtractCoordinatePoints(targetTool.HoleLocations);
+ if (points.Count < 4)
+ return;
+
+ double topY = points.Max(point => point.Y);
+ double bottomY = points.Min(point => point.Y);
+
+ var topRowPoints = points.Where(point => Math.Abs(point.Y - topY) < 0.0001).ToList();
+ var bottomRowPoints = points.Where(point => Math.Abs(point.Y - bottomY) < 0.0001).ToList();
+
+ if (topRowPoints.Count < 2 || bottomRowPoints.Count < 2)
+ return;
+
+ double leftX = Math.Min(topRowPoints.Min(point => point.X), bottomRowPoints.Min(point => point.X));
+ double rightX = Math.Max(topRowPoints.Max(point => point.X), bottomRowPoints.Max(point => point.X));
+
+ Outer3175XSpacing = Math.Round(rightX - leftX, 3, MidpointRounding.AwayFromZero);
+ Outer3175YSpacing = Math.Round(topY - bottomY, 3, MidpointRounding.AwayFromZero);
+ HasOuter3175Spacing = true;
+
+ Debug.WriteLine($"[3.175外围孔] X间距={Outer3175XSpacing:F3}, Y间距={Outer3175YSpacing:F3}");
+ }
+
+ ///
+ /// 从孔位文本中提取坐标点,统一转换为毫米
+ ///
+ private static List<(double X, double Y)> ExtractCoordinatePoints(IEnumerable holeLocations)
+ {
+ var points = new List<(double X, double Y)>();
+
+ foreach (var location in holeLocations)
+ {
+ var match = Regex.Match(location, @"X([+-]?\d+)Y([+-]?\d+)");
+ if (!match.Success)
+ continue;
+
+ double x = double.Parse(match.Groups[1].Value) / 1000.0;
+ double y = double.Parse(match.Groups[2].Value) / 1000.0;
+ points.Add((x, y));
+ }
+
+ return points;
+ }
+
///
/// 更新PP钻带间距信息
///
@@ -1767,18 +1859,7 @@ M30";
return;
// 解析孔位坐标
- var points = new List<(double X, double Y)>();
-
- foreach (var location in tool.HoleLocations)
- {
- var match = System.Text.RegularExpressions.Regex.Match(location, @"X([+-]?\d+)Y([+-]?\d+)");
- if (match.Success)
- {
- double x = double.Parse(match.Groups[1].Value) / 1000.0;
- double y = double.Parse(match.Groups[2].Value) / 1000.0;
- points.Add((x, y));
- }
- }
+ var points = ExtractCoordinatePoints(tool.HoleLocations);
if (points.Count != 4)
return;
diff --git a/StartupSelectionWindow.xaml b/StartupSelectionWindow.xaml
index 7f3fc68..1bfc317 100644
--- a/StartupSelectionWindow.xaml
+++ b/StartupSelectionWindow.xaml
@@ -19,6 +19,7 @@
+
@@ -71,6 +72,21 @@
Text="{Binding MinEADiameter, StringFormat=F3}" />
+
+
+
+
+
+
diff --git a/StartupSelectionWindow.xaml.cs b/StartupSelectionWindow.xaml.cs
index 90adf1b..d9df851 100644
--- a/StartupSelectionWindow.xaml.cs
+++ b/StartupSelectionWindow.xaml.cs
@@ -18,7 +18,8 @@ namespace DrillTools
public StartupSelectionWindow(string filePath, bool canClearParameters = false, bool canGeneratePpDrillTape = false,
double minDrillDiameter = 0, double minSlotDiameter = 0, double minEADiameter = 0,
- bool isPpDrillTape = false, double ppXSpacing = 0, double ppYSpacing = 0)
+ bool isPpDrillTape = false, double ppXSpacing = 0, double ppYSpacing = 0,
+ bool hasOuter3175Spacing = false, double outer3175XSpacing = 0, double outer3175YSpacing = 0)
{
InitializeComponent();
DataContext = new
@@ -29,7 +30,10 @@ namespace DrillTools
MinEADiameter = minEADiameter,
IsPpDrillTape = isPpDrillTape,
PpXSpacing = ppXSpacing,
- PpYSpacing = ppYSpacing
+ PpYSpacing = ppYSpacing,
+ HasOuter3175Spacing = hasOuter3175Spacing,
+ Outer3175XSpacing = outer3175XSpacing,
+ Outer3175YSpacing = outer3175YSpacing
};
ClearParametersButton.Visibility = canClearParameters ? Visibility.Visible : Visibility.Collapsed;
GeneratePpDrillTapeButton.Visibility = canGeneratePpDrillTape ? Visibility.Visible : Visibility.Collapsed;