NohDoyeon241104 f5d68248c9 feat: [대면적 MOTF] 레시피 저장/로드 및 페이지 자동 생성 기반 구현 (26.04.10)
- [Line.cs] LargeMOTFPositionX/Y 프로퍼티 추가 ([XmlSerializable])
- [DrawingLayer.cs] LargeMOTFOffsetX/Y 프로퍼티 추가 ([XmlSerializable])
- [RecipeWeldingLines.cs] UseLargeMOTF, LargeMOTFPageCount 프로퍼티 추가 ([XmlSerializable])
  - Load() 에 XmlUtil.ParseProperties() 추가하여 로드 시 반영
- [MainPage.cs]
  - UpdateLargeMOTFPosition() 추가: 저장 직전 Layer별 마지막 Line PF2를 LargeMOTFPositionX/Y에 자동 SET
  - OnRecipeReloaded 이벤트 추가: 레시피 로드 완료 시 콜백
  - GenerateFlippedPages() 추가: EndSet 시 Page3(P2 Y플립), Page4(P1 Y플립) 자동 생성
- [UCScannerObjectTeachingViewModel.cs]
  - OnSaved(): UpdateLargeMOTFPosition, UseLargeMOTF/LargeMOTFPageCount 저장 직전 반영
  - OnChanged(), Reloaded(): 레시피 로드 시 IsUseLargeMOTF, LargeMOTFPageCount UI 반영
  - 생성자: OnRecipeReloaded 이벤트 등록하여 프로그램 시작 시 UI 반영
- [UCScannerObjectTeachingControlBoxViewModel.cs]
  - PerformCmdLargeMOTFEndSet(): LargeMOTFOffsetX 계산 후 GenerateFlippedPages() 호출
  - OnRecipeReloaded 시 LargeMOTFOffsetX UI 반영 (Layer[1] 기준)
2026-04-10 17:31:31 +09:00

156 lines
12 KiB
XML

