fix: DRL无参数文件替换bug — 刀径行无H参数段时追加参数段;M48后非注释行不再覆盖,改为插入描述行
This commit is contained in:
@@ -9,7 +9,7 @@ namespace DrillTools
|
|||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// DRL 钻带参数替换:将 A01-A14 参数文件中的 H/Z/S/F/U 参数替换到 .drl 文件的刀径定义行。
|
/// DRL 钻带参数替换:将 A01-A14 参数文件中的 H/Z/S/F/U 参数替换到 .drl 文件的刀径定义行。
|
||||||
/// 与 ROU 不同,DRL 刀径行原本已有参数,此处为整体替换而非追加。
|
/// 与 ROU 不同,DRL 刀径行通常已有参数,此处为整体替换;对无参数段的刀径行则追加参数段。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
internal static class DrlParameterReplacer
|
internal static class DrlParameterReplacer
|
||||||
{
|
{
|
||||||
@@ -25,12 +25,13 @@ namespace DrillTools
|
|||||||
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 匹配 .drl 刀径定义行:T<刀号>C<直径> + 参数段
|
/// 匹配 .drl 刀径定义行:T<刀号>C<直径>,参数段(H...)可选
|
||||||
/// 例:T01C0.799H05000Z+0.000S060.00F105.0U0700.0
|
/// 例:T01C0.799H05000Z+0.000S060.00F105.0U0700.0 → prefix="T01C0.799"
|
||||||
/// → prefix="T01C0.799", params="H05000Z+0.000S060.00F105.0U0700.0"
|
/// T01C0.799(无参数段)→ prefix="T01C0.799"
|
||||||
|
/// 匹配后统一重建为 prefix + 参数文件参数段:已有参数段整体替换,无参数段则追加。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static readonly Regex ToolLinePattern = new(
|
private static readonly Regex ToolLinePattern = new(
|
||||||
@"^\s*(?<prefix>T\d+C\d+(?:\.\d+)?)(?<params>H.+)$",
|
@"^\s*(?<prefix>T\d+C\d+(?:\.\d+)?)(?:H.+)?$",
|
||||||
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -133,8 +134,8 @@ namespace DrillTools
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 在 .drl 文件内容中执行参数替换:
|
/// 在 .drl 文件内容中执行参数替换:
|
||||||
/// 1. 第2行(注释行)替换为参数文件的描述
|
/// 1. M48 后一行若是注释行则替换为参数文件的描述;否则原样保留并在 M48 后插入描述行
|
||||||
/// 2. M48~% 区域内按直径匹配替换刀径行的参数段
|
/// 2. M48~% 区域内按直径匹配替换刀径行的参数段(无参数段的刀径行追加参数段)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static string ReplaceParametersInContent(
|
private static string ReplaceParametersInContent(
|
||||||
string drlContent,
|
string drlContent,
|
||||||
@@ -169,60 +170,32 @@ namespace DrillTools
|
|||||||
{
|
{
|
||||||
if (i == headerStart + 1)
|
if (i == headerStart + 1)
|
||||||
{
|
{
|
||||||
// 第2行:替换为参数文件的描述注释行
|
// M48 下一行:若是注释行则替换为参数文件的描述;
|
||||||
|
// 否则(如工具定义行)原样保留,并在其前(M48 后)插入描述行,不破坏数据;
|
||||||
|
// 该行本身仍按刀径行规则处理(替换/追加/未匹配)。
|
||||||
|
string trimmed = lines[i].Text.Trim();
|
||||||
|
|
||||||
|
if (trimmed.StartsWith(";"))
|
||||||
|
{
|
||||||
string trailing = GetTrailingWhitespace(lines[i]);
|
string trailing = GetTrailingWhitespace(lines[i]);
|
||||||
builder.Append(';');
|
builder.Append(';');
|
||||||
builder.Append(paramDescription);
|
builder.Append(paramDescription);
|
||||||
builder.Append(trailing);
|
builder.Append(trailing);
|
||||||
builder.Append(lines[i].LineEnding);
|
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)
|
else if (i > headerStart && i < headerEnd)
|
||||||
{
|
{
|
||||||
// 头部区域(M48 和 % 之间,排除已处理的第2行)
|
// 头部区域(M48 和 % 之间,排除已处理的第2行)
|
||||||
string trimmed = lines[i].Text.Trim();
|
string trimmed = lines[i].Text.Trim();
|
||||||
var match = ToolLinePattern.Match(trimmed);
|
AppendToolLine(builder, lines[i], trimmed, paramDict, unmatchedDiameters);
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -235,6 +208,60 @@ namespace DrillTools
|
|||||||
return builder.ToString();
|
return builder.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 按刀径行规则追加一行:匹配直径则重建为 prefix + 参数文件参数段(
|
||||||
|
/// 已有参数段整体替换,无参数段则追加);未匹配或非刀径行保留原行,
|
||||||
|
/// 未匹配直径计入 unmatchedDiameters。
|
||||||
|
/// </summary>
|
||||||
|
private static void AppendToolLine(
|
||||||
|
StringBuilder builder,
|
||||||
|
DrillTapeLine line,
|
||||||
|
string trimmed,
|
||||||
|
Dictionary<double, string> paramDict,
|
||||||
|
HashSet<double> 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取行尾空白字符。
|
/// 获取行尾空白字符。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user