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

180 lines
5.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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