diff --git a/MainWindowViewModel.cs b/MainWindowViewModel.cs index 43cbec1..2a6ee9c 100644 --- a/MainWindowViewModel.cs +++ b/MainWindowViewModel.cs @@ -46,9 +46,16 @@ namespace DrillTools private const int SvsiEnsureVisible = 0x8; private const int SvsiFocused = 0x10; private const int SelectFileFlags = SvsiSelect | SvsiDeselectOthers | SvsiEnsureVisible | SvsiFocused; - private const double PpSourceDiameter = 3.203; + private static readonly double[] PpSourceDiameters = { 3.203, 4.503 }; private const int PpSideCoordinateTolerance = 1500; + /// + /// PP 钻带来源孔径集合(3.203 PP 定位孔 / 4.503 铆钉孔)。 + /// 比较使用容差 < 0.001,与 同风格。 + /// + private static bool IsPpSourceDiameter(double diameter) + => PpSourceDiameters.Any(d => Math.Abs(diameter - d) < 0.001); + [DllImport("user32.dll")] private static extern bool SetForegroundWindow(IntPtr hWnd); @@ -1226,7 +1233,7 @@ M30"; return null; var sourceTool = OriginalTools[OriginalTools.Count - 2]; - if (Math.Abs(sourceTool.Diameter - PpSourceDiameter) >= 0.001) + if (!IsPpSourceDiameter(sourceTool.Diameter)) return null; if (sourceTool.TotalHoles != 3) @@ -1249,7 +1256,7 @@ M30"; private PpGenerationRule? GetOuterPpGenerationRule() { var sourceTool = OriginalTools.FirstOrDefault(tool => - Math.Abs(tool.Diameter - PpSourceDiameter) < 0.001 + IsPpSourceDiameter(tool.Diameter) && (tool.TotalHoles == 13 || tool.TotalHoles == 15) && tool.HoleLocations != null && tool.HoleLocations.Count >= 4 @@ -1261,13 +1268,13 @@ M30"; } /// - /// 从 3.203 外框孔中按右、上、左、下四边各取一个中位孔,并保持原钻带坐标文本。 + /// 从 PP 来源孔径(3.203 PP 定位孔 / 4.503 铆钉孔)外框中按右、上、左、下四边各取一个中位孔,并保持原钻带坐标文本。 /// private static List SelectPpDrillTapeLocations(ToolItem sourceTool) { var points = ParsePpHolePoints(sourceTool.HoleLocations); if (points.Count < 4) - throw new InvalidOperationException("3.203 刀具坐标不足,无法生成 PP 钻带"); + throw new InvalidOperationException("PP 来源孔径刀具坐标不足,无法生成 PP 钻带"); int minX = points.Min(point => point.X); int maxX = points.Max(point => point.X); @@ -1283,7 +1290,7 @@ M30"; }; if (selected.Any(point => point == null)) - throw new InvalidOperationException("3.203 刀具未形成完整的上下左右四边孔位,无法生成 PP 钻带"); + throw new InvalidOperationException("PP 来源孔径刀具未形成完整的上下左右四边孔位,无法生成 PP 钻带"); var selectedTexts = selected .Select(point => point!.Text) @@ -1291,9 +1298,9 @@ M30"; .ToHashSet(StringComparer.Ordinal); if (selectedTexts.Count != 4) - throw new InvalidOperationException("3.203 刀具四边中位孔存在重复,无法生成 PP 钻带"); + throw new InvalidOperationException("PP 来源孔径刀具四边中位孔存在重复,无法生成 PP 钻带"); - // 输出顺序沿用原 3.203 刀具中的孔位顺序,避免改变已有钻带坐标排序习惯。 + // 输出顺序沿用原 PP 来源孔径刀具(3.203/4.503)中的孔位顺序,避免改变已有钻带坐标排序习惯。 return points .Where(point => selectedTexts.Contains(point.Text)) .Select(point => point.Text)