5.4 KiB
5.4 KiB
GenerateReorderedDrillTape 方法实现方案
目标
将 GenerateReorderedDrillTape 静态扩展方法的功能升级,使其与 ReorderAndRenumberTools 方法完全一致。
当前问题分析
现有的 GenerateReorderedDrillTape 方法只实现简单的重排功能,缺少以下关键特性:
- 刀具重新编号(T01, T02, T03...)
- 机台码智能处理(保持原始编号)
- 完整的钻带内容重构逻辑
- 数据映射和同步机制
新实现方案
1. 方法签名保持不变
public static string GenerateReorderedDrillTape(string originalDrillTape, List<ToolItem> reorderedTools)
2. 核心实现逻辑
步骤1: 创建刀具编号映射
// 1. 创建原始刀具编号到新编号的映射
var toolNumberMapping = new Dictionary<int, int>();
var originalToNewMapping = new Dictionary<int, int>();
// 2. 按当前列表顺序重新编号(T01, T02, T03...)
int newToolNumber = 1;
foreach (var tool in reorderedTools)
{
// 机台码刀具不允许重新编号
if (tool.ToolType != ToolType.MachineCode)
{
originalToNewMapping[tool.ToolNumber] = newToolNumber;
toolNumberMapping[tool.ToolNumber] = newToolNumber;
tool.ToolNumber = newToolNumber++;
}
else
{
// 机台码刀具保持原始编号,但也要加入映射
toolNumberMapping[tool.ToolNumber] = tool.ToolNumber;
}
}
步骤2: 解析原始钻带内容
// 解析原始钻带中的刀具定义行,保存参数信息
var originalToolDefinitions = new Dictionary<int, string>();
var headerLines = new List<string>();
var lines = originalDrillTape.Split(new[] { '\r', '\n' }, StringSplitOptions.None);
foreach (var line in lines)
{
string trimmedLine = line.Trim();
if (trimmedLine == "%")
{
break;
}
// 处理刀具定义行(如 T01C1.049H05000Z+0.000S060.00F105.0U0700.0)
if (Regex.IsMatch(trimmedLine, @"^T(\d+)C"))
{
var match = Regex.Match(trimmedLine, @"^T(\d+)C(.*)$");
if (match.Success)
{
int originalToolNumber = int.Parse(match.Groups[1].Value);
originalToolDefinitions[originalToolNumber] = match.Groups[2].Value;
}
}
else
{
if (line != "")
headerLines.Add(line);
}
}
步骤3: 重构刀具定义部分
// 按照新的刀具编号顺序输出刀具定义部分
var sortedTools = reorderedTools.OrderBy(t => t.ToolNumber).ToList();
foreach (var tool in sortedTools)
{
// 查找原始刀具编号
int originalToolNumber = -1;
foreach (var kvp in toolNumberMapping)
{
if (kvp.Value == tool.ToolNumber)
{
originalToolNumber = kvp.Key;
break;
}
}
if (originalToolNumber != -1 && originalToolDefinitions.ContainsKey(originalToolNumber))
{
string toolDef = $"T{tool.ToolNumber:D2}C{originalToolDefinitions[originalToolNumber]}";
result.Add(toolDef);
}
}
步骤4: 处理坐标数据和机台码
// 按新刀具编号顺序输出刀具切换行和对应的坐标数据
var sortedToolsForData = reorderedTools.OrderBy(t => t.ToolNumber).ToList();
foreach (var tool in sortedToolsForData)
{
// 添加刀具切换行
result.Add($"T{tool.ToolNumber:D2}");
// 添加该刀具对应的所有坐标数据
if (tool.ToolType != ToolType.MachineCode && tool.HoleLocations != null && tool.HoleLocations.Count > 0)
{
foreach (var location in tool.HoleLocations)
{
result.Add(location);
}
}
// 如果是机台码刀具,添加机台码命令和坐标
if (tool.ToolType == ToolType.MachineCode)
{
if (!string.IsNullOrEmpty(tool.MachineCodeCommand) && !string.IsNullOrEmpty(tool.MachineCodeType))
{
result.Add($"{tool.MachineCodeCommand},{tool.MachineCodeType},$S $N");
// 添加机台码的坐标数据
if (tool.HoleLocations != null && tool.HoleLocations.Count > 0)
{
foreach (var location in tool.HoleLocations)
{
result.Add(location);
}
}
}
}
}
3. 关键特性实现
机台码处理逻辑
- 机台码刀具保持原始编号不变
- 机台码命令(M97/M98)和类型(A*/B*)正确保留
- 机台码坐标数据完整保留
数据映射机制
- 创建原始编号到新编号的完整映射
- 支持混合编号场景(部分重新编号)
- 确保坐标数据正确绑定到对应刀具
钻带内容重构
- 完整保留原始刀具参数
- 按新编号顺序重新组织钻带结构
- 确保格式和语法正确性
4. 实现优势
- 功能一致性: 与
ReorderAndRenumberTools方法功能完全一致 - 向后兼容: 保持原有方法签名,现有调用代码无需修改
- 健壮性: 完整的错误处理和边界条件检查
- 可维护性: 清晰的代码结构和注释
5. 测试验证
需要验证以下场景:
- 普通刀具重排和重新编号
- 机台码刀具保持原始编号
- 混合场景(部分机台码、部分普通刀具)
- 坐标数据正确绑定
- 钻带格式正确性
实现建议
建议切换到 Code 模式进行实际的代码修改,因为 Architect 模式只能编辑 Markdown 文件。实现时应严格按照上述方案进行,确保与 ReorderAndRenumberTools 方法的行为完全一致。