BGA自动检测工具:BGA检测结果以半透明图层叠加在canvas上、添加图标,统一按钮样式

This commit is contained in:
李伟
2026-04-29 09:30:24 +08:00
parent 1a379eebea
commit b87480a30f
5 changed files with 131 additions and 40 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 390 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 608 B

@@ -94,6 +94,7 @@ namespace XplorePlane.ViewModels.ImageProcessing
private PolygonRoiCanvas _canvas;
private PolygonROI _roiShape;
private System.Windows.Controls.Image _resultOverlayImage;
public void SetCanvas(PolygonRoiCanvas canvas)
{
@@ -215,6 +216,43 @@ namespace XplorePlane.ViewModels.ImageProcessing
}
_canvas.SelectedROI = null;
}
// 关闭面板时不清除结果叠加层,保留显示
}
private void ShowResultOnOverlay(BitmapSource resultBmp)
{
if (_canvas == null || resultBmp == null) return;
// 移除旧的结果图层
RemoveResultOverlay();
// 创建新的结果图层叠加到 canvas 上(插入到背景图之后、ROI之前)
_resultOverlayImage = new System.Windows.Controls.Image
{
Source = resultBmp,
IsHitTestVisible = false,
Opacity = 0.85,
Stretch = System.Windows.Media.Stretch.Fill
};
_resultOverlayImage.SetBinding(System.Windows.FrameworkElement.WidthProperty,
new System.Windows.Data.Binding("CanvasWidth") { Source = _canvas });
_resultOverlayImage.SetBinding(System.Windows.FrameworkElement.HeightProperty,
new System.Windows.Data.Binding("CanvasHeight") { Source = _canvas });
var mainCanvas = _canvas.FindName("mainCanvas") as System.Windows.Controls.Canvas;
if (mainCanvas != null)
{
// 插入到索引1(背景图是索引0),这样ROI和测量overlay在上面
int insertIndex = Math.Min(1, mainCanvas.Children.Count);
mainCanvas.Children.Insert(insertIndex, _resultOverlayImage);
}
}
public void RemoveResultOverlay()
{
if (_resultOverlayImage == null || _canvas == null) return;
_canvas.RemoveFromCanvas(_resultOverlayImage);
_resultOverlayImage = null;
}
private string _resultText = "结果: --";
@@ -311,9 +349,8 @@ namespace XplorePlane.ViewModels.ImageProcessing
// 绘制结果到图像
ResultImage = RenderResults(grayImage, output);
// 将结果图像推送到主界面显示
if (ResultImage != null)
_viewportService?.SetManualImage(ResultImage, "BGA检测结果");
// 将结果叠加到 canvas overlay 上
ShowResultOnOverlay(ResultImage);
grayImage.Dispose();
}
@@ -14,39 +14,81 @@
<!-- 左侧:参数面板 -->
<ScrollViewer Grid.Column="0" VerticalScrollBarVisibility="Auto">
<StackPanel Margin="10">
<ToggleButton IsChecked="{Binding RoiEnabled}" Margin="0,0,0,6" Padding="8,4" Cursor="Hand" ToolTip="启用ROI区域">
<ToggleButton.Style>
<Style TargetType="ToggleButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border x:Name="Bd" Background="#EEEEEE" BorderBrush="#CCCCCC"
BorderThickness="1" CornerRadius="3" Padding="10,4">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#0078D7" />
<Setter TargetName="Bd" Property="BorderBrush" Value="#005A9E" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#DDDDDD" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="IsChecked" Value="True" />
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="Background" Value="#006CBE" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ToggleButton.Style>
<Image Source="/Assets/Icons/polygon.png" Width="20" Height="20" />
</ToggleButton>
<WrapPanel Margin="0,0,0,6">
<ToggleButton IsChecked="{Binding RoiEnabled}" Padding="8,4" Margin="0,0,6,0" Cursor="Hand" ToolTip="启用ROI区域">
<ToggleButton.Style>
<Style TargetType="ToggleButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<Border x:Name="Bd" Background="#EEEEEE" BorderBrush="#CCCCCC"
BorderThickness="1" CornerRadius="3" Padding="10,4">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#0078D7" />
<Setter TargetName="Bd" Property="BorderBrush" Value="#005A9E" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#DDDDDD" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsMouseOver" Value="True" />
<Condition Property="IsChecked" Value="True" />
</MultiTrigger.Conditions>
<Setter TargetName="Bd" Property="Background" Value="#006CBE" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ToggleButton.Style>
<Image Source="/Assets/Icons/polygon.png" Width="20" Height="20" />
</ToggleButton>
<Button Padding="8,4" Margin="0,0,6,0" Command="{Binding ExecuteCommand}" ToolTip="执行检测" Cursor="Hand">
<Button.Template>
<ControlTemplate TargetType="Button">
<Border x:Name="Bd" Background="#EEEEEE" BorderBrush="#CCCCCC"
BorderThickness="1" CornerRadius="3" Padding="10,4">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#DDDDDD" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#0078D7" />
<Setter TargetName="Bd" Property="BorderBrush" Value="#005A9E" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
<Image Source="/Assets/Icons/run32.png" Width="20" Height="20" />
</Button>
<Button Padding="8,4" Click="Close_Click" ToolTip="关闭" Cursor="Hand">
<Button.Template>
<ControlTemplate TargetType="Button">
<Border x:Name="Bd" Background="#EEEEEE" BorderBrush="#CCCCCC"
BorderThickness="1" CornerRadius="3" Padding="10,4">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#DDDDDD" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="Bd" Property="Background" Value="#0078D7" />
<Setter TargetName="Bd" Property="BorderBrush" Value="#005A9E" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
<Image Source="/Assets/Icons/ok.png" Width="20" Height="20" />
</Button>
</WrapPanel>
<TextBlock Text="BGA定位参数" FontWeight="SemiBold" Margin="0,0,0,6" />
<TextBlock Text="焊球最小面积" FontSize="11" Margin="0,0,0,2" />
<DockPanel Margin="0,0,0,6">
@@ -97,10 +139,6 @@
</DockPanel>
<Separator Margin="0,4" />
<TextBlock Text="{Binding ResultText}" FontSize="14" FontWeight="SemiBold" Margin="0,4,0,8" />
<WrapPanel HorizontalAlignment="Center">
<Button Content="执行检测" Padding="16,6" Margin="0,0,8,0" Command="{Binding ExecuteCommand}" />
<Button Content="关闭" Padding="16,6" Click="Close_Click" />
</WrapPanel>
</StackPanel>
</ScrollViewer>