# GenerateReorderedDrillTape 方法实现方案 ## 目标 将 `GenerateReorderedDrillTape` 静态扩展方法的功能升级,使其与 `ReorderAndRenumberTools` 方法完全一致。 ## 当前问题分析 现有的 `GenerateReorderedDrillTape` 方法只实现简单的重排功能,缺少以下关键特性: 1. 刀具重新编号(T01, T02, T03...) 2. 机台码智能处理(保持原始编号) 3. 完整的钻带内容重构逻辑 4. 数据映射和同步机制 ## 新实现方案 ### 1. 方法签名保持不变 ```csharp public static string GenerateReorderedDrillTape(string originalDrillTape, List reorderedTools) ``` ### 2. 核心实现逻辑 #### 步骤1: 创建刀具编号映射 ```csharp // 1. 创建原始刀具编号到新编号的映射 var toolNumberMapping = new Dictionary(); var originalToNewMapping = new Dictionary(); // 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: 解析原始钻带内容 ```csharp // 解析原始钻带中的刀具定义行,保存参数信息 var originalToolDefinitions = new Dictionary(); var headerLines = new List(); 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: 重构刀具定义部分 ```csharp // 按照新的刀具编号顺序输出刀具定义部分 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: 处理坐标数据和机台码 ```csharp // 按新刀具编号顺序输出刀具切换行和对应的坐标数据 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` 方法的行为完全一致。