添加项目文件。

This commit is contained in:
2025-12-07 20:25:27 +08:00
parent 52ad3bd1e4
commit b866365968
31 changed files with 16642 additions and 0 deletions

View 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` 方法的行为完全一致。