From ce81e1cf7d4dda16c0be665b3e5f6fa3ed555526 Mon Sep 17 00:00:00 2001 From: "Mr.Xia" <1424473282@qq.com> Date: Mon, 25 May 2026 10:15:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=98=BE=E7=A4=BA=203.175=20=E5=A4=96=E5=9B=B4?= =?UTF-8?q?=E5=AD=94=E9=97=B4=E8=B7=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App.xaml.cs | 17 +++++- MainWindow.xaml | 16 +++++ MainWindowViewModel.cs | 105 +++++++++++++++++++++++++++++---- StartupSelectionWindow.xaml | 16 +++++ StartupSelectionWindow.xaml.cs | 8 ++- 5 files changed, 147 insertions(+), 15 deletions(-) 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;