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

@@ -35,7 +35,8 @@ namespace DrillTools
ShutdownMode = ShutdownMode.OnExplicitShutdown;
bool canClearParameters = CanClearDrillTapeParameters(filePath);
var selectionWindow = new StartupSelectionWindow(filePath, canClearParameters);
bool canGeneratePpDrillTape = CanGeneratePpDrillTape(filePath);
var selectionWindow = new StartupSelectionWindow(filePath, canClearParameters, canGeneratePpDrillTape);
selectionWindow.ShowDialog();
switch (selectionWindow.SelectedAction)
@@ -52,6 +53,10 @@ namespace DrillTools
PerformParameterCleanup(filePath);
Shutdown();
break;
case StartupAction.GeneratePpDrillTape:
PerformPpDrillTapeGeneration(filePath);
Shutdown();
break;
default:
Shutdown();
break;
@@ -115,6 +120,53 @@ namespace DrillTools
}
}
private static bool CanGeneratePpDrillTape(string filePath)
{
try
{
var viewModel = new MainWindowViewModel
{
IsStartupDrillTapeFile = true,
OriginalFilePath = filePath
};
string content = CommandTypeFileReader.ReadAllText(filePath);
viewModel.LoadToolsFromDrillTape(content);
return viewModel.CanGeneratePpDrillTape;
}
catch
{
return false;
}
}
private static void PerformPpDrillTapeGeneration(string filePath)
{
try
{
var viewModel = new MainWindowViewModel
{
IsStartupDrillTapeFile = true,
OriginalFilePath = filePath
};
string content = CommandTypeFileReader.ReadAllText(filePath);
viewModel.LoadToolsFromDrillTape(content);
string outputFilePath = viewModel.GeneratePpDrillTape();
System.Windows.MessageBox.Show(
$"PP钻带已生成\n{outputFilePath}",
"生成PP钻带完成",
MessageBoxButton.OK,
MessageBoxImage.Information);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show($"生成PP钻带失败\n{ex.Message}",
"错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
private static void PerformParameterCleanup(string filePath)
{
try

View File

@@ -64,6 +64,12 @@
Click="ApplyOrderButton_Click"
Content="应用并保存"
IsEnabled="{Binding HasOriginalFile}" />
<Button
Name="GeneratePpDrillTapeButton"
Click="GeneratePpDrillTapeButton_Click"
Content="生成PP钻带"
IsEnabled="{Binding CanGeneratePpDrillTape}"
Visibility="{Binding CanGeneratePpDrillTape, Converter={StaticResource BooleanToVisibilityConverter}}" />
<Button
Name="ToggleTopmostButton"
Click="ToggleTopmostButton_Click"

View File

@@ -25,6 +25,7 @@ namespace DrillTools
//System.Diagnostics.Debug.WriteLine("创建 MainWindowViewModel...");
var viewModel = new MainWindowViewModel();
//System.Diagnostics.Debug.WriteLine("MainWindowViewModel 创建完成");
viewModel.IsStartupDrillTapeFile = !string.IsNullOrEmpty(initialFilePath);
//System.Diagnostics.Debug.WriteLine("设置 DataContext...");
DataContext = viewModel;
@@ -76,6 +77,7 @@ namespace DrillTools
try
{
// 保存原始文件路径
viewModel.IsStartupDrillTapeFile = true;
viewModel.OriginalFilePath = filePath;
// 加载钻带内容
@@ -141,6 +143,7 @@ namespace DrillTools
try
{
// 保存原始文件路径
ViewModel.IsStartupDrillTapeFile = false;
ViewModel.OriginalFilePath = openFileDialog.FileName;
string drillTapeContent = CommandTypeFileReader.ReadAllText(openFileDialog.FileName);
@@ -217,6 +220,22 @@ namespace DrillTools
}
}
/// <summary>
/// 生成 PP 钻带按钮点击事件
/// </summary>
private void GeneratePpDrillTapeButton_Click(object sender, RoutedEventArgs e)
{
try
{
string outputFilePath = ViewModel.GeneratePpDrillTape();
System.Windows.MessageBox.Show($"PP钻带已生成\n{outputFilePath}", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
}
catch (Exception ex)
{
System.Windows.MessageBox.Show($"生成PP钻带失败: {ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
/// <summary>
/// 生成排序种子按钮点击事件
/// </summary>
@@ -327,6 +346,7 @@ namespace DrillTools
try
{
// 保存原始文件路径
ViewModel.IsStartupDrillTapeFile = false;
ViewModel.OriginalFilePath = files[0];
string drillTapeContent = CommandTypeFileReader.ReadAllText(files[0]);

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))

View File

@@ -2,7 +2,7 @@
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="选择功能"
Width="430"
Width="570"
SizeToContent="Height"
ResizeMode="NoResize"
WindowStartupLocation="CenterScreen">
@@ -19,7 +19,8 @@
<StackPanel Grid.Row="2" HorizontalAlignment="Center" Orientation="Horizontal">
<Button Width="120" Height="30" Content="调整刀序" Margin="0,0,15,0" Click="AdjustToolOrder_Click"/>
<Button Width="120" Height="30" Content="导出孔数" Margin="0,0,15,0" Click="ExportHoleCount_Click"/>
<Button Name="ClearParametersButton" Width="120" Height="30" Content="清空参数" Click="ClearParameters_Click"/>
<Button Name="ClearParametersButton" Width="120" Height="30" Content="清空参数" Margin="0,0,15,0" Click="ClearParameters_Click"/>
<Button Name="GeneratePpDrillTapeButton" Width="120" Height="30" Content="生成PP钻带" Click="GeneratePpDrillTape_Click"/>
</StackPanel>
</Grid>
</Window>

View File

@@ -8,18 +8,20 @@ namespace DrillTools
None,
AdjustToolOrder,
ExportHoleCount,
ClearParameters
ClearParameters,
GeneratePpDrillTape
}
public partial class StartupSelectionWindow : Window
{
public StartupAction SelectedAction { get; private set; } = StartupAction.None;
public StartupSelectionWindow(string filePath, bool canClearParameters = false)
public StartupSelectionWindow(string filePath, bool canClearParameters = false, bool canGeneratePpDrillTape = false)
{
InitializeComponent();
DataContext = new { FileName = Path.GetFileName(filePath) };
ClearParametersButton.Visibility = canClearParameters ? Visibility.Visible : Visibility.Collapsed;
GeneratePpDrillTapeButton.Visibility = canGeneratePpDrillTape ? Visibility.Visible : Visibility.Collapsed;
}
private void AdjustToolOrder_Click(object sender, RoutedEventArgs e)
@@ -39,5 +41,11 @@ namespace DrillTools
SelectedAction = StartupAction.ClearParameters;
Close();
}
private void GeneratePpDrillTape_Click(object sender, RoutedEventArgs e)
{
SelectedAction = StartupAction.GeneratePpDrillTape;
Close();
}
}
}