Add startup PP drill tape generation

This commit is contained in:
2026-05-21 13:16:39 +08:00
parent 951486202e
commit 25a7458db3
6 changed files with 200 additions and 5 deletions

View File

@@ -30,6 +30,8 @@ namespace DrillTools
private double _minDrillDiameter;
private double _minSlotDiameter;
private double _minEADiameter;
private bool _isStartupDrillTapeFile;
private bool _canGeneratePpDrillTape;
/// <summary>
/// 刀具列表
@@ -104,6 +106,8 @@ namespace DrillTools
{
FileNameWithoutExtension = string.Empty;
}
UpdatePpDrillTapeState();
}
}
}
@@ -122,6 +126,30 @@ namespace DrillTools
/// </summary>
public bool HasOriginalFile => !string.IsNullOrEmpty(OriginalFilePath);
/// <summary>
/// 当前文件是否来自启动参数
/// </summary>
public bool IsStartupDrillTapeFile
{
get => _isStartupDrillTapeFile;
set
{
if (SetProperty(ref _isStartupDrillTapeFile, value))
{
UpdatePpDrillTapeState();
}
}
}
/// <summary>
/// 是否可以生成 PP 钻带
/// </summary>
public bool CanGeneratePpDrillTape
{
get => _canGeneratePpDrillTape;
private set => SetProperty(ref _canGeneratePpDrillTape, value);
}
/// <summary>
/// 窗口是否置顶
/// </summary>
@@ -291,15 +319,19 @@ namespace DrillTools
{
CheckAndApplySortFile(OriginalFilePath, Tools);
}
UpdatePpDrillTapeState();
}
else
{
System.Windows.MessageBox.Show($"解析钻带失败: {result.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
UpdatePpDrillTapeState();
}
}
catch (Exception ex)
{
System.Windows.MessageBox.Show($"解析钻带时发生异常: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
UpdatePpDrillTapeState();
}
}
@@ -1081,6 +1113,82 @@ M30";
OpenFileExplorerAndSelectFile(outputFilePath);
}
/// <summary>
/// 生成 PP 钻带文件
/// </summary>
/// <returns>生成的文件路径</returns>
public string GeneratePpDrillTape()
{
var sourceTool = GetPpSourceTool();
if (sourceTool == null)
throw new InvalidOperationException("当前钻带不满足生成 PP 钻带条件");
var locations = sourceTool.HoleLocations
.Where(location => !string.IsNullOrWhiteSpace(location))
.Take(2)
.Select(location => location.Trim())
.ToList();
if (locations.Count < 2)
throw new InvalidOperationException("3.203 刀具坐标不足,无法生成 PP 钻带");
string outputFilePath = GetPpDrillTapeOutputPath();
var ppDrillTape = new StringBuilder();
ppDrillTape.AppendLine("M48");
ppDrillTape.AppendLine("T01C4.");
ppDrillTape.AppendLine("%");
ppDrillTape.AppendLine("T01");
ppDrillTape.AppendLine(locations[0]);
ppDrillTape.AppendLine(locations[1]);
ppDrillTape.AppendLine("M30");
File.WriteAllText(outputFilePath, ppDrillTape.ToString(), CreateGb2312Encoding());
OpenFileExplorerAndSelectFile(outputFilePath);
return outputFilePath;
}
private void UpdatePpDrillTapeState()
{
CanGeneratePpDrillTape = GetPpSourceTool() != null;
}
private ToolItem? GetPpSourceTool()
{
if (!IsStartupDrillTapeFile || !HasOriginalFile || OriginalTools.Count < 2)
return null;
var sourceTool = OriginalTools[OriginalTools.Count - 2];
if (Math.Abs(sourceTool.Diameter - 3.203) >= 0.001)
return null;
if (sourceTool.TotalHoles != 3)
return null;
if (sourceTool.HoleLocations == null || sourceTool.HoleLocations.Count < 2)
return null;
return sourceTool;
}
private string GetPpDrillTapeOutputPath()
{
string directory = Path.GetDirectoryName(OriginalFilePath) ?? string.Empty;
string partNumber = ExtractPpPartNumber(FileNameWithoutExtension);
return Path.Combine(directory, $"{partNumber}-pp.drl");
}
private static string ExtractPpPartNumber(string fileNameWithoutExtension)
{
var parts = fileNameWithoutExtension
.Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries)
.Where(part => !part.Equals("cs", StringComparison.OrdinalIgnoreCase)
&& !part.Equals("jp", StringComparison.OrdinalIgnoreCase))
.ToList();
return parts.Count > 0 ? string.Join("-", parts) : fileNameWithoutExtension;
}
private static void ConfirmOverwriteReport(string outputFilePath)
{
if (!File.Exists(outputFilePath))