<UserControl x:Class="ILSOS_PrismaticScanner.Views.UCMainAutoRun"
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:ILSOS_PrismaticScanner.Views"
xmlns:common="clr-namespace:WeldingCommon.Views;assembly=WeldingCommon"
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:UCMainAutoRunViewModel}"
mc:Ignorable="d"
d:DesignHeight="800" d:DesignWidth="1200" x:Name="uc" IsVisibleChanged="uc_IsVisibleChanged">
<UserControl.Resources>
<view:BoolConverter x:Key="convSequenceStatusColor" TrueValue="ForestGreen" FalseValue="#3E3E42"/>
<view:BoolConverter x:Key="convAlarmStatusColor" TrueValue="Red" FalseValue="ForestGreen"/>
<view:BoolConverter x:Key="convSequenceStatus" TrueValue="Process Running" FalseValue="Process Stop" />
<view:BoolConverter x:Key="convAlarmStatus" TrueValue="Alarm Error" FalseValue="No Alarm" />
</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 Margin="10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2.0*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<!--<common:UCCommonAutoRun Grid.Column="0" DataContext="{Binding CommonAutoRunViewModel}"></common:UCCommonAutoRun>-->
<Grid Grid.Column="0">
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<GroupBox Grid.Row="0" Header="Working Position" Margin="0 0 0 0">
<common:UCWorkPos DataContext="{Binding WorkPosViewModel}"></common:UCWorkPos>
</GroupBox>
<GroupBox Grid.Row="1" Header="Recipe Canvas" Margin="0 5 0 0">
<WindowsFormsHost x:Name="windowsFormsHost" Loaded="WindowsFormsHost_Loaded"></WindowsFormsHost>
</GroupBox>
</Grid>
<Grid Grid.Column="1" Margin="5 0 0 0">
<Grid.RowDefinitions>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="auto"></RowDefinition>
<RowDefinition Height="1*"></RowDefinition>
</Grid.RowDefinitions>
<GroupBox Grid.Row="0" Header="Manual Control" Margin="0 0 0 0">
<Grid Height="100" Margin="0 0 0 0">
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="2*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Button Grid.Row="0" Grid.Column="0" Margin="3 0 3 2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" FontWeight="Bold" Style="{StaticResource StButtonAccentPurple}" Command="{Binding CMD_RunSequenceAutoRun}" Content="Run AutoRun" IsEnabled="{Binding IsSequenceRunning_AutoRun, Converter={StaticResource convReverse}}"/>
<Button Grid.Row="0" Grid.Column="1" Margin="3 0 3 2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" FontWeight="Bold" Style="{StaticResource StButtonAccentPurple}" Command="{Binding CMD_StopSequenceAutoRun}" Content="Stop" IsEnabled="{Binding IsSequenceRunning_AutoRun}"/>
<GridSplitter HorizontalAlignment="Stretch" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Height="2" ToolTip="구분선 -> 상단 기존 동작 / 하단 추가된 시퀸스 테스트 버튼"></GridSplitter>
<!-- 26.04.10 NDY AUTORUN ACS 시퀸스 테스트 버튼 -->
<Button Grid.Row="2" Grid.Column="0" Margin="3 0 3 2"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Height="auto" FontWeight="Bold"
Style="{StaticResource StButtonAccentPurple}"
Command="{Binding CMD_StartMOTF}"
Content="Run MOTF"
IsEnabled="{Binding IsSequenceRunning_AutoRun, Converter={StaticResource convReverse}}"/>
<Button Grid.Row="2" Grid.Column="1" Margin="3 0 3 2"
HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
Height="auto" FontWeight="Bold"
Style="{StaticResource StButtonAccentPurple}"
Command="{Binding CMD_StopMOTF}"
Content="Stop"
IsEnabled="{Binding IsSequenceRunning_AutoRun}"/>
</Grid>
</GroupBox>
<GroupBox Grid.Row="1" Header="Equipment Status" Margin="0 5 0 0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<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="AutoRun Status" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<Border Grid.Row="0" Grid.Column="1" BorderThickness="1" BorderBrush="Gray" Margin="2">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="{Binding IsSequenceRunning_AutoRun, Converter={StaticResource convSequenceStatus}}" Background="{Binding IsSequenceRunning_AutoRun, Converter={StaticResource convSequenceStatusColor}}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
</Border>
<Border Grid.Row="1" Grid.Column="0" MinHeight="30">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="Alarm Status" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<Border Grid.Row="1" Grid.Column="1" BorderThickness="1" BorderBrush="Gray" Margin="2">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="{Binding IsAlarm, Converter={StaticResource convAlarmStatus}}" Background="{Binding IsAlarm, Converter={StaticResource convAlarmStatusColor}}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
</Border>
</Grid>
</GroupBox>
<GroupBox Grid.Row="2" Header="Product Info" Margin="0 5 0 0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="0.7*"></ColumnDefinition>
<ColumnDefinition Width="0.3*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<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="Total Product" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<Border Grid.Row="0" Grid.Column="1" BorderThickness="1" BorderBrush="Gray" Margin="2">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="{Binding CurrentWeldingData.TotalProduct}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
</Border>
<Border Grid.Row="1" Grid.Column="0" MinHeight="30">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="Today Product" VerticalAlignment="Center" HorizontalAlignment="Right"/>
</Border>
<Border Grid.Row="1" Grid.Column="1" BorderThickness="1" BorderBrush="Gray" Margin="2">
<TextBlock Margin="10 0" FontSize="12" Foreground="#FFBBBBBB" FontWeight="Bold" Text="{Binding CurrentWeldingData.TodayProduct}" VerticalAlignment="Center" HorizontalAlignment="Left"/>
</Border>
<Button Grid.Row="0" Grid.Column="2" Margin="3" Command="{Binding CMD_Reset}" Content="Reset" CommandParameter="TotalProduct" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}" />
<Button Grid.Row="1" Grid.Column="2" Margin="3" Command="{Binding CMD_Reset}" Content="Reset" CommandParameter="TodayProduct" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="auto" Style="{StaticResource StButtonAccentBlue}" />
<UniformGrid Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" Rows="6">
<usercontrols:UCKeyValueString Height="30" KeyText="Date Time" ValueText="{Binding NowDateTime, StringFormat={}{0:yyyy-MM-dd HH:mm:ss}}" KeyHorizontalAlignment="Right" KeyTextWidth="1*" IsReadOnly="True"/>
<usercontrols:UCKeyValueString Height="30" KeyText="AutoRun Start Time" ValueText="{Binding CurrentWeldingData.AutoRunStartTime, StringFormat={}{0:yyyy-MM-dd HH:mm:ss}}" KeyHorizontalAlignment="Right" KeyTextWidth="1*" IsReadOnly="True"/>
<usercontrols:UCKeyValueString Height="30" KeyText="Last Product Time" ValueText="{Binding CurrentWeldingData.WeldingEndTime, StringFormat={}{0:yyyy-MM-dd HH:mm:ss}}" KeyHorizontalAlignment="Right" KeyTextWidth="1*" IsReadOnly="True"/>
<usercontrols:UCKeyValueString Height="30" KeyText="Welding Time" ValueText="{Binding CurrentWeldingData.TactTime_Welding, StringFormat={}{0:hh\\:mm\\:ss\\.fff}}" KeyHorizontalAlignment="Right" KeyTextWidth="1*" IsReadOnly="True"/>
<usercontrols:UCKeyValueString Height="30" KeyText="Lot ID" ValueText="{Binding CurrentWeldingData.LotId}" KeyHorizontalAlignment="Right" KeyTextWidth="1*" IsReadOnly="True"/>
<usercontrols:UCKeyValueString Height="30" KeyText="Cell ID" ValueText="{Binding CurrentWeldingData.CellId}" KeyHorizontalAlignment="Right" KeyTextWidth="1*" IsReadOnly="True"/>
<usercontrols:UCBoolianValue Height="30" KeyText="NG Judge" LightOn="{Binding CurrentWeldingData.IsVisionNG}" KeyHorizontalAlignment="Right" KeyTextWidth="1*" IsReadOnly="True"/>
</UniformGrid>
</Grid>
</GroupBox>
<GroupBox Grid.Row="3" Header="Camera View" Margin="0 5 0 0">
<Grid x:Name="gridCommonAutoRunCameraView"></Grid>
</GroupBox>
</Grid>
</Grid>
</UserControl>