Files
AohDrllTools/GenerateReorderedDrillTape_Implementation.md
2025-12-07 20:25:27 +08:00

5.4 KiB
Raw Permalink Blame History

GenerateReorderedDrillTape 方法实现方案

目标

GenerateReorderedDrillTape 静态扩展方法的功能升级,使其与 ReorderAndRenumberTools 方法完全一致。

当前问题分析

现有的 GenerateReorderedDrillTape 方法只实现简单的重排功能,缺少以下关键特性:

  1. 刀具重新编号T01, T02, T03...
  2. 机台码智能处理(保持原始编号)
  3. 完整的钻带内容重构逻辑
  4. 数据映射和同步机制

新实现方案

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. 实现优势

  1. 功能一致性: 与 ReorderAndRenumberTools 方法功能完全一致
  2. 向后兼容: 保持原有方法签名,现有调用代码无需修改
  3. 健壮性: 完整的错误处理和边界条件检查
  4. 可维护性: 清晰的代码结构和注释

5. 测试验证

需要验证以下场景:

  1. 普通刀具重排和重新编号
  2. 机台码刀具保持原始编号
  3. 混合场景(部分机台码、部分普通刀具)
  4. 坐标数据正确绑定
  5. 钻带格式正确性

实现建议

建议切换到 Code 模式进行实际的代码修改,因为 Architect 模式只能编辑 Markdown 文件。实现时应严格按照上述方案进行,确保与 ReorderAndRenumberTools 方法的行为完全一致。