BGA自动检测工具:BGA检测结果以半透明图层叠加在canvas上、添加图标,统一按钮样式
This commit is contained in:
@@ -477,9 +477,25 @@ namespace XP.ImageProcessing.RoiControl.Controls
|
|||||||
_bubbleRoiResizing = false; _bubbleBrushDragging = false;
|
_bubbleRoiResizing = false; _bubbleBrushDragging = false;
|
||||||
_bubbleTool = BubbleSubTool.Roi;
|
_bubbleTool = BubbleSubTool.Roi;
|
||||||
_bubbleUndoStack.Clear();
|
_bubbleUndoStack.Clear();
|
||||||
|
// 清理外部叠加的结果图层(IsHitTestVisible=false 的 Image,排除背景图)
|
||||||
|
var toRemove = new System.Collections.Generic.List<UIElement>();
|
||||||
|
foreach (UIElement child in mainCanvas.Children)
|
||||||
|
{
|
||||||
|
if (child is Image img && img != backgroundImage && !img.IsHitTestVisible)
|
||||||
|
toRemove.Add(child);
|
||||||
|
}
|
||||||
|
foreach (var el in toRemove)
|
||||||
|
mainCanvas.Children.Remove(el);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClearMeasurements() => RemoveMeasureOverlay();
|
public void ClearMeasurements() => RemoveMeasureOverlay();
|
||||||
|
|
||||||
|
/// <summary>从 mainCanvas 移除指定的 UI 元素(用于外部叠加层清理)</summary>
|
||||||
|
public void RemoveFromCanvas(System.Windows.UIElement element)
|
||||||
|
{
|
||||||
|
if (element != null && mainCanvas.Children.Contains(element))
|
||||||
|
mainCanvas.Children.Remove(element);
|
||||||
|
}
|
||||||
public int MeasureCount => _ppGroups.Count + _ptlGroups.Count + _angleGroups.Count + _frGroups.Count + _bgaGroups.Count;
|
public int MeasureCount => _ppGroups.Count + _ptlGroups.Count + _angleGroups.Count + _frGroups.Count + _bgaGroups.Count;
|
||||||
|
|
||||||
// ── 点击分发 ──
|
// ── 点击分发 ──
|
||||||
|
|||||||
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 PolygonRoiCanvas _canvas;
|
||||||
private PolygonROI _roiShape;
|
private PolygonROI _roiShape;
|
||||||
|
private System.Windows.Controls.Image _resultOverlayImage;
|
||||||
|
|
||||||
public void SetCanvas(PolygonRoiCanvas canvas)
|
public void SetCanvas(PolygonRoiCanvas canvas)
|
||||||
{
|
{
|
||||||
@@ -215,6 +216,43 @@ namespace XplorePlane.ViewModels.ImageProcessing
|
|||||||
}
|
}
|
||||||
_canvas.SelectedROI = null;
|
_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 = "结果: --";
|
private string _resultText = "结果: --";
|
||||||
@@ -311,9 +349,8 @@ namespace XplorePlane.ViewModels.ImageProcessing
|
|||||||
// 绘制结果到图像
|
// 绘制结果到图像
|
||||||
ResultImage = RenderResults(grayImage, output);
|
ResultImage = RenderResults(grayImage, output);
|
||||||
|
|
||||||
// 将结果图像推送到主界面显示
|
// 将结果叠加到 canvas overlay 上
|
||||||
if (ResultImage != null)
|
ShowResultOnOverlay(ResultImage);
|
||||||
_viewportService?.SetManualImage(ResultImage, "BGA检测结果");
|
|
||||||
|
|
||||||
grayImage.Dispose();
|
grayImage.Dispose();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,39 +14,81 @@
|
|||||||
<!-- 左侧:参数面板 -->
|
<!-- 左侧:参数面板 -->
|
||||||
<ScrollViewer Grid.Column="0" VerticalScrollBarVisibility="Auto">
|
<ScrollViewer Grid.Column="0" VerticalScrollBarVisibility="Auto">
|
||||||
<StackPanel Margin="10">
|
<StackPanel Margin="10">
|
||||||
<ToggleButton IsChecked="{Binding RoiEnabled}" Margin="0,0,0,6" Padding="8,4" Cursor="Hand" ToolTip="启用ROI区域">
|
<WrapPanel Margin="0,0,0,6">
|
||||||
<ToggleButton.Style>
|
<ToggleButton IsChecked="{Binding RoiEnabled}" Padding="8,4" Margin="0,0,6,0" Cursor="Hand" ToolTip="启用ROI区域">
|
||||||
<Style TargetType="ToggleButton">
|
<ToggleButton.Style>
|
||||||
<Setter Property="Template">
|
<Style TargetType="ToggleButton">
|
||||||
<Setter.Value>
|
<Setter Property="Template">
|
||||||
<ControlTemplate TargetType="ToggleButton">
|
<Setter.Value>
|
||||||
<Border x:Name="Bd" Background="#EEEEEE" BorderBrush="#CCCCCC"
|
<ControlTemplate TargetType="ToggleButton">
|
||||||
BorderThickness="1" CornerRadius="3" Padding="10,4">
|
<Border x:Name="Bd" Background="#EEEEEE" BorderBrush="#CCCCCC"
|
||||||
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
|
BorderThickness="1" CornerRadius="3" Padding="10,4">
|
||||||
</Border>
|
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
|
||||||
<ControlTemplate.Triggers>
|
</Border>
|
||||||
<Trigger Property="IsChecked" Value="True">
|
<ControlTemplate.Triggers>
|
||||||
<Setter TargetName="Bd" Property="Background" Value="#0078D7" />
|
<Trigger Property="IsChecked" Value="True">
|
||||||
<Setter TargetName="Bd" Property="BorderBrush" Value="#005A9E" />
|
<Setter TargetName="Bd" Property="Background" Value="#0078D7" />
|
||||||
</Trigger>
|
<Setter TargetName="Bd" Property="BorderBrush" Value="#005A9E" />
|
||||||
<Trigger Property="IsMouseOver" Value="True">
|
</Trigger>
|
||||||
<Setter TargetName="Bd" Property="Background" Value="#DDDDDD" />
|
<Trigger Property="IsMouseOver" Value="True">
|
||||||
</Trigger>
|
<Setter TargetName="Bd" Property="Background" Value="#DDDDDD" />
|
||||||
<MultiTrigger>
|
</Trigger>
|
||||||
<MultiTrigger.Conditions>
|
<MultiTrigger>
|
||||||
<Condition Property="IsMouseOver" Value="True" />
|
<MultiTrigger.Conditions>
|
||||||
<Condition Property="IsChecked" Value="True" />
|
<Condition Property="IsMouseOver" Value="True" />
|
||||||
</MultiTrigger.Conditions>
|
<Condition Property="IsChecked" Value="True" />
|
||||||
<Setter TargetName="Bd" Property="Background" Value="#006CBE" />
|
</MultiTrigger.Conditions>
|
||||||
</MultiTrigger>
|
<Setter TargetName="Bd" Property="Background" Value="#006CBE" />
|
||||||
</ControlTemplate.Triggers>
|
</MultiTrigger>
|
||||||
</ControlTemplate>
|
</ControlTemplate.Triggers>
|
||||||
</Setter.Value>
|
</ControlTemplate>
|
||||||
</Setter>
|
</Setter.Value>
|
||||||
</Style>
|
</Setter>
|
||||||
</ToggleButton.Style>
|
</Style>
|
||||||
<Image Source="/Assets/Icons/polygon.png" Width="20" Height="20" />
|
</ToggleButton.Style>
|
||||||
</ToggleButton>
|
<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="BGA定位参数" FontWeight="SemiBold" Margin="0,0,0,6" />
|
||||||
<TextBlock Text="焊球最小面积" FontSize="11" Margin="0,0,0,2" />
|
<TextBlock Text="焊球最小面积" FontSize="11" Margin="0,0,0,2" />
|
||||||
<DockPanel Margin="0,0,0,6">
|
<DockPanel Margin="0,0,0,6">
|
||||||
@@ -97,10 +139,6 @@
|
|||||||
</DockPanel>
|
</DockPanel>
|
||||||
<Separator Margin="0,4" />
|
<Separator Margin="0,4" />
|
||||||
<TextBlock Text="{Binding ResultText}" FontSize="14" FontWeight="SemiBold" Margin="0,4,0,8" />
|
<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>
|
</StackPanel>
|
||||||
</ScrollViewer>
|
</ScrollViewer>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user