添加 MX-PD-盘古 项目文件
将 MX-PD-盘古 - new 目录下的所有文件添加到主仓库
This commit is contained in:
@@ -0,0 +1,480 @@
|
||||
<UserControl x:Class="MXJM.SystemSetting.View.CameraFusionCali02AView"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mwControls="http://www.maxwell-gp.com/"
|
||||
Loaded="{mwControls:Action viewLoad}"
|
||||
Unloaded="{mwControls:Action viewUnLoad}"
|
||||
xmlns:view="clr-namespace:MXJM.Common.View"
|
||||
xmlns:local="clr-namespace:MXJM.SystemSetting.View"
|
||||
xmlns:testdemo="clr-namespace:MwFramework.Controls.SystemCalib;assembly=MwFramework.Controls.SystemCalib"
|
||||
mwControls:ParameterAttach.DelayAcceptValue ="{Binding ParameterHelper}"
|
||||
xmlns:convert="clr-namespace:MXJM.Common.Converter"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="850" d:DesignWidth="1200">
|
||||
<UserControl.Resources>
|
||||
<convert:CameraTypeToBoolConverter x:Key="CameraTypeToBoolConverter"/>
|
||||
<Style x:Key="CommonLableStyle" TargetType="Label" BasedOn="{StaticResource {x:Type Label}}">
|
||||
<Setter Property="HorizontalContentAlignment" Value="Right"/>
|
||||
<Setter Property="VerticalContentAlignment" Value="Center"/>
|
||||
<Setter Property="Margin" Value="3"/>
|
||||
<Setter Property="Height" Value="35"/>
|
||||
<Setter Property="Width" Value="120"/>
|
||||
</Style>
|
||||
<Style TargetType="ComboBox" BasedOn="{StaticResource {x:Type ComboBox}}">
|
||||
<Setter Property="HorizontalContentAlignment" Value="Left"/>
|
||||
<Setter Property="VerticalContentAlignment" Value="Center"/>
|
||||
<Setter Property="Margin" Value="3"/>
|
||||
<Setter Property="Height" Value="35"/>
|
||||
<Setter Property="Width" Value="120"/>
|
||||
</Style>
|
||||
<Style TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" >
|
||||
<Setter Property="VerticalAlignment" Value="Center"/>
|
||||
<Setter Property="HorizontalAlignment" Value="Center"/>
|
||||
<Setter Property="Margin" Value="3"/>
|
||||
<Setter Property="Height" Value="35"/>
|
||||
<Setter Property="Width" Value="110"/>
|
||||
</Style>
|
||||
</UserControl.Resources>
|
||||
<Grid >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<view:CameraAxisView DataContext="{Binding }" IsEnabled="{Binding Motion.IsFinish}"/>
|
||||
<Grid Grid.Column="1">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition/>
|
||||
<RowDefinition Height="60"/>
|
||||
</Grid.RowDefinitions>
|
||||
<TabControl mwControls:TabControlAttach.FontSize="12" mwControls:TabControlAttach.HeaderHeight="30" mwControls:TabControlAttach.HeaderWidth="120" Margin="5,0,0,0" >
|
||||
<TabItem Header="相机晶圆伺服融合">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<GroupBox Style="{StaticResource GroupBoxSecondary}" Margin="3,3,3,3" IsEnabled="{Binding Motion.IsFinish}" Grid.ColumnSpan="2">
|
||||
<GroupBox.Header>
|
||||
<TextBlock Text="WS运动系标定位置" VerticalAlignment="Center" FontWeight="Bold" />
|
||||
</GroupBox.Header>
|
||||
<UniformGrid Grid.Row="0" Rows="2">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="140"/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<!--<ColumnDefinition/>-->
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label Content="WS平台标定X1(mm):" Width="200" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Tag="WS平台标定X1" Value="{Binding CameraWaferFusionCalibrationItem.WSPlatCalibXPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="75" Height="35" />
|
||||
<!--<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachXPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="2" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachYPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />-->
|
||||
<Button Grid.Column="3" Tag="WS平台标定X1-移到此位置" Content="移到此位置" Click="{mwControls:Action btnMoveWSCalibPosPosition}" HorizontalAlignment="Left" />
|
||||
</Grid>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="1.6*"/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition />
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition Width="1.5*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label Content="X2:" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachXPos}" IsReadOnly="True" Background="LightGray" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="75" Height="35" />
|
||||
<Label Content="Y2:" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachYPos}" IsReadOnly="True" Background="LightGray" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="75" Height="35" />
|
||||
<Button Grid.Column="5" Tag="WS平台标定X1-中心对齐" Content="中心对齐" Click="{mwControls:Action btnGotoCalibPos}" HorizontalAlignment="Left" />
|
||||
</Grid>
|
||||
</UniformGrid>
|
||||
</GroupBox>
|
||||
<GroupBox Grid.Row="1" Style="{StaticResource GroupBoxSecondary}" Margin="3,3,3,3" IsEnabled="{Binding Motion.IsFinish}" Grid.ColumnSpan="2">
|
||||
<GroupBox.Header>
|
||||
<TextBlock Text="相机起始位置" VerticalAlignment="Center" FontWeight="Bold" />
|
||||
</GroupBox.Header>
|
||||
<UniformGrid Grid.Row="0" Rows="2">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label Content="CameraX(mm):" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Center" />
|
||||
<mwControls:NumberBox Tag="CameraX" Value="{Binding CameraWaferFusionCalibrationItem.CameraX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Center" Margin="5" Width="120" Height="35" />
|
||||
<!--<Label Content="CameraY(mm):" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.CameraY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />-->
|
||||
<Button Grid.Column="3" Tag="计算相机起始位置" Content="计算位置" Click="{mwControls:Action BtnCalculateCameraPosition}" HorizontalAlignment="Left" />
|
||||
</Grid>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Button Grid.Column="1" Tag="相机起始位置-读取当前位置" Content="读取当前位置" Click="{mwControls:Action btnSetCameraPosition}" HorizontalAlignment="Left" />
|
||||
<Button Grid.Column="3" Tag="相机起始位置-移到此位置" Content="移到此位置" Click="{mwControls:Action btnMoveCameraPosition}" HorizontalAlignment="Left" />
|
||||
</Grid>
|
||||
</UniformGrid>
|
||||
</GroupBox>
|
||||
<GroupBox Grid.Row="2" Style="{StaticResource GroupBoxSecondary}" Margin="3,3,3,3" IsEnabled="{Binding Motion.IsFinish}" Grid.ColumnSpan="2">
|
||||
<GroupBox.Header>
|
||||
<TextBlock Text="WS起始位置" VerticalAlignment="Center" FontWeight="Bold" />
|
||||
</GroupBox.Header>
|
||||
<UniformGrid Rows="2">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label Content="StartX(mm):" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferStartX}" IsReadOnly="True" Background="LightGray" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
<Label Content="StartY(mm):" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferStartY}" IsReadOnly="True" Background="LightGray" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
</Grid>
|
||||
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Button Grid.Column="0" Tag="WS起始位置-计算当前位置" Content="计算位置" Click="{mwControls:Action BtnCalculateWSPosition}" HorizontalAlignment="Left" Grid.ColumnSpan="2" Margin="3,0,0,0" />
|
||||
<Button Grid.Column="1" Tag="WS起始位置-读取当前位置" Content="读取当前位置" Click="{mwControls:Action btnSetWaferStartPosition}" HorizontalAlignment="Left" Grid.ColumnSpan="2" Margin="3,0,0,0" />
|
||||
<Button Grid.Column="2" Tag="WS起始位置-移到此位置" Content="移到此位置" Click="{mwControls:Action btnMoveWaferStartPosition}" HorizontalAlignment="Left" Margin="2,0,0,0" />
|
||||
<Button Grid.Column="3" Tag="WS起始位置-对齐中心" Content="对齐中心" Click="{mwControls:Action btnMoveToCenter}" HorizontalAlignment="Left" Margin="3,0,0,0" />
|
||||
</Grid>
|
||||
</UniformGrid>
|
||||
</GroupBox>
|
||||
<GroupBox Grid.Row="4" Style="{StaticResource GroupBoxSecondary}" Margin="3,3,3,3" Grid.ColumnSpan="2">
|
||||
<GroupBox.Header>
|
||||
<TextBlock Text="标定参数" VerticalAlignment="Center" FontWeight="Bold" />
|
||||
</GroupBox.Header>
|
||||
<Grid >
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<!--<DataGrid Grid.Row="0" ItemsSource="{Binding CameraWaferFusionCalibrationItem.AxisAndPixelPointItemList}" SelectedItem="CameraWaferFusionCalibrationItem.SelectedAxisAndPixelPointItem" Margin="3" AutoGenerateColumns="false" SelectionMode="Single"
|
||||
CanUserSortColumns="False">
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="No" Binding="{Binding Id}" Width="1*" IsReadOnly="true"/>
|
||||
<DataGridTextColumn Header="AxisX1" Binding="{Binding AxisX1}" Width="2*" IsReadOnly="true"/>
|
||||
<DataGridTextColumn Header="AxisY1" Binding="{Binding AxisY1}" Width="2*" IsReadOnly="true"/>
|
||||
<DataGridTextColumn Header="AxisX2" Binding="{Binding AxisX2}" Width="2*" IsReadOnly="true"/>
|
||||
<DataGridTextColumn Header="AxisY2" Binding="{Binding AxisY2}" Width="2*" IsReadOnly="true"/>
|
||||
<DataGridTextColumn Header="RecognizeX" Binding="{Binding PixelX}" Width="2*" IsReadOnly="true"/>
|
||||
<DataGridTextColumn Header="RecognizeY" Binding="{Binding PixelY}" Width="2*" IsReadOnly="true"/>
|
||||
</DataGrid.Columns>
|
||||
</DataGrid>-->
|
||||
<Grid Grid.Row="1" IsEnabled="{Binding Motion.IsFinish}" >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label Content="WaferStepXY(mm):" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferStepXY}" Tag="WaferStepXY(mm)" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="0" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
<Label Content="WaferCountXY:" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:IntNumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferCountXY}" Tag="WaferCountXY" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="0" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
</Grid>
|
||||
<Grid IsEnabled="{Binding Motion.IsFinish}" >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label Content="StepX1(mm):" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Tag="StepX(mm)" Value="{Binding CameraWaferFusionCalibrationItem.StepX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
<!--<Label Content="StepY(mm):" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.StepY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />-->
|
||||
<Label Content="CountX1:" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:IntNumberBox Tag="CountX" Value="{Binding CameraWaferFusionCalibrationItem.CountX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="1" Maximum="10000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
</Grid>
|
||||
<Grid Grid.Row="3">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<!--<Button Grid.Column="0" Content="移到此位置" Click="{mwControls:Action btnMovePosition}" HorizontalAlignment="Left" />
|
||||
<Button Grid.Column="1" Content="识别" Click="{mwControls:Action btnRecognize}" HorizontalAlignment="Left" />-->
|
||||
|
||||
<!--<Button Content="计算" Tag="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Content}" Click="{mwControls:Action btnFix}" Grid.Column="0" />-->
|
||||
<!--<Button Content="验证" Click="{mwControls:Action btnVarify}" Grid.Column="1" />-->
|
||||
<CheckBox x:Name="circleCk" Content="圆形标定" IsChecked="{Binding CameraWaferFusionCalibrationItem.UseCircleCalib}" />
|
||||
<Button Content="开始" Tag="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Content}" Click="{mwControls:Action btnStart}" Grid.Column="2" IsEnabled="{Binding Motion.IsFinish}" />
|
||||
<Button Content="停止" Tag="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Content}" Click="{mwControls:Action btnStop}" Grid.Column="3" />
|
||||
</Grid>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
<GroupBox Grid.Row="3" Visibility="{Binding ElementName=circleCk, Path=IsChecked, Converter={StaticResource boolToVisibleConverter}}" Style="{StaticResource GroupBoxSecondary}" IsEnabled="{Binding Motion.IsFinish}" Margin="3" Header="圆参数示教">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<UniformGrid Columns="4">
|
||||
<!--<Label Margin="2,2" VerticalAlignment="Center" HorizontalAlignment="Center" Content="圆心X:"/>
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.CenterX}" Margin="2,2" HorizontalAlignment="Left" IsReadOnly="True"/>
|
||||
<Label Margin="2,2" VerticalAlignment="Center" HorizontalAlignment="Center" Content="圆心Y:"/>
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.CenterY}" Margin="2,2" HorizontalAlignment="Left" IsReadOnly="True"/>-->
|
||||
<Label Margin="2,2" VerticalAlignment="Center" HorizontalAlignment="Center" Content="半径:"/>
|
||||
<mwControls:NumberBox mwControls:NumericKeypadAttach.IsEnabled="True" Value="{Binding CameraWaferFusionCalibrationItem.Radius}" Margin="2,2" HorizontalAlignment="Left" IsReadOnly="False"/>
|
||||
<Label Margin="2,2" VerticalAlignment="Center" HorizontalAlignment="Center" Content="标定板行间距:"/>
|
||||
<mwControls:NumberBox mwControls:NumericKeypadAttach.IsEnabled="True" Value="{Binding CameraWaferFusionCalibrationItem.RowStep}" Margin="2,2" HorizontalAlignment="Left" IsReadOnly="False"/>
|
||||
<Label Margin="2,2" VerticalAlignment="Center" HorizontalAlignment="Center" Content="标定板列间距:"/>
|
||||
<mwControls:NumberBox mwControls:NumericKeypadAttach.IsEnabled="True" Value="{Binding CameraWaferFusionCalibrationItem.ColStep}" Margin="2,2" HorizontalAlignment="Left" IsReadOnly="False"/>
|
||||
<!--<Button Margin="2,2" Content="示教" Click="{mwControls:Action TeachCircleCenter}"/>
|
||||
<Button Margin="2,2" Content="导入圆坐标" Click="{mwControls:Action ImportCircleFile}"/>-->
|
||||
</UniformGrid>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
<TabItem Header="验证" >
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="80"/>
|
||||
<RowDefinition Height="80"/>
|
||||
<RowDefinition Height="140"/>
|
||||
<RowDefinition Height="190"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<GroupBox Style="{StaticResource GroupBoxSecondary}" Margin="3" IsEnabled="{Binding Motion.IsFinish}">
|
||||
<GroupBox.Header>
|
||||
<TextBlock Text="第一步:设定Die位置" VerticalAlignment="Center" FontWeight="Bold" />
|
||||
</GroupBox.Header>
|
||||
<UniformGrid Rows="1">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<!--<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>-->
|
||||
</Grid.ColumnDefinitions>
|
||||
<Button Grid.Column="0" Visibility="Collapsed" Content="移到相机位置" Click="{mwControls:Action btnMoveCameraPosition}" HorizontalAlignment="Left" />
|
||||
<Button Grid.Column="1" Visibility="Collapsed" Content="移到Wafer位置" Click="{mwControls:Action btnMoveWaferStartPosition}" HorizontalAlignment="Left" />
|
||||
<Button Grid.Column="0" Content="设定Die位置" Click="{mwControls:Action btnSetDiePosition}" HorizontalAlignment="Center" />
|
||||
</Grid>
|
||||
</UniformGrid>
|
||||
</GroupBox>
|
||||
<GroupBox Grid.Row="1" Style="{StaticResource GroupBoxSecondary}" Margin="3" IsEnabled="{Binding Motion.IsFinish}">
|
||||
<GroupBox.Header>
|
||||
<TextBlock Text="第二步:设定Pad位置" VerticalAlignment="Center" FontWeight="Bold" />
|
||||
</GroupBox.Header>
|
||||
<UniformGrid Rows="1">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<!--<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>-->
|
||||
</Grid.ColumnDefinitions>
|
||||
<Button Grid.Column="0" Content="设定Pad位置" Click="{mwControls:Action btnSetPadPosition}" HorizontalAlignment="Center" />
|
||||
</Grid>
|
||||
</UniformGrid>
|
||||
</GroupBox>
|
||||
<GroupBox Grid.Row="2" Style="{StaticResource GroupBoxSecondary}" Margin="3" IsEnabled="{Binding Motion.IsFinish}">
|
||||
<GroupBox.Header>
|
||||
<TextBlock Text="第三步:计算Wafer移动坐标" VerticalAlignment="Center" FontWeight="Bold" />
|
||||
</GroupBox.Header>
|
||||
<UniformGrid Rows="2">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label Content="X,Y(mm):" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding WaferVerifyX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
<mwControls:NumberBox Value="{Binding WaferVerifyY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="2" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
<Button Grid.Column="3" Content="计算" Click="{mwControls:Action btnCalculate}" HorizontalAlignment="Left" />
|
||||
</Grid>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Button Grid.Column="3" Content="移动到验证点" Click="{mwControls:Action btnMoveToVerifyPoint}" HorizontalAlignment="Left" />
|
||||
</Grid>
|
||||
</UniformGrid>
|
||||
</GroupBox>
|
||||
<GroupBox Grid.Row="3" Style="{StaticResource GroupBoxSecondary}" Margin="3" IsEnabled="{Binding Motion.IsFinish}">
|
||||
<GroupBox.Header>
|
||||
<TextBlock Text="相机畸变测试" VerticalAlignment="Center" FontWeight="Bold" />
|
||||
</GroupBox.Header>
|
||||
<UniformGrid Rows="3" Columns="4">
|
||||
<Label Content="RealX,Y(mm):" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding DesPixelX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" DecimalPlaces="6" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
<mwControls:NumberBox Value="{Binding DesPixelY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" DecimalPlaces="6" Grid.Column="2" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
<Button Grid.Column="3" Content="识别" Click="{mwControls:Action btnCameraTest}" HorizontalAlignment="Left" />
|
||||
<Label Content="RulerX,Y(mm):" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding DesRulerX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" DecimalPlaces="6" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
<mwControls:NumberBox Value="{Binding DesRulerY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" DecimalPlaces="6" Grid.Column="2" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
<Label/>
|
||||
<RadioButton Content="定位相机" Margin="10,0,0,0" IsChecked="{Binding CameraTypeVM, Converter={StaticResource CameraTypeToBoolConverter}, ConverterParameter=1}" GroupName="cameraType"/>
|
||||
<RadioButton Content="虚拟定位相机" Margin="10,0,0,0" IsChecked="{Binding CameraTypeVM, Converter={StaticResource CameraTypeToBoolConverter}, ConverterParameter=2}" GroupName="cameraType"/>
|
||||
</UniformGrid>
|
||||
</GroupBox>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
<TabItem Header="验证1" >
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<GroupBox Style="{StaticResource GroupBoxSecondary}" Margin="3" IsEnabled="{Binding Motion.IsFinish}">
|
||||
<GroupBox.Header>
|
||||
<TextBlock Text="WS运动系标定位置" VerticalAlignment="Center" FontWeight="Bold" />
|
||||
</GroupBox.Header>
|
||||
<UniformGrid Grid.Row="0" Rows="2">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="2*"/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<!--<ColumnDefinition/>-->
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label Content="WS平台标定X1,X2,Y2(mm):" Width="200" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSPlatCalibXPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />
|
||||
<!--<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachXPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="2" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachYPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />-->
|
||||
<Button Grid.Column="2" Content="移到此位置" Click="{mwControls:Action btnMoveWSCalibPosPosition}" HorizontalAlignment="Left" />
|
||||
</Grid>
|
||||
<Grid Visibility="Collapsed">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label Content="X:" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachXPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />
|
||||
<Label Content="Y:" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WSApproachYPos}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="80" Height="35" />
|
||||
<Button Grid.Column="5" Content="中心对齐" Click="{mwControls:Action btnGotoCalibPos}" HorizontalAlignment="Left" />
|
||||
</Grid>
|
||||
</UniformGrid>
|
||||
</GroupBox>
|
||||
<GroupBox Grid.Row="2" Style="{StaticResource GroupBoxSecondary}" Margin="3" IsEnabled="{Binding Motion.IsFinish}">
|
||||
<GroupBox.Header>
|
||||
<TextBlock Text="WS运动位置" VerticalAlignment="Center" FontWeight="Bold" />
|
||||
</GroupBox.Header>
|
||||
<UniformGrid Rows="5" Columns="1">
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label Content="StartX(mm):" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferStartVerifyX}" IsReadOnly="True" Background="LightGray" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
<Label Content="StartY(mm):" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferStartVerifyY}" IsReadOnly="True" Background="LightGray" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
</Grid>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<!--<Button Grid.Column="1" Content="读取当前位置" Click="{mwControls:Action btnSetWaferStartPosition}" HorizontalAlignment="Left" />-->
|
||||
<Button Grid.Column="3" Content="设置起点" Click="{mwControls:Action btnMoveToCenter}" HorizontalAlignment="Left" />
|
||||
</Grid>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label Content="Step(mm):" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferVerityStep}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
<Button Grid.Column="3" Content="移动到起点" Click="{mwControls:Action btnMoveToStartPoint}" HorizontalAlignment="Left" />
|
||||
<!--<Label Content="StepY(mm):" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:NumberBox Value="{Binding CameraWaferFusionCalibrationItem.StepY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />-->
|
||||
</Grid>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Label Content="CountX:" Grid.Column="0" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:IntNumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferVerityCountX}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="1" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
<Label Content="CountY:" Grid.Column="2" Style="{StaticResource CommonLableStyle}" HorizontalAlignment="Right" />
|
||||
<mwControls:IntNumberBox Value="{Binding CameraWaferFusionCalibrationItem.WaferVerityCountY}" mwControls:NumericKeypadAttach.IsEnabled="True" Minimum="-1000" Maximum="1000" Grid.Column="3" HorizontalAlignment="Left" Margin="5" Width="120" Height="35" />
|
||||
</Grid>
|
||||
<Grid>
|
||||
<Button Content="开始飞拍" Click="{mwControls:Action btnMoveWafer}" Grid.Column="0" Margin="10 5" IsEnabled="{Binding Motion.IsFinish}" />
|
||||
</Grid>
|
||||
<Grid>
|
||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
|
||||
<Button Content="以当前相机位置验证" Click="{mwControls:Action btnVerityWafer}" Margin="10 5" IsEnabled="{Binding Motion.IsFinish}" Width="150"/>
|
||||
<Button Content="停止" Tag="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Content}" Click="{mwControls:Action btnStopVerityWafer}" HorizontalAlignment="Right"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</UniformGrid>
|
||||
</GroupBox>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
<TabItem Header="轴系精度验证">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
<view:AxisPrecisionCheckParamView Grid.Row="0" AxisPrecisionCheck="{Binding AxisCheckItem.PHSPerpendicularityCheck}"/>
|
||||
<GroupBox Grid.Row="1" Header="WS轴精度验证">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition/>
|
||||
<RowDefinition/>
|
||||
</Grid.RowDefinitions>
|
||||
<Button Content="X1移动到标定位置" Tag="X1移动到标定位置" Click="{mwControls:Action BtnMoveX1ToCalibPos}"></Button>
|
||||
<view:AxisPrecisionCheckParamView Grid.Row="2" AxisPrecisionCheck="{Binding AxisCheckItem.WSPerpendicularityCheck}"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
|
||||
<view:AxisPrecisionCheckParamView Grid.Row="2" AxisPrecisionCheck="{Binding AxisCheckItem.X1X2ParallelismCheck}"/>
|
||||
</Grid>
|
||||
</TabItem>
|
||||
</TabControl>
|
||||
<Grid Grid.Row="1">
|
||||
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Right" >
|
||||
<Button Content="保存" Tag="{Binding RelativeSource={RelativeSource Mode=Self}, Path=Content}" Click="{mwControls:Action btnSave}" Grid.Row="1" Grid.Column="4" Margin="10 5" IsEnabled="{Binding Motion.IsFinish}"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
</UserControl>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,404 @@
|
||||
using JM1.JM1Params;
|
||||
using Maxwell.SemiFramework.DefaultConfig.Vision;
|
||||
using MaxwellControl.Controls;
|
||||
using MaxwellFramework.Core.Interfaces;
|
||||
using MaxWellGeneralLog.Extension;
|
||||
using MwFramework.Controls.Components;
|
||||
using MwFramework.Device;
|
||||
using MwFramework.ManagerService;
|
||||
using MwFramework.MXJM.ProcessAnalysis.Model;
|
||||
using MXJM.Common;
|
||||
using MXJM.Common.EventArgsFolder;
|
||||
using MXJM.Logic.Operation;
|
||||
using MXJM.Parameter.SystemSetting;
|
||||
using MXJM.SystemSetting.ViewModel;
|
||||
using SemiconductorVisionAlgorithm.SemiParams;
|
||||
using Stylet;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Markup;
|
||||
using MessageBox = MaxwellControl.Controls.MessageBox;
|
||||
using Point = System.Windows.Point;
|
||||
|
||||
namespace MXJM.Logic.SystemSetting
|
||||
{
|
||||
public class CameraFusionCalibrationMotion02A : DelegateBase
|
||||
{
|
||||
public override bool Check(object state)
|
||||
{
|
||||
IoC.Get<IProjectManager>().EnablePageAndDisableOther("视觉标定");
|
||||
_device = IoC.Get<GlobalDeviceService>();
|
||||
double speed = 50;
|
||||
SafeAxisMotion.SetAxisSpeed(_device.Axis_X11, speed);
|
||||
SafeAxisMotion.SetAxisSpeed(_device.Axis_Y11, speed);
|
||||
SafeAxisMotion.SetAxisSpeed(_device.Axis_X21, speed);
|
||||
SafeAxisMotion.SetAxisSpeed(_device.Axis_Y21, speed);
|
||||
return true;
|
||||
}
|
||||
|
||||
IParamList _paramList;
|
||||
GlobalDeviceService _device;
|
||||
VisionOperation _visionOperation;
|
||||
CameraWaferFusionCalibrationSetting _parameter;
|
||||
CameraWaferFusionCalibrationItem _cameraWaferFusionCalibrationItem;
|
||||
public Rectangle1 Rectangle { get; set; }
|
||||
bool _isCancle = false;
|
||||
|
||||
private Dictionary<int, SemiconductorVisionAlgorithm.SemiParams.Point[,]> _calibWaferData = new Dictionary<int, SemiconductorVisionAlgorithm.SemiParams.Point[,]>();
|
||||
private List<double> _x11PosList = new List<double>();
|
||||
private SemiconductorVisionAlgorithm.SemiParams.Point[,] _initialwsPos = new SemiconductorVisionAlgorithm.SemiParams.Point[0,0];
|
||||
SafeAxisMotion motion;
|
||||
|
||||
private int _x11Count = 0;
|
||||
private bool _isReDo = false;
|
||||
|
||||
public override void Do(object state)
|
||||
{
|
||||
try
|
||||
{
|
||||
_isCancle = false;
|
||||
if (_isReDo)
|
||||
{
|
||||
_isReDo = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
_calibWaferData.Clear();
|
||||
_x11PosList.Clear();
|
||||
}
|
||||
var objects=state as object[];
|
||||
var pointDic = objects[1] as FusionPoint[,];
|
||||
|
||||
bool isRecheck = Convert.ToBoolean(objects[0]);
|
||||
_paramList = IoC.Get<IParameterManager>() as IParamList;
|
||||
_parameter = _paramList.GetParameter<CameraWaferFusionCalibrationSetting>();
|
||||
_cameraWaferFusionCalibrationItem = _parameter.CameraWaferFusionCalibrationItem;
|
||||
|
||||
motion = IoC.Get<SafeAxisMotion>();
|
||||
_device = IoC.Get<GlobalDeviceService>();
|
||||
_visionOperation = IoC.Get<VisionOperation>();
|
||||
double stageY = _device.Axis_Y11.State.ActualPos;
|
||||
double waferStep = _cameraWaferFusionCalibrationItem.WaferStepXY;
|
||||
string modelFileName = _cameraWaferFusionCalibrationItem.ModelPath;
|
||||
string path = System.AppDomain.CurrentDomain.BaseDirectory + modelFileName;
|
||||
|
||||
if (_x11PosList.Count != _cameraWaferFusionCalibrationItem.CountX || _calibWaferData.Count != _cameraWaferFusionCalibrationItem.CountX)
|
||||
{
|
||||
_calibWaferData.Clear();
|
||||
_x11PosList.Clear();
|
||||
_x11Count = 0;
|
||||
for (int i = 0; i < _cameraWaferFusionCalibrationItem.CountX; i++)
|
||||
{
|
||||
_x11PosList.Add(0);
|
||||
_calibWaferData.Add(i, new SemiconductorVisionAlgorithm.SemiParams.Point[0, 0]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//相机移到起点 //wafer移到起点
|
||||
//motion.SafeMovePHSAndWS(_cameraWaferFusionCalibrationItem.CameraX, stageY, _cameraWaferFusionCalibrationItem.WaferStartX, _cameraWaferFusionCalibrationItem.WaferStartY, isCalib: true);
|
||||
if(_cameraWaferFusionCalibrationItem.UseCircleCalib)
|
||||
{
|
||||
_initialwsPos = ApprochWSCircleTable(pointDic, _cameraWaferFusionCalibrationItem.WSPlatCalibXPos, stageY, _cameraWaferFusionCalibrationItem.WSApproachXPos,
|
||||
_cameraWaferFusionCalibrationItem.WSApproachYPos, 0, path);
|
||||
}
|
||||
else
|
||||
_initialwsPos = ApprochWSTable(waferStep, _cameraWaferFusionCalibrationItem.WSPlatCalibXPos, stageY, _cameraWaferFusionCalibrationItem.WSApproachXPos,
|
||||
_cameraWaferFusionCalibrationItem.WSApproachYPos, 0, path);
|
||||
|
||||
int count = 0;
|
||||
|
||||
for (int i = _x11Count; i < _cameraWaferFusionCalibrationItem.CountX; i++)
|
||||
{
|
||||
if (_isCancle)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
count++;
|
||||
|
||||
|
||||
double x1 = _cameraWaferFusionCalibrationItem.CameraX + _cameraWaferFusionCalibrationItem.StepX * i;
|
||||
double y1 = _device.Axis_Y11.State.ActualPos;
|
||||
|
||||
double x2 = _cameraWaferFusionCalibrationItem.WaferStartX + _cameraWaferFusionCalibrationItem.StepX * i;
|
||||
double y2 = _cameraWaferFusionCalibrationItem.WaferStartY;
|
||||
|
||||
|
||||
//如果是检查 ,X1=1/2 * StepX Y1是stage的那个黑色平台 Y2是ws
|
||||
if (isRecheck)
|
||||
{
|
||||
x1 = _cameraWaferFusionCalibrationItem.CameraX - 0.5 * _cameraWaferFusionCalibrationItem.StepX + _cameraWaferFusionCalibrationItem.StepX * i;
|
||||
y1 = _device.Axis_Y11.State.ActualPos;
|
||||
x2 = _cameraWaferFusionCalibrationItem.WaferStartX - 0.5 * _cameraWaferFusionCalibrationItem.StepX + _cameraWaferFusionCalibrationItem.StepX * i;
|
||||
y2 = _cameraWaferFusionCalibrationItem.WaferStartY;
|
||||
}
|
||||
SemiconductorVisionAlgorithm.SemiParams.Point[,] points = null;
|
||||
if (_cameraWaferFusionCalibrationItem.UseCircleCalib)
|
||||
{
|
||||
points = ApprochWSCircleTable(pointDic, x1, y1, x2, y2, count, path);
|
||||
}
|
||||
else
|
||||
points = ApprochWSTable(waferStep, x1, y1, x2, y2, count, path);
|
||||
if (_calibWaferData.ContainsKey(i))
|
||||
{
|
||||
_calibWaferData[i] = points;
|
||||
}
|
||||
else
|
||||
{
|
||||
_calibWaferData.Add(i, points);
|
||||
}
|
||||
|
||||
_x11PosList[i] = _device.Axis_X11.State.ActualPos;
|
||||
}
|
||||
|
||||
//当count为1时,认为是老标定
|
||||
if (_cameraWaferFusionCalibrationItem.WaferCountXY == 1)
|
||||
{
|
||||
SemiconductorVisionAlgorithm.SemiParams.Point ini_wsPos = new SemiconductorVisionAlgorithm.SemiParams.Point(_cameraWaferFusionCalibrationItem.WSApproachXPos,
|
||||
_cameraWaferFusionCalibrationItem.WSApproachYPos);
|
||||
List<SemiconductorVisionAlgorithm.SemiParams.Point> wsList = new List<SemiconductorVisionAlgorithm.SemiParams.Point>();
|
||||
_calibWaferData.ForEach(p =>
|
||||
{
|
||||
if (p.Value.Length > 0)
|
||||
{
|
||||
wsList.Add(p.Value[0, 0]);
|
||||
}
|
||||
});
|
||||
//JM1Vision.JM1Manager.Instance.cal_interpolate_affine(_cameraWaferFusionCalibrationItem.WSPlatCalibXPos, ini_wsPos,
|
||||
// _x11PosList, wsList);
|
||||
}
|
||||
else
|
||||
{
|
||||
SemiconductorVisionAlgorithm.SemiParams.Point[,] _circleInitialwsPos = new SemiconductorVisionAlgorithm.SemiParams.Point[0, 0];
|
||||
Dictionary<int, SemiconductorVisionAlgorithm.SemiParams.Point[,]> _circleCalibData = new Dictionary<int, SemiconductorVisionAlgorithm.SemiParams.Point[,]>(_calibWaferData.Count);
|
||||
if (_cameraWaferFusionCalibrationItem.UseCircleCalib)
|
||||
{
|
||||
ConvertToRecheckDiePoint(ref _initialwsPos);
|
||||
|
||||
foreach (var item in _calibWaferData)
|
||||
{
|
||||
var rows=item.Value.GetLength(0);
|
||||
var cols=item.Value.GetLength(1);
|
||||
RecheckDiePoint[,] recheckDiePoint = new RecheckDiePoint[rows, cols];
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
for (int j = 0; j < cols; j++)
|
||||
{
|
||||
var point=item.Value[i, j];
|
||||
bool isexist = !(point.X == 0 && point.Y == 0);
|
||||
var recheckPoint = new RecheckDiePoint
|
||||
{
|
||||
X = point.X,
|
||||
Y = point.Y,
|
||||
State = isexist
|
||||
};
|
||||
recheckDiePoint[i,j]= recheckPoint;
|
||||
}
|
||||
}
|
||||
JM1Vision.JM1Manager.Instance.FillCalibData(recheckDiePoint, _cameraWaferFusionCalibrationItem.WaferStepXY,
|
||||
_cameraWaferFusionCalibrationItem.WaferCountXY,out RecheckDiePoint[,] resutPoint);
|
||||
SemiconductorVisionAlgorithm.SemiParams.Point[,] finalResultPoint = new SemiconductorVisionAlgorithm.SemiParams.Point[rows, cols];
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
for (int j = 0; j < cols; j++)
|
||||
{
|
||||
var point = resutPoint[i, j];
|
||||
|
||||
finalResultPoint[i, j] = new SemiconductorVisionAlgorithm.SemiParams.Point
|
||||
{
|
||||
X = point.X,
|
||||
Y = point.Y,
|
||||
};
|
||||
}
|
||||
}
|
||||
_circleCalibData[item.Key] = finalResultPoint;
|
||||
}
|
||||
_calibWaferData= _circleCalibData;
|
||||
|
||||
}
|
||||
|
||||
JM1Vision.JM1Manager.Instance.cal_wafer_fusion(_calibWaferData, _x11PosList, _initialwsPos, _cameraWaferFusionCalibrationItem.StepX, waferStep, _cameraWaferFusionCalibrationItem.WaferCountXY);
|
||||
}
|
||||
|
||||
|
||||
string filePath = System.AppDomain.CurrentDomain.BaseDirectory + @"CalibData";
|
||||
JM1Vision.JM1Manager.Instance.Save(filePath);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
if (MessageBox.Show("是否继续!", null, "是否继续", MessageBoxButton.OKCancel, MessageBoxImage.Question, MessageBoxResult.Cancel) == MessageBoxResult.OK)
|
||||
{
|
||||
_isReDo = true;
|
||||
this.Do(state);
|
||||
}
|
||||
else
|
||||
{
|
||||
_isReDo = false;
|
||||
}
|
||||
}
|
||||
|
||||
MessageBox.Show("校正完成");
|
||||
}
|
||||
|
||||
private void ConvertToRecheckDiePoint(ref SemiconductorVisionAlgorithm.SemiParams.Point[,] pointArray)
|
||||
{
|
||||
var rows = pointArray.GetLength(0);
|
||||
var cols = pointArray.GetLength(1);
|
||||
RecheckDiePoint[,] recheckDiePoint =new RecheckDiePoint[rows, cols];
|
||||
for (int i = 0; i < recheckDiePoint.GetLength(0); i++)
|
||||
{
|
||||
for (int j = 0; j < recheckDiePoint.GetLength(1); j++)
|
||||
{
|
||||
var point = pointArray[i, j];
|
||||
bool isExist = !(point.X == 0 && point.Y == 0);
|
||||
recheckDiePoint[i, j] = new RecheckDiePoint
|
||||
{
|
||||
X = point.X,
|
||||
Y = point.Y,
|
||||
State = isExist
|
||||
};
|
||||
}
|
||||
}
|
||||
JM1Vision.JM1Manager.Instance.FillCalibData(recheckDiePoint, _cameraWaferFusionCalibrationItem.WaferStepXY,
|
||||
_cameraWaferFusionCalibrationItem.WaferCountXY, out RecheckDiePoint[,] resutPoint);
|
||||
|
||||
for (int i = 0; i < rows; i++)
|
||||
{
|
||||
for (int j = 0; j < cols; j++)
|
||||
{
|
||||
var point = resutPoint[i, j];
|
||||
|
||||
pointArray[i, j] = new SemiconductorVisionAlgorithm.SemiParams.Point
|
||||
{
|
||||
X = point.X,
|
||||
Y = point.Y,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private SemiconductorVisionAlgorithm.SemiParams.Point[,] ApprochWSTable (double waferStep, double x1,double y1,double x2,double y2, int count,string path)
|
||||
{
|
||||
SemiconductorVisionAlgorithm.SemiParams.Point[,] pointArray =
|
||||
new SemiconductorVisionAlgorithm.SemiParams.Point[_cameraWaferFusionCalibrationItem.WaferCountXY, _cameraWaferFusionCalibrationItem.WaferCountXY];
|
||||
motion.MovePHSAndWS(x1, y1, x2, y2);
|
||||
for (int y = 0; y < _cameraWaferFusionCalibrationItem.WaferCountXY; y++)
|
||||
{
|
||||
double waferY = y * waferStep + y2;
|
||||
for (int x = 0; x < _cameraWaferFusionCalibrationItem.WaferCountXY; x++)
|
||||
{
|
||||
int index = y % 2 == 0 ? x : _cameraWaferFusionCalibrationItem.WaferCountXY - 1 - x;
|
||||
double waferX = index * waferStep + x2;
|
||||
|
||||
if (_isCancle)
|
||||
{
|
||||
return pointArray;
|
||||
}
|
||||
|
||||
motion.SafeMoveWS(waferX, waferY);
|
||||
|
||||
Point point = new Point();
|
||||
|
||||
//相机拍照
|
||||
if (!_visionOperation.ApproachPointCircle(_device.Camera_ExtendWS, _device.Axis_X21, _device.Axis_Y21,
|
||||
path, Rectangle, out point))
|
||||
{
|
||||
Cancel();
|
||||
}
|
||||
|
||||
Thread.Sleep(100);
|
||||
AxisAndPixelPointItem item = new AxisAndPixelPointItem();
|
||||
item.Id = count;
|
||||
item.AxisX1 = _device.Axis_X11.State.ActualPos;
|
||||
item.AxisX2 = _device.Axis_X21.State.ActualPos;
|
||||
item.AxisY1 = _device.Axis_Y11.State.ActualPos;
|
||||
item.AxisY2 = _device.Axis_Y21.State.ActualPos;
|
||||
item.PixelX = point.X;
|
||||
item.PixelY = point.Y;
|
||||
|
||||
pointArray[index, y] = new SemiconductorVisionAlgorithm.SemiParams.Point(item.AxisX2, item.AxisY2);
|
||||
//IoC.Get<IEventAggregator>()?.Publish(new WaferFusionCalibrationResultEventArgs(item));
|
||||
}
|
||||
}
|
||||
|
||||
return pointArray;
|
||||
}
|
||||
|
||||
private SemiconductorVisionAlgorithm.SemiParams.Point[,] ApprochWSCircleTable(FusionPoint[,] tableDic, double x1, double y1, double x2, double y2, int count, string path)
|
||||
{
|
||||
SemiconductorVisionAlgorithm.SemiParams.Point[,] pointArray =
|
||||
new SemiconductorVisionAlgorithm.SemiParams.Point[_cameraWaferFusionCalibrationItem.WaferCountXY, _cameraWaferFusionCalibrationItem.WaferCountXY];
|
||||
motion.MovePHSAndWS(x1, y1, x2, y2);
|
||||
var offsetX = x2 - _cameraWaferFusionCalibrationItem.CenterX;
|
||||
var rowCount = tableDic.GetLength(0);
|
||||
var columnCount = tableDic.GetLength(1);
|
||||
for (int y = 0; y < rowCount; y++)
|
||||
{
|
||||
|
||||
for (int x = 0; x < columnCount; x++)
|
||||
{
|
||||
int index = y % 2 == 0 ? x : columnCount - 1 - x;
|
||||
|
||||
|
||||
if (_isCancle)
|
||||
{
|
||||
return pointArray;
|
||||
}
|
||||
//var movePoint = tableDic[y,x];
|
||||
var movePoint = tableDic[y, index];
|
||||
if (!movePoint.IsExist)
|
||||
{
|
||||
pointArray[index, y] = new SemiconductorVisionAlgorithm.SemiParams.Point(0, 0);
|
||||
continue;
|
||||
}
|
||||
motion.SafeMoveWS(movePoint.X+ offsetX, movePoint.Y);
|
||||
|
||||
Point point = new Point();
|
||||
|
||||
//相机拍照
|
||||
if (!_visionOperation.ApproachPointCircle(_device.Camera_ExtendWS, _device.Axis_X21, _device.Axis_Y21,
|
||||
path, Rectangle, out point))
|
||||
{
|
||||
Cancel();
|
||||
}
|
||||
|
||||
Thread.Sleep(100);
|
||||
AxisAndPixelPointItem item = new AxisAndPixelPointItem();
|
||||
item.Id = count;
|
||||
item.AxisX1 = _device.Axis_X11.State.ActualPos;
|
||||
item.AxisX2 = _device.Axis_X21.State.ActualPos;
|
||||
item.AxisY1 = _device.Axis_Y11.State.ActualPos;
|
||||
item.AxisY2 = _device.Axis_Y21.State.ActualPos;
|
||||
item.PixelX = point.X;
|
||||
item.PixelY = point.Y;
|
||||
|
||||
pointArray[index, y] = new SemiconductorVisionAlgorithm.SemiParams.Point(item.AxisX2, item.AxisY2);
|
||||
//IoC.Get<IEventAggregator>()?.Publish(new WaferFusionCalibrationResultEventArgs(item));
|
||||
}
|
||||
}
|
||||
|
||||
return pointArray;
|
||||
}
|
||||
|
||||
public override void Finish()
|
||||
{
|
||||
base.Finish();
|
||||
IoC.Get<IProjectManager>().SwitchState();
|
||||
}
|
||||
|
||||
public override void Cancel()
|
||||
{
|
||||
_isCancle = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
1、die融合标定(ws圆形标定融合)
|
||||
即在X1全行程不同位置,标定建立X2,Y1的die融合表,用于对位晶粒,使得晶粒可以通过X2,Y1的补偿移动到任意X1位置下(此时对位是Y1位置微动变化)。
|
||||
标定方法
|
||||
- 在die运动系下(固定X1),移动X2,Y1扫描获取N×N点阵,作为初始位置。
|
||||
- 选取X2负限位位置附近设置起始位置,将X1,X2平移相同距离移动到起始位置,设定标定范围,标定间隔,扫描一系列N×N点阵,保存为die融合位置表。
|
||||
验证方法
|
||||
在die运动系下飞拍任意坐标,再选取任意X1位置,使用融合位置表计算出任意坐标移动到该X11位置下的X2Y1坐标,同时获取到在该X11位置下实际逼近的X2Y1坐标,输出即为标定误差。可选择若干位置覆盖测试全行程误差
|
||||
2、pad融合标定(stage拼接融合)
|
||||
即在Y1全行程不同位置,建立X1,Y2的pad融合表,用于对位pad,使得产品pad在获取到运动系X1,Y2坐标后,可以移动到任意Y1位置下(此时对位是X1位置微动变化)。
|
||||
标定方法
|
||||
- 在pad运动系下(固定Y1),移动X1,Y2扫描获取N×N点阵,作为初始位置。
|
||||
- 选取Y2负限位位置附近设置起始位置,将Y1,Y2平移相同距离移动到起始位置,设立标定范围,标定间隔,扫描一系列N×N点阵,保存为pad融合位置表。
|
||||
验证方法
|
||||
在pad运动系下飞拍任意坐标,再选取任意Y1位置,使用融合位置表计算出任意坐标移动到该Y11位置下的X1Y2坐标,同时获取到在该Y11位置下实际逼近的X1Y2坐标,输出即为标定误差。可选择若干位置覆盖测试全行程误差。
|
||||
3、整体验证
|
||||
整体对位流程为:飞拍获取对应die的下相机X2,Y2坐标,X1坐标固定(上相机die运动系X2Y1),转换为X1,Y1坐标 。pad定位mark获取X1,Y2坐标,Y1坐标固定(上相机pad运动系X1Y2),即转化为X1,Y1坐标 。
|
||||
此时通过查找die融合表将dieX方向对齐pad(此时Y1会产生少许偏移),再根据此时Y1值,将padY方向对齐die,(X1会产生少许偏移),此时再移动X2跟上X1的移动量(此处直接移动或查表再移动)。
|
||||
@@ -0,0 +1,12 @@
|
||||
旧项目的标定页面为CameraFusionCalibAView.xaml里面的融合标定和验证1是新项目需要的流程
|
||||
CameraFusionCali02AViewModel.xaml是原项目的CameraFusionCali02AViewModel.cs
|
||||
CameraFusionCalibrationMotion02A.xaml是原项目的CameraFusionCalibrationMotion02A.cs
|
||||
|
||||
旧项目的ws轴是x2、Y2,pad轴是X1、Y1
|
||||
|
||||
新项目的ws轴是X2、Y1,pad轴是x1、Y2
|
||||
|
||||
新项目的需求是pad融合标定和die融合标定,并且有分别的验证
|
||||
|
||||
然后总体又有一个整体的验证,及对位流程
|
||||
|
||||
Reference in New Issue
Block a user