Files
WCS/Plugins/Wcs/Plugin.Cowain.Wcs/Views/WcsRealStationView.axaml
2026-03-02 11:10:06 +08:00

537 lines
32 KiB
XML

<UserControl
x:Class="Plugin.Cowain.Wcs.Views.WcsRealStationView"
xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="using:Plugin.Cowain.Wcs.Controls"
xmlns:conv="using:Cowain.Base.Converters"
xmlns:convWcs="using:Plugin.Cowain.Wcs.Converters"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:extensions="using:Cowain.Base.Extensions"
xmlns:helper="using:Cowain.Base.Helpers"
xmlns:i="using:Avalonia.Xaml.Interactivity"
xmlns:i18n="clr-namespace:Ke.Bee.Localization.Extensions;assembly=Ke.Bee.Localization"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:semi="https://irihi.tech/semi"
xmlns:u="https://irihi.tech/ursa"
xmlns:vm="using:Plugin.Cowain.Wcs.ViewModels"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
<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:CellPosToCanvansPosConverter x:Key="CellPosToCanvansPosConverter" />
<helper:BindingProxy x:Key="Proxy" DataContext="{Binding}" />
</UserControl.Resources>
<UserControl.Styles>
<Style x:DataType="vm:RgvViewModel" Selector="ItemsControl > ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding LayOutX, Mode=OneWay, Converter={StaticResource CellPosToCanvansPosConverter}, ConverterParameter=130}" />
<Setter Property="Canvas.Top" Value="{Binding LayOutY, Mode=OneWay, Converter={StaticResource CellPosToCanvansPosConverter}, ConverterParameter=60}" />
<Setter Property="ZIndex" Value="10" />
<Setter Property="Transitions">
<Transitions>
<DoubleTransition
Easing="CubicEaseOut"
Property="Canvas.Left"
Duration="0:0:2" />
<DoubleTransition
Easing="CubicEaseOut"
Property="Canvas.Top"
Duration="0:0:2" />
</Transitions>
</Setter>
</Style>
<Style x:DataType="vm:StationViewModel" Selector="ItemsControl > ContentPresenter">
<Setter Property="Canvas.Left" Value="{Binding LayOutX, Mode=OneWay, Converter={StaticResource CellPosToCanvansPosConverter}, ConverterParameter=130}" />
<Setter Property="Canvas.Top" Value="{Binding LayOutY, Mode=OneWay, Converter={StaticResource CellPosToCanvansPosConverter}, ConverterParameter=60}" />
</Style>
</UserControl.Styles>
<Grid Margin="8">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel>
<StackPanel Orientation="Horizontal" Spacing="10">
<TextBlock
Margin="4,4,0,10"
Classes="H4"
Text="{i18n:Localize WcsRealStation.TaskList}"
Theme="{StaticResource TitleTextBlock}" />
</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" />
<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.FromStation1}" />
<TextBlock Grid.Column="6" Text="{i18n:Localize WcsTaskList.DataGrid.ToStation1}" />
<TextBlock Grid.Column="7" Text="{i18n:Localize WcsTaskList.DataGrid.FromStation2}" />
<TextBlock Grid.Column="8" Text="{i18n:Localize WcsTaskList.DataGrid.ToStation2}" />
</Grid>
<ItemsControl ItemsSource="{Binding TaskList}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:TaskViewModel">
<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" />
<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"
VerticalAlignment="Center"
Orientation="Horizontal"
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"
VerticalAlignment="Center"
Orientation="Horizontal"
Spacing="2">
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="FromStationId1" />
<Binding Path="DataContext.Stations" Source="{StaticResource Proxy}" />
<Binding Source="StationName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock Text=":" />
<TextBlock Foreground="Red">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="FromStationId1" />
<Binding Path="DataContext.Stations" Source="{StaticResource Proxy}" />
<Binding Source="StationCode" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
<StackPanel
Grid.Column="6"
VerticalAlignment="Center"
Orientation="Horizontal"
Spacing="2">
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="ToStationId1" />
<Binding Path="DataContext.Stations" Source="{StaticResource Proxy}" />
<Binding Source="StationName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock Text=":" />
<TextBlock Foreground="Red">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="ToStationId1" />
<Binding Path="DataContext.Stations" Source="{StaticResource Proxy}" />
<Binding Source="StationCode" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
<StackPanel
Grid.Column="7"
VerticalAlignment="Center"
Orientation="Horizontal"
Spacing="2">
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="FromStationId2" />
<Binding Path="DataContext.Stations" Source="{StaticResource Proxy}" />
<Binding Source="StationName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock Text=":" />
<TextBlock Foreground="Red">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="FromStationId2" />
<Binding Path="DataContext.Stations" Source="{StaticResource Proxy}" />
<Binding Source="StationCode" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
<StackPanel
Grid.Column="8"
VerticalAlignment="Center"
Orientation="Horizontal"
Spacing="2">
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="ToStationId2" />
<Binding Path="DataContext.Stations" Source="{StaticResource Proxy}" />
<Binding Source="StationName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock Text=":" />
<TextBlock Foreground="Red">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="ToStationId2" />
<Binding Path="DataContext.Stations" Source="{StaticResource Proxy}" />
<Binding Source="StationCode" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
<Grid Grid.Row="1" RowDefinitions="Auto,*">
<StackPanel
Margin="0,10,0,10"
Orientation="Horizontal"
Spacing="10">
<TextBlock
Classes="H4"
Text="{i18n:Localize WcsRealStation.StationStatus}"
Theme="{StaticResource TitleTextBlock}" />
<TextBlock VerticalAlignment="Center" Text="{i18n:Localize WcsRealStation.StationStatus.Tips}" />
<TextBlock VerticalAlignment="Center" Text=":" />
<StackPanel
VerticalAlignment="Center"
Orientation="Horizontal"
Spacing="8">
<Border
Width="24"
Height="24"
Background="Orange"
BorderBrush="Gray"
BorderThickness="1" />
<TextBlock VerticalAlignment="Center" Text="{i18n:Localize StationState.RequestPick}" />
<Border
Width="24"
Height="24"
Background="OrangeRed"
BorderBrush="Gray"
BorderThickness="1" />
<TextBlock VerticalAlignment="Center" Text="{i18n:Localize StationState.RequestPlace}" />
<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 VerticalAlignment="Center" Text="{i18n:Localize StationState.UnKnown}" />
</StackPanel>
</StackPanel>
<ScrollViewer
Grid.Row="1"
HorizontalScrollBarVisibility="Auto"
VerticalScrollBarVisibility="Auto">
<ItemsControl
HorizontalAlignment="Left"
VerticalAlignment="Top"
ItemsSource="{Binding LayoutList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas Width="{Binding Width}" Height="{Binding Height}" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.DataTemplates>
<DataTemplate DataType="{x:Type vm:StationViewModel}">
<Border
Width="120"
Height="50"
Margin="5"
Background="{Binding Status, Converter={StaticResource StationStatusBrushConverter}}"
BorderBrush="{StaticResource SemiGreen4}"
BorderThickness="2"
CornerRadius="5"
Opacity="0.8">
<StackPanel Margin="5" Spacing="5">
<StackPanel
VerticalAlignment="Center"
Orientation="Horizontal"
Spacing="2">
<TextBlock>
<Run Foreground="Black" Text="{Binding StationName}" />
<Run Foreground="Black">:</Run>
<Run Foreground="Black" Text="{Binding StationCode}" />
</TextBlock>
</StackPanel>
<StackPanel
VerticalAlignment="Center"
Orientation="Horizontal"
Spacing="2">
<TextBlock Foreground="Black" Text="{Binding ProcessName}" />
</StackPanel>
</StackPanel>
<ToolTip.Tip>
<StackPanel>
<DockPanel Margin="0,2,0,0" LastChildFill="True">
<TextBlock MinWidth="100" DockPanel.Dock="Left">
<Run Text="{i18n:Localize StationManagement.DataGrid.Process}" />
<Run>:</Run>
</TextBlock>
<TextBlock Text="{Binding ProcessName}" />
</DockPanel>
<DockPanel Margin="0,2,0,0" LastChildFill="True">
<TextBlock MinWidth="100" DockPanel.Dock="Left">
<Run Text="{i18n:Localize StationManagement.DataGrid.QrCode}" />
<Run>:</Run>
</TextBlock>
<TextBlock Text="{Binding QrCode}" />
</DockPanel>
<DockPanel Margin="0,2,0,0" LastChildFill="True">
<TextBlock MinWidth="100" DockPanel.Dock="Left">
<Run Text="{i18n:Localize StationManagement.DataGrid.StationStatus}" />
<Run>:</Run>
</TextBlock>
<TextBlock Text="{Binding Status, Converter={StaticResource i18nConverter}, ConverterParameter='StationState'}" />
</DockPanel>
<DockPanel Margin="0,2,0,0" LastChildFill="True">
<TextBlock MinWidth="100" DockPanel.Dock="Left">
<Run Text="{i18n:Localize StationManagement.DataGrid.UpdateTime}" />
<Run>:</Run>
</TextBlock>
<TextBlock Text="{Binding UpdateTime}" />
</DockPanel>
</StackPanel>
</ToolTip.Tip>
</Border>
</DataTemplate>
<DataTemplate DataType="{x:Type vm:RgvViewModel}">
<Grid Margin="5">
<!-- 箭头装饰器... -->
<controls:RgvArrowDecorator
ArrowBrush="Red"
ArrowDirection="True"
ArrowEndCanvasPoint="{Binding FromStationPoint1}"
IsVisible="{Binding FromStationId1, Converter={StaticResource RgvArrowVisibleConverter}}" />
<controls:RgvArrowDecorator
ArrowBrush="Red"
ArrowDirection="False"
ArrowEndCanvasPoint="{Binding ToStationPoint1}"
IsVisible="{Binding ToStationId1, Converter={StaticResource RgvArrowVisibleConverter}}" />
<controls:RgvArrowDecorator
ArrowBrush="Green"
ArrowDirection="True"
ArrowEndCanvasPoint="{Binding FromStationPoint2}"
IsVisible="{Binding FromStationId2, Converter={StaticResource RgvArrowVisibleConverter}}" />
<controls:RgvArrowDecorator
ArrowBrush="Green"
ArrowDirection="False"
ArrowEndCanvasPoint="{Binding ToStationPoint2}"
IsVisible="{Binding ToStationId2, Converter={StaticResource RgvArrowVisibleConverter}}" />
<!-- 小车本体 -->
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
<!-- 上方三角形 -->
<Polygon
Width="120"
Height="8"
Margin="0,0,0,2"
HorizontalAlignment="Center"
Fill="Black"
Points="60,0 50,8 70,8">
<Polygon.Styles>
<Style Selector="Polygon">
<Style.Animations>
<Animation IterationCount="Infinite" Duration="0:0:1">
<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="120"
Height="30"
CornerRadius="10"
Opacity="0.8">
<Border.Background>
<LinearGradientBrush StartPoint="50%,0%" EndPoint="50%,100%">
<GradientStop Offset="0.0" Color="#A8E6CF" />
<GradientStop Offset="0.5" Color="#3D84A8" />
<GradientStop Offset="1.0" Color="#46CDCF" />
</LinearGradientBrush>
</Border.Background>
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Foreground="Black"
Text="{Binding StationName}"
TextAlignment="Center" />
<ToolTip.Tip>
<StackPanel>
<TextBlock
Margin="0,0,0,4"
FontWeight="Bold"
Text="{i18n:Localize WcsRealStation.Title.RgvToolTip}" />
<DockPanel Margin="0,2,0,0" LastChildFill="True">
<TextBlock
MinWidth="40"
DockPanel.Dock="Left"
Text="1: " />
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="FromStationId1" />
<Binding Path="DataContext.Stations" Source="{StaticResource Proxy}" />
<Binding Source="StationName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock Text=" -> " />
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="ToStationId1" />
<Binding Path="DataContext.Stations" Source="{StaticResource Proxy}" />
<Binding Source="StationName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DockPanel>
<DockPanel Margin="0,2,0,0" LastChildFill="True">
<TextBlock
MinWidth="40"
DockPanel.Dock="Left"
Text="2: " />
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="FromStationId2" />
<Binding Path="DataContext.Stations" Source="{StaticResource Proxy}" />
<Binding Source="StationName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock Text=" -> " />
<TextBlock>
<TextBlock.Text>
<MultiBinding Converter="{StaticResource IdToPropertyConverter}">
<Binding Path="ToStationId2" />
<Binding Path="DataContext.Stations" Source="{StaticResource Proxy}" />
<Binding Source="StationName" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DockPanel>
</StackPanel>
</ToolTip.Tip>
</Border>
<!-- 下方三角形 -->
<Polygon
Width="120"
Height="8"
Margin="0,2,0,0"
HorizontalAlignment="Center"
Fill="Black"
Points="60,8 50,0 70,0">
<Polygon.Styles>
<Style Selector="Polygon">
<Style.Animations>
<Animation IterationCount="Infinite" Duration="0:0:1">
<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>
</Grid>
</Grid>
</UserControl>