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);
+ }
+ }
+
///
/// 获取行尾空白字符。
///