LGES-OC5-PtoP-Welder/WeldingComponents/WeldingCommon/Views/Recipes/UCScannerObjectTeachingControlBox.xaml
NohDoyeon241104 4ed35cb94a feat: 레시피 화면에서 스캐너 카메라+모션 토글 창 추가 (이벤트 구동)
- 레시피 컨트롤박스에 'Scanner Cam' 버튼 추가 → 카메라+모션 창 Show/Hide 토글
- WDScannerCamMotion: 전용 displayType(Machine_C) 카메라뷰 + 매뉴얼 UCScannerMotion 재사용
- UCScannerMotionViewModel: publish/execute 모드 분리
  - 레시피(publish): 입력값을 EVENT_SCANNER_COMMAND_MOVE 로 발행
  - 매뉴얼(execute): 이벤트 구독해 동일 메소드로 실제 스캐너 이동(인터락 그대로 재사용)
- Move/Jog/Home 메소드를 인자형으로 리팩터해 UI·이벤트 경로가 같은 본체 공유
- 분석 문서 추가(docs/분석/2026/06/23)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 17:03:21 +09:00

177 lines
15 KiB
XML

<UserControl x:Class="WeldingCommon.Views.UCScannerObjectTeachingControlBox"
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:local="clr-namespace:WeldingCommon.Views"
xmlns:behavior="http://schemas.microsoft.com/xaml/behaviors"
xmlns:view="clr-namespace:Aurora.View;assembly=Aurora"
xmlns:mah="http://metro.mahapps.com/winfx/xaml/controls"
xmlns:aurorauicomponent="clr-namespace:AuroraUIComponent;assembly=AuroraUIComponent"
xmlns:usercontrols="clr-namespace:AuroraUIComponent.UserControls;assembly=AuroraUIComponent"
d:DataContext="{d:DesignInstance Type=local:UCScannerObjectTeachingControlBoxViewModel}"
mc:Ignorable="d"
d:DesignHeight="800" d:DesignWidth="300" x:Name="uc">
<UserControl.Resources>
<view:BoolConverter x:Key="convStatusColor" TrueValue="ForestGreen" FalseValue="#3E3E42"/>
<view:BoolConverter x:Key="convSelectedScoutType" TrueValue="Scout Normal" FalseValue="Scout Flying Vision" />
<view:BoolConverter x:Key="convTrueVisible" TrueValue="Visible" FalseValue="Collapsed"/>
<view:BoolConverter x:Key="convFalseVisible" TrueValue="Collapsed" FalseValue="Visible"/>
</UserControl.Resources>
<behavior:Interaction.Triggers>
<behavior:PropertyChangedTrigger Binding="{Binding IsVisible, ElementName=uc}">
<behavior:InvokeCommandAction Command="{Binding CMD_VisibleChanged}" CommandParameter="{Binding IsVisible, ElementName=uc}"/>
</behavior:PropertyChangedTrigger>
</behavior:Interaction.Triggers>
<Grid>
<GroupBox Header="Control">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
</Grid.RowDefinitions>
<GroupBox Header="Scout Image" Grid.Row="0" Margin="0 3 0 0" Style="{StaticResource StGroupBox2nd}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Border Grid.Row="0" Grid.Column="0" MinHeight="30">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="Selected Type" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<Border Grid.Row="0" Grid.Column="1" BorderThickness="1" BorderBrush="Gray">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="{Binding IsSelectedScoutNormal, Converter={StaticResource convSelectedScoutType}}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
</Border>
<!-- Row 1 : Same Row Sleep -->
<Border Grid.Row="1" Grid.Column="0" MinHeight="30" Visibility="{Binding IsSelectedScoutNormal, Converter={StaticResource convTrueVisible}}">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="SameRow Sleep(ms)" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<TextBox Grid.Row="1" Grid.Column="1" Margin="10 3" VerticalAlignment="Center" Visibility="{Binding IsSelectedScoutNormal, Converter={StaticResource convTrueVisible}}" Text="{Binding ScoutSameRowSleepMs, UpdateSourceTrigger=PropertyChanged}"/>
<!-- Row 2 : Row Change Sleep -->
<Border Grid.Row="2" Grid.Column="0" MinHeight="30" Visibility="{Binding IsSelectedScoutNormal, Converter={StaticResource convTrueVisible}}">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="RowChange Sleep(ms)" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<TextBox Grid.Row="2" Grid.Column="1" Margin="10 3" VerticalAlignment="Center" Visibility="{Binding IsSelectedScoutNormal, Converter={StaticResource convTrueVisible}}" Text="{Binding ScoutRowChangeSleepMs, UpdateSourceTrigger=PropertyChanged}"/>
<Grid Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Height="50" Margin="0 5 0 0" Visibility="{Binding IsSelectedScoutNormal, Converter={StaticResource convTrueVisible}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Margin="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" FontWeight="Bold" Style="{StaticResource StButtonAccentPurple}" Command="{Binding CMD_RunScoutNormal}" Content="Run Scout Normal" IsEnabled="{Binding IsSequenceRunning_ScoutNormal, Converter={StaticResource convReverse}}"/>
<Button Grid.Column="1" Margin="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" FontWeight="Bold" Style="{StaticResource StButtonAccentPurple}" Command="{Binding CMD_StopScoutNormal}" Content="Stop" IsEnabled="{Binding IsSequenceRunning_ScoutNormal}"/>
</Grid>
<Grid Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" Height="50" Margin="0" Visibility="{Binding IsSelectedScoutNormal, Converter={StaticResource convFalseVisible}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Margin="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" FontWeight="Bold" Style="{StaticResource StButtonAccentPurple}" Command="{Binding CMD_RunScoutFlyingVision}" Content="Run Flying Vision" IsEnabled="{Binding IsSequenceRunning_ScoutFlyingVision, Converter={StaticResource convReverse}}"/>
<Button Grid.Column="1" Margin="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" FontWeight="Bold" Style="{StaticResource StButtonAccentPurple}" Command="{Binding CMD_StopScoutFlyingVision}" Content="Stop" IsEnabled="{Binding IsSequenceRunning_ScoutFlyingVision}"/>
</Grid>
</Grid>
</GroupBox>
<GroupBox Header="Laser Shot" Grid.Row="1" Margin="0 5 0 0" Style="{StaticResource StGroupBox2nd}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<GroupBox Header="Laser Control" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" Margin="0 3 0 0" Style="{StaticResource StGroupBox4th}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
</Grid.RowDefinitions>
<Border Grid.Row="0" Grid.Column="0" MinHeight="30">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="Guid Beam Status" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<Border Grid.Row="0" Grid.Column="1" BorderThickness="1" BorderBrush="Gray">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="{Binding IsGuidBeam}" Background="{Binding IsGuidBeam, Converter={StaticResource convStatusColor}}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
</Border>
<Button Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="5 1 0 0" Command="{Binding CMD_LaserGuideBeam}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}">
<StackPanel Orientation="Horizontal">
<Image Width="20" Height="10" Margin="5 0 5 0" Source="../../Resource/guide.png"/>
<TextBlock Text="Guid Beam"/>
</StackPanel>
</Button>
<Border Grid.Row="2" Grid.Column="0" MinHeight="30" Margin="0 10 0 0">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="Laser Ready Status" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<Border Grid.Row="2" Grid.Column="1" BorderThickness="1" BorderBrush="Gray" Margin="0 10 0 0">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="{Binding IsLaserReady}" Background="{Binding IsLaserReady, Converter={StaticResource convStatusColor}}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
</Border>
<Button Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="2" Margin="5 1 0 0" Command="{Binding CMD_LaserReadyCheck}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}">
<StackPanel Orientation="Horizontal">
<Image Width="20" Height="10" Margin="5 0 5 0" Source="../../Resource/ready.png"/>
<TextBlock Text="Laser Ready"/>
</StackPanel>
</Button>
</Grid>
</GroupBox>
<GroupBox Header="Object Select" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="0 3 0 0" Style="{StaticResource StGroupBox4th}">
<mah:ToggleSwitch Grid.Column="0" HorizontalAlignment="Center" FontSize="12" FontWeight="Bold"
IsOn="{Binding IsObjectSelectAll}"
OffContent="Selected Object"
OnContent="All Object"/>
</GroupBox>
<Grid Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Margin="0 5 0 0" Height="50">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button Margin="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" FontWeight="Bold" Style="{StaticResource StButtonAccentPurple}" Command="{Binding CMD_RunTeachingRun}" Content="Run Welding" IsEnabled="{Binding IsSequenceRunning_TeachingRun, Converter={StaticResource convReverse}}"/>
<Button Grid.Column="1" Margin="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" FontWeight="Bold" Style="{StaticResource StButtonAccentPurple}" Command="{Binding CMD_StopTeachingRun}" Content="Stop" IsEnabled="{Binding IsSequenceRunning_TeachingRun}"/>
</Grid>
</Grid>
</GroupBox>
<Button Grid.Row="2" Margin="0 5 0 0" HorizontalAlignment="Right" Padding="8 3" Command="{Binding CMD_ToggleScannerCamView}" Style="{StaticResource StButtonAccentBlue}">
<StackPanel Orientation="Horizontal">
<Image Width="20" Height="10" Margin="5 0 5 0" Source="../../Resource/guide.png"/>
<TextBlock Text="Scanner Cam"/>
</StackPanel>
</Button>
<GroupBox Header="Import Object From DXF" Grid.Row="3" Margin="0 5 0 0" Style="{StaticResource StGroupBox2nd}">
<Button Margin="5" Command="{Binding CMD_ImportObjectFromDXF}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}">
<StackPanel Orientation="Horizontal">
<Image Width="20" Height="10" Margin="5 0 5 0" Source="../../Resource/dxf.png"/>
<TextBlock Text="Select Import File"/>
</StackPanel>
</Button>
</GroupBox>
</Grid>
</GroupBox>
</Grid>
</UserControl>