添加项目文件。
This commit is contained in:
180
GenerateReorderedDrillTape_Implementation.md
Normal file
180
GenerateReorderedDrillTape_Implementation.md
Normal file
@@ -0,0 +1,180 @@
|
||||
# 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` 方法的行为完全一致。
|
||||
Reference in New Issue
Block a user