Files
WCS/Plugins/Wcs/Plugin.Cowain.Wcs/Views/WcsRealStationView.axaml
2026-03-02 09:13:29 +08:00

316 lines
16 KiB
XML

<UserControl xmlns="https://github.com/avaloniaui"
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:semi="https://irihi.tech/semi"
xmlns:u="https://irihi.tech/ursa"
xmlns:i="using:Avalonia.Xaml.Interactivity"
xmlns:vm="using:Plugin.Cowain.Wcs.ViewModels"
xmlns:i18n="clr-namespace:Ke.Bee.Localization.Extensions;assembly=Ke.Bee.Localization"
xmlns:conv="using:Cowain.Base.Converters"
xmlns:helper="using:Cowain.Base.Helpers"
xmlns:convWcs="using:Plugin.Cowain.Wcs.Converters"
xmlns:controls="using:Plugin.Cowain.Wcs.Controls"
xmlns:extensions="using:Cowain.Base.Extensions"
mc:Ignorable="d"
d:DesignWidth="800"
d:DesignHeight="450"
x:Class="Plugin.Cowain.Wcs.Views.WcsRealStationView">
<UserControl.Resources>
<conv:I18nLocalizeConverter x:Key="i18nConverter" />
<conv:MultiIdToPropertyConverter x:Key="IdToPropertyConverter" />
<conv:ListCountConverter x:Key="ListCountConverter" />
<convWcs:StationStatusBrushConverter x:Key="StationStatusBrushConverter" />
<convWcs:RgvArrowVisibleConverter x:Key="RgvArrowVisibleConverter" />
<convWcs:LayoutRowDefinitionsConverter x:Key="LayoutRowDefinitionsConverter" />
<convWcs:LayoutColumnDefinitionsConverter x:Key="LayoutColumnDefinitionsConverter" />
<convWcs:CellPositionToPixelConverter x:Key="CellPositionToPixelConverter" />
<helper:BindingProxy x:Key="Proxy"
DataContext="{Binding}" />
</UserControl.Resources>
<UserControl.Styles>
<Style Selector="ItemsControl > ContentPresenter" x:DataType="vm:RgvViewModel">
<Setter Property="Canvas.Left" Value="{Binding LayOutX ,Mode=OneWay, Converter={StaticResource CellPositionToPixelConverter}}" />
<Setter Property="Canvas.Top" Value="{Binding LayOutY ,Mode=OneWay, Converter={StaticResource CellPositionToPixelConverter}}" />
<Setter Property="ZIndex" Value="10" />
<Setter Property="Transitions">
<Transitions>
<DoubleTransition Property="Canvas.Left" Duration="0:0:2" Easing="CubicEaseOut" />
<DoubleTransition Property="Canvas.Top" Duration="0:0:2" Easing="CubicEaseOut" />
</Transitions>
</Setter>
</Style>
<Style Selector="ItemsControl > ContentPresenter" x:DataType="vm:StationViewModel">
<Setter Property="Canvas.Left" Value="{Binding LayOutX ,Mode=OneWay, Converter={StaticResource CellPositionToPixelConverter}}" />
<Setter Property="Canvas.Top" Value="{Binding LayOutY ,Mode=OneWay, Converter={StaticResource CellPositionToPixelConverter}}" />
</Style>
</UserControl.Styles>
<Grid Margin="8">
<Grid.RowDefinitions>
<RowDefinition Height="200" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<StackPanel>
<StackPanel Orientation="Horizontal" Spacing="10">
<TextBlock Text="{i18n:Localize WcsRealStation.TaskList}" Classes="H4" Theme="{StaticResource TitleTextBlock}" Margin="4,4,0,10"/>
</StackPanel>
<Grid Margin="6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="180"/>
<ColumnDefinition Width="180"/>
<ColumnDefinition Width="180"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{i18n:Localize WcsTaskList.DataGrid.Id}"/>
<TextBlock Grid.Column="1" Text="{i18n:Localize WcsTaskList.DataGrid.IsFinished}"/>
<TextBlock Grid.Column="2" Text="{i18n:Localize WcsTaskList.DataGrid.ProcessName}"/>
<TextBlock Grid.Column="3" Text="{i18n:Localize WcsTaskList.DataGrid.Priority}"/>
<TextBlock Grid.Column="4" Text="{i18n:Localize WcsTaskList.DataGrid.ExecuteAction}"/>
<TextBlock Grid.Column="5" Text="{i18n:Localize WcsTaskList.DataGrid.FromStation}"/>
<TextBlock Grid.Column="6" Text="{i18n:Localize WcsTaskList.DataGrid.ToStation}"/>
</Grid>
<ItemsControl ItemsSource="{Binding TaskList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="6">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="120"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="180"/>
<ColumnDefinition Width="180"/>
<ColumnDefinition Width="180"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="{Binding Id}"/>
<TextBlock Grid.Column="1" Text="{Binding IsFinished,Converter={StaticResource i18nConverter}, ConverterParameter='WcsTaskList'}"/>
<TextBlock Grid.Column="2" Text="{Binding ProcessName}"/>
<TextBlock Grid.Column="3" Text="{Binding Priority}"/>
<StackPanel Grid.Column="4" Orientation="Horizontal" VerticalAlignment="Center" Spacing="2">
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="ExecuteAction" />
<Binding Path="Actions" />
<Binding Source="Name" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
<StackPanel Grid.Column="5" Orientation="Horizontal" VerticalAlignment="Center" Spacing="2">
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="FromStationId" />
<Binding Source="{StaticResource Proxy}" Path="DataContext.Stations" />
<Binding Source="StationName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock Text=":" />
<TextBlock Foreground="Red">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="FromStationId" />
<Binding Source="{StaticResource Proxy}" Path="DataContext.Stations" />
<Binding Source="StationCode" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
<StackPanel Grid.Column="6" Orientation="Horizontal" VerticalAlignment="Center" Spacing="2">
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="ToStationId" />
<Binding Source="{StaticResource Proxy}" Path="DataContext.Stations" />
<Binding Source="StationName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock Text=":" />
<TextBlock Foreground="Red">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="ToStationId" />
<Binding Source="{StaticResource Proxy}" Path="DataContext.Stations" />
<Binding Source="StationCode" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
<StackPanel Grid.Row="1">
<StackPanel Orientation="Horizontal" Spacing="10" Margin="0 0 0 10">
<TextBlock Text="{i18n:Localize WcsRealStation.StationStatus}" Classes="H4" Theme="{StaticResource TitleTextBlock}"/>
<TextBlock Text="{i18n:Localize WcsRealStation.StationStatus.Tips}" VerticalAlignment="Center"/>
<TextBlock Text=":" VerticalAlignment="Center"/>
<StackPanel Orientation="Horizontal" Spacing="8" VerticalAlignment="Center">
<Border Width="24" Height="24" Background="Orange" BorderBrush="Gray" BorderThickness="1" />
<TextBlock Text="{i18n:Localize StationState.RequestPick}" VerticalAlignment="Center" />
<Border Width="24" Height="24" Background="OrangeRed" BorderBrush="Gray" BorderThickness="1" />
<TextBlock Text="{i18n:Localize StationState.RequestPlace}" VerticalAlignment="Center" />
<Border Width="24" Height="24" Background="Yellow" BorderBrush="Gray" BorderThickness="1" />
<TextBlock VerticalAlignment="Center" >
<Run Text="{i18n:Localize StationState.Picking}" />
<Run > / </Run>
<Run Text="{i18n:Localize StationState.Placing}"/>
</TextBlock>
<Border Width="24" Height="24" Background="LightGreen" BorderBrush="Gray" BorderThickness="1" />
<TextBlock VerticalAlignment="Center" >
<Run Text="{i18n:Localize StationState.PickFinished}" />
<Run > / </Run>
<Run Text="{i18n:Localize StationState.PlaceFinished}"/>
</TextBlock>
<Border Width="24" Height="24" Background="Gray" BorderBrush="Gray" BorderThickness="1" />
<TextBlock Text="{i18n:Localize StationState.UnKnown}" VerticalAlignment="Center"/>
</StackPanel>
</StackPanel>
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<ItemsControl ItemsSource="{Binding LayoutList}"
HorizontalAlignment="Left" VerticalAlignment="Top">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Width="{Binding Width}" Height="{Binding Height}"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.DataTemplates>
<DataTemplate DataType="{x:Type vm:StationViewModel}">
<Border Width="100" Height="100" Margin="5"
BorderBrush="{StaticResource SemiGreen4}"
Background="{Binding Status ,Converter={StaticResource StationStatusBrushConverter} }"
BorderThickness="2" CornerRadius="5" >
<StackPanel Spacing="5" Margin="5">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Spacing="2">
<TextBlock>
<Run Text="{Binding StationName}" Foreground="Black"/>
<Run Foreground="Black"> : </Run>
<Run Text="{Binding StationCode}" Foreground="Red"/>
</TextBlock>
</StackPanel>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Spacing="2">
<TextBlock Text="{Binding ProcessName}" Foreground="Black"/>
</StackPanel>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Spacing="2">
<TextBlock Foreground="Black" Text="{Binding Status,Converter={StaticResource i18nConverter}, ConverterParameter='StationState'}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" Spacing="2">
<TextBlock Foreground="Black" Text="{Binding QrCode}"/>
</StackPanel>
</StackPanel>
</Border>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:RgvViewModel}">
<Grid>
<!-- 箭头装饰器们 ... -->
<controls:RgvArrowDecorator
ArrowEndCanvasPoint="{Binding FromStationPoint}"
ArrowBrush="Red" ArrowDirection="True"
IsVisible="{Binding FromStationId , Converter={StaticResource RgvArrowVisibleConverter}}"/>
<controls:RgvArrowDecorator
ArrowEndCanvasPoint="{Binding ToStationPoint}"
ArrowBrush="Green" ArrowDirection="False"
IsVisible="{Binding ToStationId , Converter={StaticResource RgvArrowVisibleConverter}}"/>
<!-- 小车本体 -->
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Spacing="10" Margin="5" >
<!-- 上方三角形 -->
<Polygon Points="50,0 40,15 60,15" Fill="Black" Width="100" Height="15" HorizontalAlignment="Center">
<Polygon.Styles>
<Style>
<Style.Animations>
<Animation Duration="0:0:1" IterationCount="Infinite">
<KeyFrame Cue="0%">
<Setter Property="Opacity" Value="0.0"/>
</KeyFrame>
<KeyFrame Cue="100%">
<Setter Property="Opacity" Value="0.5"/>
</KeyFrame>
</Animation>
</Style.Animations>
</Style>
</Polygon.Styles>
</Polygon>
<!-- 小车矩形 -->
<Border Width="100" Height="50"
CornerRadius="10">
<Border.Background>
<LinearGradientBrush StartPoint="50%,0%" EndPoint="50%,100%">
<GradientStop Color="#A8E6CF" Offset="0.0"/>
<GradientStop Color="#3D84A8" Offset="0.5"/>
<GradientStop Color="#46CDCF" Offset="1.0"/>
</LinearGradientBrush>
</Border.Background>
<StackPanel Spacing="5">
<TextBlock Text="{Binding StationName}" Foreground="Black"
HorizontalAlignment="Center"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center" Spacing="2">
<TextBlock Foreground="Black">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="FromStationId" />
<Binding Source="{StaticResource Proxy}" Path="DataContext.Stations" />
<Binding Source="StationName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock Text="->" Foreground="Black"/>
<TextBlock Foreground="Black">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="ToStationId" />
<Binding Source="{StaticResource Proxy}" Path="DataContext.Stations" />
<Binding Source="StationName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</StackPanel>
</Border>
<!-- 下方三角形 -->
<Polygon Points="50,15 40,0 60,0" Fill="Black" Width="100" Height="15" HorizontalAlignment="Center">
<Polygon.Styles>
<Style>
<Style.Animations>
<Animation Duration="0:0:1" IterationCount="Infinite">
<KeyFrame Cue="0%">
<Setter Property="Opacity" Value="0.0"/>
</KeyFrame>
<KeyFrame Cue="100%">
<Setter Property="Opacity" Value="0.5"/>
</KeyFrame>
</Animation>
</Style.Animations>
</Style>
</Polygon.Styles>
</Polygon>
</StackPanel>
</Grid>
</DataTemplate>
</ItemsControl.DataTemplates>
</ItemsControl>
</ScrollViewer>
</StackPanel>
</Grid>
</UserControl>