From d4ecad60775662d84cb41e7635d7a843ddb31f2a Mon Sep 17 00:00:00 2001 From: "Mr.Xia" <1424473282@qq.com> Date: Fri, 7 Aug 2026 10:35:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20DRL=E6=97=A0=E5=8F=82=E6=95=B0=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=9B=BF=E6=8D=A2bug=20=E2=80=94=20=E5=88=80=E5=BE=84?= =?UTF-8?q?=E8=A1=8C=E6=97=A0H=E5=8F=82=E6=95=B0=E6=AE=B5=E6=97=B6?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0=E5=8F=82=E6=95=B0=E6=AE=B5=EF=BC=9BM48?= =?UTF-8?q?=E5=90=8E=E9=9D=9E=E6=B3=A8=E9=87=8A=E8=A1=8C=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E8=A6=86=E7=9B=96=EF=BC=8C=E6=94=B9=E4=B8=BA=E6=8F=92=E5=85=A5?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrlParameterReplacer.cs | 139 ++++++++++++++++++++++++---------------- 1 file changed, 83 insertions(+), 56 deletions(-) diff --git a/DrlParameterReplacer.cs b/DrlParameterReplacer.cs index 9b7394e..7752199 100644 --- a/DrlParameterReplacer.cs +++ b/DrlParameterReplacer.cs @@ -9,7 +9,7 @@ namespace DrillTools { /// /// DRL 钻带参数替换:将 A01-A14 参数文件中的 H/Z/S/F/U 参数替换到 .drl 文件的刀径定义行。 - /// 与 ROU 不同,DRL 刀径行原本已有参数,此处为整体替换而非追加。 + /// 与 ROU 不同,DRL 刀径行通常已有参数,此处为整体替换;对无参数段的刀径行则追加参数段。 /// internal static class DrlParameterReplacer { @@ -25,12 +25,13 @@ namespace DrillTools RegexOptions.Compiled | RegexOptions.IgnoreCase); /// - /// 匹配 .drl 刀径定义行:T<刀号>C<直径> + 参数段 - /// 例:T01C0.799H05000Z+0.000S060.00F105.0U0700.0 - /// → prefix="T01C0.799", params="H05000Z+0.000S060.00F105.0U0700.0" + /// 匹配 .drl 刀径定义行:T<刀号>C<直径>,参数段(H...)可选 + /// 例:T01C0.799H05000Z+0.000S060.00F105.0U0700.0 → prefix="T01C0.799" + /// T01C0.799(无参数段)→ prefix="T01C0.799" + /// 匹配后统一重建为 prefix + 参数文件参数段:已有参数段整体替换,无参数段则追加。 /// private static readonly Regex ToolLinePattern = new( - @"^\s*(?T\d+C\d+(?:\.\d+)?)(?H.+)$", + @"^\s*(?T\d+C\d+(?:\.\d+)?)(?:H.+)?$", RegexOptions.Compiled | RegexOptions.IgnoreCase); /// @@ -133,8 +134,8 @@ namespace DrillTools /// /// 在 .drl 文件内容中执行参数替换: - /// 1. 第2行(注释行)替换为参数文件的描述 - /// 2. M48~% 区域内按直径匹配替换刀径行的参数段 + /// 1. M48 后一行若是注释行则替换为参数文件的描述;否则原样保留并在 M48 后插入描述行 + /// 2. M48~% 区域内按直径匹配替换刀径行的参数段(无参数段的刀径行追加参数段) /// private static string ReplaceParametersInContent( string drlContent, @@ -169,60 +170,32 @@ namespace DrillTools { if (i == headerStart + 1) { - // 第2行:替换为参数文件的描述注释行 - string trailing = GetTrailingWhitespace(lines[i]); - builder.Append(';'); - builder.Append(paramDescription); - builder.Append(trailing); - builder.Append(lines[i].LineEnding); + // M48 下一行:若是注释行则替换为参数文件的描述; + // 否则(如工具定义行)原样保留,并在其前(M48 后)插入描述行,不破坏数据; + // 该行本身仍按刀径行规则处理(替换/追加/未匹配)。 + string trimmed = lines[i].Text.Trim(); + + if (trimmed.StartsWith(";")) + { + string trailing = GetTrailingWhitespace(lines[i]); + builder.Append(';'); + builder.Append(paramDescription); + builder.Append(trailing); + builder.Append(lines[i].LineEnding); + } + else + { + builder.Append(';'); + builder.Append(paramDescription); + builder.Append(lines[i].LineEnding); + AppendToolLine(builder, lines[i], trimmed, paramDict, unmatchedDiameters); + } } else if (i > headerStart && i < headerEnd) { // 头部区域(M48 和 % 之间,排除已处理的第2行) string trimmed = lines[i].Text.Trim(); - var match = ToolLinePattern.Match(trimmed); - - if (match.Success) - { - string prefix = match.Groups["prefix"].Value; - string trailing = GetTrailingWhitespace(lines[i]); - - // 从 prefix 中提取直径 - var diaMatch = ToolLineDiameterPattern.Match(prefix); - if (diaMatch.Success && - double.TryParse(diaMatch.Groups["diameter"].Value, - NumberStyles.Float, CultureInfo.InvariantCulture, out double diameter)) - { - double roundedDiameter = Math.Round(diameter, 3); - - if (paramDict.TryGetValue(roundedDiameter, out string? newParams)) - { - builder.Append(prefix); - builder.Append(newParams); - builder.Append(trailing); - builder.Append(lines[i].LineEnding); - } - else - { - // 未匹配:保留原行 - unmatchedDiameters.Add(roundedDiameter); - builder.Append(lines[i].Text); - builder.Append(lines[i].LineEnding); - } - } - else - { - // 无法提取直径,保留原行 - builder.Append(lines[i].Text); - builder.Append(lines[i].LineEnding); - } - } - else - { - // 非刀径行(如其他注释等)原样保留 - builder.Append(lines[i].Text); - builder.Append(lines[i].LineEnding); - } + AppendToolLine(builder, lines[i], trimmed, paramDict, unmatchedDiameters); } else { @@ -235,6 +208,60 @@ namespace DrillTools return builder.ToString(); } + /// + /// 按刀径行规则追加一行:匹配直径则重建为 prefix + 参数文件参数段( + /// 已有参数段整体替换,无参数段则追加);未匹配或非刀径行保留原行, + /// 未匹配直径计入 unmatchedDiameters。 + /// + private static void AppendToolLine( + StringBuilder builder, + DrillTapeLine line, + string trimmed, + Dictionary paramDict, + HashSet unmatchedDiameters) + { + var match = ToolLinePattern.Match(trimmed); + if (!match.Success) + { + // 非刀径行(如其他注释等)原样保留 + builder.Append(line.Text); + builder.Append(line.LineEnding); + return; + } + + string prefix = match.Groups["prefix"].Value; + string trailing = GetTrailingWhitespace(line); + + // 从 prefix 中提取直径 + var diaMatch = ToolLineDiameterPattern.Match(prefix); + if (!diaMatch.Success || + !double.TryParse(diaMatch.Groups["diameter"].Value, + NumberStyles.Float, CultureInfo.InvariantCulture, out double diameter)) + { + // 无法提取直径,保留原行 + builder.Append(line.Text); + builder.Append(line.LineEnding); + return; + } + + double roundedDiameter = Math.Round(diameter, 3); + + if (paramDict.TryGetValue(roundedDiameter, out string? newParams)) + { + builder.Append(prefix); + builder.Append(newParams); + builder.Append(trailing); + builder.Append(line.LineEnding); + } + else + { + // 未匹配:保留原行 + unmatchedDiameters.Add(roundedDiameter); + builder.Append(line.Text); + builder.Append(line.LineEnding); + } + } + /// /// 获取行尾空白字符。 ///