Files
XplorePlane/XplorePlane/Views/Main/MainWindow.xaml
T
zhengxuan.zhang 1b686066c8 Merge branch 'Develop/XP' into turbo-002-cnc
# Conflicts:
#	XplorePlane/Views/Main/MainWindow.xaml
2026-05-06 15:37:58 +08:00

619 lines
30 KiB
XML

<Window
x:Class="XplorePlane.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:controls="clr-namespace:XplorePlane.Controls"
xmlns:spreadsheet="clr-namespace:Telerik.Windows.Controls.Spreadsheet;assembly=Telerik.Windows.Controls.Spreadsheet"
xmlns:spreadsheetControls="clr-namespace:Telerik.Windows.Controls.Spreadsheet.Controls;assembly=Telerik.Windows.Controls.Spreadsheet"
xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:views="clr-namespace:XplorePlane.Views"
xmlns:views1="clr-namespace:XP.Hardware.RaySource.Views;assembly=XP.Hardware.RaySource"
xmlns:mcViews="clr-namespace:XP.Hardware.MotionControl.Views;assembly=XP.Hardware.MotionControl"
x:Name="ParentWindow"
Title="XplorePlane"
Width="1920"
Height="1040"
d:DesignWidth="1580"
Background="#F5F5F5"
Icon="pack://application:,,,/XplorePlane;component/XplorerPlane.ico"
WindowStartupLocation="CenterScreen"
mc:Ignorable="d">
<Window.Resources>
<telerik:IconSources
x:Key="IconPaths"
DarkBasePath="/Telerik.Windows.Controls.Spreadsheet;component/Images/Dark/"
LightBasePath="/Telerik.Windows.Controls.Spreadsheet;component/Images/Light/" />
<spreadsheetControls:BoolToVisibilityValueConverter x:Key="BoolToVisibilityValueConverter" />
<BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter" />
</Window.Resources>
<Grid x:Name="LayoutRoot">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="28*" />
<ColumnDefinition Width="1157*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
<RowDefinition Height="24" />
</Grid.RowDefinitions>
<telerik:RadRibbonView
x:Name="ribbonView"
Title=""
Grid.ColumnSpan="3"
VerticalAlignment="Center"
ApplicationButtonVisibility="Collapsed"
ApplicationName=""
BackstageClippingElement="{Binding ElementName=LayoutRoot}"
FontFamily="Microsoft YaHei UI"
FontSize="11"
HeaderBackground="LightGray"
TextOptions.TextFormattingMode="Display"
TextOptions.TextRenderingMode="ClearType"
TitleBarVisibility="Collapsed">
<telerik:RadRibbonView.Resources>
<spreadsheet:FunctionsProvider x:Key="FunctionsProvider" />
</telerik:RadRibbonView.Resources>
<telerik:RadRibbonTab
Width="53"
HorizontalAlignment="Left"
Header="主页">
<telerik:RadRibbonGroup
telerik:ScreenTip.Title="Clipboard"
Header="文件"
IsEnabled="{Binding Path=ClipboardGroup.IsEnabled}">
<telerik:RadRibbonGroup.Variants>
<telerik:GroupVariant Priority="0" Variant="Large" />
</telerik:RadRibbonGroup.Variants>
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Title="新建CNC"
Command="{Binding NewCncProgramCommand}"
Size="Medium"
SmallImage="/Assets/Icons/new-doc.png"
Text="新建CNC" />
<telerik:RadRibbonButton
telerik:ScreenTip.Description="保存当前 CNC 配置"
telerik:ScreenTip.Title="保存"
Size="Medium"
Command="{Binding SaveCncProgramCommand}"
SmallImage="/Assets/Icons/save.png"
Text="保存" />
<telerik:RadRibbonButton
telerik:ScreenTip.Title="另存为"
Command="{Binding SaveCncProgramCommand}"
Size="Medium"
SmallImage="/Assets/Icons/saveas.png"
Text="另存为" />
</StackPanel>
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Title="加载CNC"
Command="{Binding LoadCncProgramCommand}"
Size="Large"
SmallImage="/Assets/Icons/open.png"
Text="加载CNC" />
</StackPanel>
</telerik:RadRibbonGroup>
<telerik:RadRibbonGroup Header="程序">
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Title="运行"
Command="{Binding RunCncCommand}"
Size="Large"
SmallImage="/Assets/Icons/run.png"
Text="运行" />
</StackPanel>
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Description="停止"
telerik:ScreenTip.Title="停止"
Command="{Binding StopCncCommand}"
Size="Large"
SmallImage="/Assets/Icons/stop.png"
Text="停止" />
</StackPanel>
<StackPanel Width="52">
<controls:AnimatedSwitch
Width="44"
Height="24"
Margin="4,10,4,4"
HorizontalAlignment="Center"
ToolTip="主界面实时"
IsChecked="True"
SwitchWidth="44"
SwitchHeight="24" />
<TextBlock
HorizontalAlignment="Center"
FontFamily="Microsoft YaHei UI"
FontSize="11"
Text="实时" />
</StackPanel>
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Title="开门"
Size="Medium"
SmallImage="/Assets/Icons/opendoor.png"
Text="开门" />
<telerik:RadRibbonButton
telerik:ScreenTip.Title="关门"
Size="Medium"
SmallImage="/Assets/Icons/closedoor.png"
Text="关门" />
</StackPanel>
</telerik:RadRibbonGroup>
<telerik:RadRibbonGroup Header="快捷工具">
<telerik:RadRibbonButton
Command="{Binding LoadImageCommand}"
Size="Large"
SmallImage="/Assets/Icons/open.png"
Text="加载图像" />
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Title="中心十字线"
Command="{Binding ToggleCrosshairCommand}"
Size="Medium"
SmallImage="/Assets/Icons/crosshair.png"
Text="辅助线" />
<telerik:RadRibbonButton
telerik:ScreenTip.Title="白底检测"
Size="Medium"
SmallImage="/Assets/Icons/film-darken.png"
Text="白底检测" />
</StackPanel>
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Title="灰度"
Size="Medium"
SmallImage="/Assets/Icons/film-darken.png"
Text="灰度" />
<telerik:RadRibbonButton
telerik:ScreenTip.Title="黑底检测"
Size="Medium"
SmallImage="/Assets/Icons/film-darken.png"
Text="黑底检测" />
</StackPanel>
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Title="锐化"
Size="Medium"
SmallImage="/Assets/Icons/sharpen.png"
Text="锐化" />
<telerik:RadRibbonButton
telerik:ScreenTip.Title="增强"
Size="Medium"
SmallImage="/Assets/Icons/dynamic-range.png"
Text="增强" />
</StackPanel>
</telerik:RadRibbonGroup>
<telerik:RadRibbonGroup Header="测量工具">
<telerik:RadRibbonGroup.Variants>
<telerik:GroupVariant Priority="0" Variant="Large" />
</telerik:RadRibbonGroup.Variants>
<!-- 第一列: 点点距 + 点线距 -->
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Description="测量两点之间的距离"
telerik:ScreenTip.Title="点点距测量"
Command="{Binding PointDistanceMeasureCommand}"
Size="Medium"
SmallImage="/Assets/Icons/ptop.png"
Text="点点距测量" />
<telerik:RadRibbonButton
telerik:ScreenTip.Description="测量点到直线的距离"
telerik:ScreenTip.Title="点线距测量"
Command="{Binding PointLineDistanceMeasureCommand}"
Size="Medium"
SmallImage="/Assets/Icons/ptol.png"
Text="点线距测量" />
</StackPanel>
<!-- 第二列: 角度 + 通孔填锡率 -->
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Description="测量两条线之间的角度"
telerik:ScreenTip.Title="角度测量"
Command="{Binding AngleMeasureCommand}"
Size="Medium"
SmallImage="/Assets/Icons/angle.png"
Text="角度测量" />
<telerik:RadRibbonButton
telerik:ScreenTip.Description="测量通孔填锡率"
telerik:ScreenTip.Title="通孔填锡率测量"
Command="{Binding ThroughHoleFillRateMeasureCommand}"
Size="Medium"
SmallImage="/Assets/Icons/cylinder.png"
Text="通孔填锡率" />
</StackPanel>
<!-- 第三列: BGA空隙测量 + 气泡测量 -->
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Description="BGA焊球空隙率检测"
telerik:ScreenTip.Title="BGA空隙测量"
Command="{Binding BgaVoidMeasureCommand}"
Size="Medium"
SmallImage="/Assets/Icons/bga.png"
Text="BGA空隙" />
<telerik:RadRibbonButton
telerik:ScreenTip.Description="手动气泡测量(魔棒+画笔)"
telerik:ScreenTip.Title="气泡测量"
Command="{Binding BubbleMeasureCommand}"
Size="Medium"
SmallImage="/Assets/Icons/pores.png"
Text="气泡测量" />
</StackPanel>
</telerik:RadRibbonGroup>
<telerik:RadRibbonGroup Header="图像算子" telerik:ScreenTip.Title="图像算子">
<telerik:RadRibbonButton
telerik:ScreenTip.Description="打开算子工具箱,拖拽算子到流水线中"
telerik:ScreenTip.Title="算子工具箱"
Command="{Binding OpenToolboxCommand}"
Size="Large"
SmallImage="/Assets/Icons/dynamic-range.png"
Text="算子工具箱" />
</telerik:RadRibbonGroup>
<telerik:RadRibbonGroup Header="CNC">
<telerik:RadRibbonGroup.Variants>
<telerik:GroupVariant Priority="0" Variant="Large" />
</telerik:RadRibbonGroup.Variants>
<telerik:RadRibbonButton
telerik:ScreenTip.Description="打开 CNC 编辑器窗口,创建和编辑检测配方程序"
telerik:ScreenTip.Title="CNC 编辑器"
Command="{Binding OpenCncEditorCommand}"
Size="Large"
SmallImage="/Assets/Icons/cnc.png"
Text="CNC 编辑" />
<telerik:RadRibbonButton
telerik:ScreenTip.Description="打开矩阵编排窗口,配置多工件阵列检测方案"
telerik:ScreenTip.Title="矩阵编排"
Command="{Binding OpenMatrixEditorCommand}"
Size="Large"
SmallImage="/Assets/Icons/matrix.png"
Text="矩阵编排" />
<StackPanel Width="170">
<TextBlock
Margin="0,0,0,4"
HorizontalAlignment="Center"
Text="内置检测模块" />
<telerik:RadRibbonComboBox
Width="160"
ItemsSource="{Binding BuiltInInspectionModules}"
DisplayMemberPath="DisplayName"
SelectedItem="{Binding SelectedBuiltInInspectionModule}"
IsEditable="False" />
<telerik:RadRibbonButton
Margin="0,4,0,0"
telerik:ScreenTip.Description="从 Tools 目录扫描到的 .xpm 中选择一个配方,并插入到当前 CNC 程序中"
telerik:ScreenTip.Title="插入内置检测模块"
Command="{Binding InsertBuiltInInspectionModuleCommand}"
Size="Medium"
SmallImage="/Assets/Icons/Module.png"
Text="插入模块" />
</StackPanel>
<!--
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Title="参考点"
Size="Medium"
Command="{Binding InsertReferencePointCommand}"
SmallImage="/Assets/Icons/reference.png"
Text="参考点" />
<telerik:RadRibbonButton
telerik:ScreenTip.Title="添加位置"
Size="Medium"
Command="{Binding InsertSavePositionCommand}"
SmallImage="/Assets/Icons/add-pos.png"
Text="添加位置" />
<telerik:RadRibbonButton
telerik:ScreenTip.Title="完成"
Size="Medium"
Command="{Binding InsertCompleteProgramCommand}"
SmallImage="/Assets/Icons/finish.png"
Text="完成" />
</StackPanel>
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Title="检测标记"
Size="Medium"
Command="{Binding InsertInspectionMarkerCommand}"
SmallImage="/Assets/Icons/mark.png"
Text="检测标记" />
<telerik:RadRibbonButton
telerik:ScreenTip.Title="模块"
Size="Medium"
Command="{Binding InsertInspectionModuleCommand}"
SmallImage="/Assets/Icons/Module.png"
Text="检测模块" />
</StackPanel>
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Title="消息"
Size="Medium"
Command="{Binding InsertPauseDialogCommand}"
SmallImage="/Assets/Icons/message.png"
Text="消息弹窗" />
<telerik:RadRibbonButton
telerik:ScreenTip.Title="等待"
Size="Medium"
Command="{Binding InsertWaitDelayCommand}"
SmallImage="/Assets/Icons/wait.png"
Text="插入等待" />
</StackPanel>
-->
</telerik:RadRibbonGroup>
<telerik:RadRibbonGroup Header="高级模块" IsEnabled="{Binding Path=CellsGroup.IsEnabled}">
<telerik:RadRibbonGroup.Variants>
<telerik:GroupVariant Priority="0" Variant="Large" />
</telerik:RadRibbonGroup.Variants>
<telerik:RadRibbonButton
telerik:ScreenTip.Description="自动检测BGA焊球并计算空隙率"
telerik:ScreenTip.Title="BGA检测"
Command="{Binding BgaDetectionCommand}"
Content="BGA检测"
Size="Large"
SmallImage="/Assets/Icons/bga.png" />
<telerik:RadRibbonButton
telerik:ScreenTip.Description="自动检测空隙区域并计算空隙率"
telerik:ScreenTip.Title="空隙检测"
Command="{Binding VoidDetectionCommand}"
Content="孔隙检测"
Size="Large"
SmallImage="/Assets/Icons/Pores.png" />
</telerik:RadRibbonGroup>
<telerik:RadRibbonGroup Header="扫描模式" IsEnabled="{Binding Path=LinksGroup.IsEnabled}">
<telerik:RadRibbonGroup.Variants>
<telerik:GroupVariant Priority="0" Variant="Large" />
</telerik:RadRibbonGroup.Variants>
<telerik:RadRibbonButton
telerik:ScreenTip.Description="Create a link in your document for quick access to webpages and files.&#13;&#13;Hyperlinks can also take you to places in your document."
telerik:ScreenTip.Title="Add a Hyperlink"
Command="{Binding Path=ShowHyperlinkDialog.Command}"
Content="快速扫描"
IsEnabled="{Binding Path=ShowHyperlinkDialog.IsEnabled}"
Size="Large"
SmallImage="/Assets/Icons/quick-scan.png" />
<telerik:RadRibbonButton
telerik:ScreenTip.Description="Create a link in your document for quick access to webpages and files.&#13;&#13;Hyperlinks can also take you to places in your document."
telerik:ScreenTip.Title="Add a Hyperlink"
Command="{Binding Path=ShowHyperlinkDialog.Command}"
Content="螺旋扫描"
IsEnabled="{Binding Path=ShowHyperlinkDialog.IsEnabled}"
Size="Large"
SmallImage="/Assets/Icons/spiral.png" />
</telerik:RadRibbonGroup>
</telerik:RadRibbonTab>
<telerik:RadRibbonTab Header="操作">
</telerik:RadRibbonTab>
<telerik:RadRibbonTab Header="设置">
<telerik:RadRibbonGroup Header="全局设置">
<telerik:RadRibbonGroup.Variants>
<telerik:GroupVariant Priority="0" Variant="Large" />
</telerik:RadRibbonGroup.Variants>
<telerik:RadRibbonButton
Size="Large"
SmallImage="/Assets/Icons/setting.png"
Command="{Binding OpenSettingsCommand}"
Text="全局设置" />
</telerik:RadRibbonGroup>
<telerik:RadRibbonGroup
telerik:ScreenTip.Description="Show the Alignment tab of the Format Cells dialog box."
telerik:ScreenTip.Title="Format Cells: Alignment"
DialogLauncherCommand="{Binding Path=ShowFormatCellsDialog.Command}"
DialogLauncherCommandParameter="Alignment"
DialogLauncherVisibility="{Binding Path=ShowFormatCellsDialog.IsEnabled, Converter={StaticResource BoolToVisibilityValueConverter}}"
Header="硬件"
IsEnabled="{Binding Path=AlignmentGroup.IsEnabled}">
<telerik:RadRibbonGroup.Variants>
<telerik:GroupVariant Priority="0" Variant="Large" />
</telerik:RadRibbonGroup.Variants>
<telerik:RadRibbonGroup.Resources>
<spreadsheetControls:RadHorizontalAlignmentToBooleanConverter x:Key="horizontalAlignmentToBooleanConverter" />
<spreadsheetControls:RadVerticalAlignmentToBooleanConverter x:Key="verticalAlignmentToBooleanConverter" />
</telerik:RadRibbonGroup.Resources>
<StackPanel/>
<StackPanel>
<telerik:RadRibbonToggleButton
telerik:ScreenTip.Description="射线源控制"
telerik:ScreenTip.Title="射线源"
Command="{Binding OpenRaySourceConfigCommand}"
Size="Medium"
SmallImage="/Assets/Icons/xray.png"
Text="射线源" />
<telerik:RadRibbonToggleButton
telerik:ScreenTip.Description="探测器控制"
telerik:ScreenTip.Title="探测器"
Command="{Binding OpenDetectorConfigCommand}"
Size="Medium"
SmallImage="/Assets/Icons/detector2.png"
Text="探测器" />
<telerik:RadRibbonToggleButton
telerik:ScreenTip.Description="运动控制"
telerik:ScreenTip.Title="运动控制"
Command="{Binding OpenMotionDebugCommand}"
Size="Medium"
SmallImage="/Assets/Icons/xyz.png"
Text="运动控制" />
</StackPanel>
<StackPanel>
<telerik:RadRibbonButton
telerik:ScreenTip.Description="打开相机参数设置窗口"
telerik:ScreenTip.Title="相机设置"
Command="{Binding OpenCameraSettingsCommand}"
Size="Medium"
SmallImage="/Assets/Icons/detector2.png"
Text="相机设置" />
<telerik:RadRibbonButton
telerik:ScreenTip.Description="打开 PLC 地址配置窗口"
telerik:ScreenTip.Title="PLC 地址配置"
Command="{Binding OpenPlcAddrConfigCommand}"
Size="Medium"
SmallImage="/Assets/Icons/tools.png"
Text="PLC 地址" />
</StackPanel>
</telerik:RadRibbonGroup>
<telerik:RadRibbonGroup Header="多语言">
<telerik:RadRibbonGroup.Variants>
<telerik:GroupVariant Priority="0" Variant="Large" />
</telerik:RadRibbonGroup.Variants>
<telerik:RadRibbonButton
telerik:ScreenTip.Description="切换应用程序显示语言"
telerik:ScreenTip.Title="多语言设置"
Size="Large"
SmallImage="/Assets/Icons/tools.png"
Command="{Binding OpenLanguageSwitcherCommand}"
Text="语言设置" />
</telerik:RadRibbonGroup>
<telerik:RadRibbonGroup Header="日志">
<telerik:RadRibbonGroup.Variants>
<telerik:GroupVariant Priority="0" Variant="Large" />
</telerik:RadRibbonGroup.Variants>
<telerik:RadRibbonButton
telerik:ScreenTip.Description="打开实时日志查看器"
telerik:ScreenTip.Title="查看日志"
Size="Large"
SmallImage="/Assets/Icons/message.png"
Command="{Binding OpenRealTimeLogViewerCommand}"
Text="查看日志" />
</telerik:RadRibbonGroup>
</telerik:RadRibbonTab>
<telerik:RadRibbonTab Header="关于">
<telerik:RadRibbonGroup Header="关于">
<telerik:RadRibbonGroup.Variants>
<telerik:GroupVariant Priority="0" Variant="Large" />
</telerik:RadRibbonGroup.Variants>
<telerik:RadRibbonButton
Size="Large"
SmallImage="/Assets/Icons/message.png"
Command="{Binding OpenUserManualCommand}"
Text="帮助文档" />
<telerik:RadRibbonButton
Size="Large"
SmallImage="/Assets/Icons/tools.png"
Command="{Binding OpenLibraryVersionsCommand}"
Text="关于" />
</telerik:RadRibbonGroup>
</telerik:RadRibbonTab>
</telerik:RadRibbonView>
<Grid
Grid.Row="1"
Grid.ColumnSpan="3"
Margin="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding ViewportPanelWidth}" />
<ColumnDefinition Width="{Binding ImagePanelWidth}" />
<ColumnDefinition Width="350" />
</Grid.ColumnDefinitions>
<Border
Grid.Column="0"
BorderBrush="#DDDDDD"
BorderThickness="1,0,1,0">
<views:ViewportPanelView />
</Border>
<Border
Grid.Column="1"
BorderBrush="#DDDDDD"
BorderThickness="0,0,1,0">
<views:ImagePanelView />
</Border>
<Grid Grid.Column="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="350*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<views1:RaySourceOperateView Grid.Row="0" Grid.ColumnSpan="2" />
<mcViews:AxisControlView Grid.Row="1" Grid.ColumnSpan="2" />
<views:NavigationPropertyPanelView Grid.Row="2" Grid.ColumnSpan="2" />
</Grid>
</Grid>
<Border
Grid.Row="2"
Grid.ColumnSpan="3"
Background="#0060A0"
BorderBrush="#004880"
BorderThickness="0,1,0,0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Column="0"
Margin="8,0"
VerticalAlignment="Center"
FontFamily="Microsoft YaHei UI"
FontSize="11"
Foreground="White"
Text="{Binding CncStatusMessage}">
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="White" />
<Style.Triggers>
<DataTrigger Binding="{Binding CncHasExecutionError}" Value="True">
<Setter Property="Foreground" Value="#FF9090" />
<Setter Property="FontWeight" Value="SemiBold" />
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<TextBlock
Grid.Column="1"
Margin="8,0"
VerticalAlignment="Center"
FontFamily="Consolas"
FontSize="11"
Foreground="White"
Text="x: 0 y: 0" />
</Grid>
</Border>
</Grid>
</Window>