CtrEditor/ObjetosSim/HydraulicComponents/ucHydTank.xaml

340 lines
19 KiB
XML

<UserControl x:Class="CtrEditor.ObjetosSim.ucHydTank"
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:CtrEditor.ObjetosSim"
xmlns:vm="clr-namespace:CtrEditor.ObjetosSim"
mc:Ignorable="d">
<!-- DataContext se establece desde el objeto padre, no aquí -->
<UserControl.DataContext>
<vm:osHydTank />
</UserControl.DataContext>
<Canvas RenderTransformOrigin="0,0">
<Canvas.RenderTransform>
<TransformGroup>
<ScaleTransform />
<SkewTransform />
<RotateTransform Angle="{Binding Angulo}" />
<TranslateTransform />
</TransformGroup>
</Canvas.RenderTransform>
<!-- Contenedor principal del tanque con diseño mejorado -->
<Grid Width="{Binding Tamano, Converter={StaticResource MeterToPixelConverter}}"
Height="{Binding Tamano, Converter={StaticResource MeterToPixelConverter}, ConverterParameter=1.4}">
<!-- Fondo del tanque (contenedor vacío) con diseño 3D -->
<Rectangle x:Name="rectTankContainer"
Fill="#FFE6E6E6"
Stroke="#FF606060"
StrokeThickness="3"
RadiusX="8"
RadiusY="8"
Effect="{StaticResource DropShadowEffect}"/>
<!-- Marco interno del tanque -->
<Rectangle Fill="Transparent"
Stroke="#FF404040"
StrokeThickness="1"
RadiusX="6"
RadiusY="6"
Margin="6"/>
<!-- Sistema de tres secciones (solo si está habilitado) -->
<Grid x:Name="ThreeSectionContainer"
Margin="8"
Visibility="{Binding EnableThreeSection, Converter={StaticResource BooleanToVisibilityConverter}}">
<!-- Sección secundaria (abajo) -->
<Rectangle x:Name="rectSecondaryLevel"
Fill="{Binding SecondaryLevelColor}"
Stroke="#FF1E90FF"
StrokeThickness="1.5"
RadiusX="4"
RadiusY="4"
VerticalAlignment="Bottom"
Opacity="0.85">
<Rectangle.Height>
<MultiBinding Converter="{StaticResource TankLevelToHeightConverter}">
<Binding Path="SecondaryPercentage"/>
<Binding Path="Tamano"/>
<Binding Source="0.33"/>
</MultiBinding>
</Rectangle.Height>
</Rectangle>
<!-- Sección de mezcla (medio) -->
<Rectangle x:Name="rectMixLevel"
Fill="{Binding MixLevelColor}"
Stroke="#FFFF6347"
StrokeThickness="1.5"
RadiusX="4"
RadiusY="4"
VerticalAlignment="Bottom"
Opacity="0.85">
<Rectangle.Height>
<MultiBinding Converter="{StaticResource TankLevelToHeightConverter}">
<Binding Path="PrimaryPercentage"/>
<Binding Path="Tamano"/>
<Binding Source="0.33"/>
</MultiBinding>
</Rectangle.Height>
<Rectangle.Margin>
<MultiBinding Converter="{StaticResource TankSectionMarginConverter}">
<Binding Path="SecondaryPercentage"/>
<Binding Path="Tamano"/>
<Binding Source="0.33"/>
</MultiBinding>
</Rectangle.Margin>
</Rectangle>
<!-- Etiquetas de sección -->
<Canvas>
<!-- Etiqueta sección secundaria -->
<Border Background="#AA1E90FF" CornerRadius="2" Padding="2,1"
Canvas.Left="2" Canvas.Bottom="2">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Sec:" Foreground="White" FontSize="6" FontWeight="Bold"/>
<TextBlock Text="{Binding SecondaryPercentage, StringFormat='{}{0:F0}%'}"
Foreground="White" FontSize="6" Margin="1,0,0,0"/>
<TextBlock Text="{Binding SecondaryVolumeL, StringFormat=' ({0:F0}L)'}"
Foreground="White" FontSize="5" Opacity="0.9"/>
</StackPanel>
</Border>
<!-- Etiqueta sección primaria -->
<Border Background="#AAFF6347" CornerRadius="2" Padding="2,1"
Canvas.Right="2" Canvas.Top="2">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Pri:" Foreground="White" FontSize="6" FontWeight="Bold"/>
<TextBlock Text="{Binding PrimaryPercentage, StringFormat='{}{0:F0}%'}"
Foreground="White" FontSize="6" Margin="1,0,0,0"/>
<TextBlock Text="{Binding PrimaryVolumeL, StringFormat=' ({0:F0}L)'}"
Foreground="White" FontSize="5" Opacity="0.9"/>
</StackPanel>
</Border>
</Canvas>
</Grid>
<!-- Sistema de una sección (clásico) -->
<Grid x:Name="SingleSectionContainer"
Margin="8"
Visibility="{Binding EnableThreeSection, Converter={StaticResource InverseBooleanToVisibilityConverter}}">
<!-- Nivel del líquido tradicional -->
<Rectangle x:Name="rectFluidLevel"
Fill="{Binding LevelColor}"
Stroke="{Binding LevelBorderColor}"
StrokeThickness="1.5"
RadiusX="4"
RadiusY="4"
VerticalAlignment="Bottom"
Opacity="0.85">
<Rectangle.Height>
<MultiBinding Converter="{StaticResource TankLevelToHeightConverter}">
<Binding Path="FillPercentage"/>
<Binding Path="Tamano"/>
<Binding Source="1.0"/>
</MultiBinding>
</Rectangle.Height>
</Rectangle>
</Grid>
<!-- Líneas de nivel mejoradas -->
<Canvas Margin="8">
<!-- Línea de nivel máximo -->
<Line X1="0" Y1="4" X2="{Binding ActualWidth, ElementName=rectTankContainer, Converter={StaticResource SubtractConverter}, ConverterParameter=16}" Y2="4"
Stroke="#FFB22222" StrokeThickness="2" StrokeDashArray="4,2" Opacity="0.8"/>
<TextBlock Canvas.Right="2" Canvas.Top="-2" Text="MAX" Foreground="#FFB22222" FontSize="6" FontWeight="Bold"/>
<!-- Línea de nivel medio -->
<Line X1="0" Y1="{Binding MidLevelY}" X2="{Binding ActualWidth, ElementName=rectTankContainer, Converter={StaticResource SubtractConverter}, ConverterParameter=16}" Y2="{Binding MidLevelY}"
Stroke="#FFFF8C00" StrokeThickness="1" StrokeDashArray="2,2" Opacity="0.6"/>
<TextBlock Canvas.Right="2" Canvas.Top="{Binding MidLevelY, Converter={StaticResource SubtractConverter}, ConverterParameter=8}"
Text="50%" Foreground="#FFFF8C00" FontSize="5"/>
<!-- Línea de nivel mínimo -->
<Line X1="0" Y1="{Binding MinLevelY}" X2="{Binding ActualWidth, ElementName=rectTankContainer, Converter={StaticResource SubtractConverter}, ConverterParameter=16}" Y2="{Binding MinLevelY}"
Stroke="#FFB22222" StrokeThickness="2" StrokeDashArray="4,2" Opacity="0.8"/>
<TextBlock Canvas.Right="2" Canvas.Bottom="2" Text="MIN" Foreground="#FFB22222" FontSize="6" FontWeight="Bold"/>
</Canvas>
<!-- Información central del tanque -->
<Grid HorizontalAlignment="Center" VerticalAlignment="Center">
<!-- Nivel total y volumen -->
<Border Background="#AA000000" CornerRadius="4" Padding="6,4">
<StackPanel HorizontalAlignment="Center">
<!-- Porcentaje principal -->
<TextBlock Text="{Binding FillPercentage, StringFormat='{}{0:F0}%'}"
HorizontalAlignment="Center"
Foreground="White"
FontWeight="Bold"
FontSize="14"/>
<!-- Volumen actual -->
<TextBlock Text="{Binding CurrentVolumeL, StringFormat='{}{0:F0} L'}"
HorizontalAlignment="Center"
Foreground="LightCyan"
FontSize="8"
Margin="0,1,0,0"/>
<!-- Nivel sobre el mar -->
<TextBlock Text="{Binding CurrentLevelM, StringFormat='⌂ {0:F2} m'}"
HorizontalAlignment="Center"
Foreground="LightGreen"
FontSize="7"
Margin="0,1,0,0"/>
</StackPanel>
</Border>
</Grid>
<!-- Indicadores superiores -->
<Grid HorizontalAlignment="Left" VerticalAlignment="Top" Margin="4,4,0,0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Tipo de tanque -->
<Border Grid.Row="0" Background="#FF000080" CornerRadius="3" Padding="4,2">
<TextBlock Text="{Binding TankTypeIndicator}"
Foreground="White"
FontWeight="Bold"
FontSize="10" />
</Border>
<!-- Tipo de fluido actual -->
<Border Grid.Row="1" Background="#FF006400" CornerRadius="3" Padding="3,2" Margin="0,2,0,0">
<TextBlock Text="{Binding CurrentFluidDescription}"
Foreground="White"
FontSize="7"
FontWeight="SemiBold"
TextTrimming="CharacterEllipsis"
MaxWidth="60"/>
</Border>
<!-- Estado de mezcla -->
<Border Grid.Row="2" Background="#FF8B4513" CornerRadius="3" Padding="3,2" Margin="0,2,0,0"
Visibility="{Binding EnableThreeSection, Converter={StaticResource BooleanToVisibilityConverter}}">
<TextBlock Text="{Binding MixingState}"
Foreground="White"
FontSize="6"
FontWeight="SemiBold"
TextTrimming="CharacterEllipsis"
MaxWidth="60"/>
</Border>
</Grid>
</Grid>
<!-- Panel de información detallado -->
<Grid Canvas.Top="{Binding Tamano, Converter={StaticResource MeterToPixelConverter}, ConverterParameter=1.5}"
Width="{Binding Tamano, Converter={StaticResource MeterToPixelConverter}}">
<!-- Fondo del panel con gradiente -->
<Border CornerRadius="5" Margin="0,4,0,0" Padding="4">
<StackPanel Orientation="Vertical" HorizontalAlignment="Center">
<!-- Fila 1: Presión y Nivel absoluto -->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,2">
<!-- Presión actual -->
<Border Background="#FF1E90FF" CornerRadius="3" Padding="4,3" Margin="2">
<StackPanel Orientation="Horizontal">
<TextBlock Text="⚡" Foreground="White" FontSize="9" FontWeight="Bold"/>
<TextBlock Text="{Binding CurrentPressure, StringFormat='{}{0:F2}'}"
Foreground="White" FontSize="8" FontWeight="SemiBold" Margin="2,0,0,0"/>
<TextBlock Text="bar" Foreground="LightCyan" FontSize="7" Opacity="0.9" Margin="1,0,0,0"/>
</StackPanel>
</Border>
<!-- Nivel absoluto -->
<Border Background="#FF32CD32" CornerRadius="3" Padding="4,3" Margin="2">
<StackPanel Orientation="Horizontal">
<TextBlock Text="🌊" Foreground="White" FontSize="9" FontWeight="Bold"/>
<TextBlock Text="{Binding CurrentLevelM, StringFormat='{}{0:F3}'}"
Foreground="White" FontSize="8" FontWeight="SemiBold" Margin="2,0,0,0"/>
<TextBlock Text="m" Foreground="LightGreen" FontSize="7" Opacity="0.9" Margin="1,0,0,0"/>
</StackPanel>
</Border>
</StackPanel>
<!-- Fila 2: Flujos de entrada y salida -->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,2">
<!-- Flujo de entrada -->
<Border Background="#FF228B22" CornerRadius="3" Padding="4,3" Margin="2">
<StackPanel Orientation="Horizontal">
<TextBlock Text="▼" Foreground="White" FontSize="9" FontWeight="Bold"/>
<TextBlock Text="{Binding InletFlow, StringFormat='{}{0:F1}'}"
Foreground="White" FontSize="8" FontWeight="SemiBold" Margin="2,0,0,0"/>
<TextBlock Text="L/min" Foreground="LightGreen" FontSize="6" Opacity="0.9" Margin="1,0,0,0"/>
</StackPanel>
</Border>
<!-- Flujo de salida -->
<Border Background="#FFDC143C" CornerRadius="3" Padding="4,3" Margin="2">
<StackPanel Orientation="Horizontal">
<TextBlock Text="▲" Foreground="White" FontSize="9" FontWeight="Bold"/>
<TextBlock Text="{Binding OutletFlow, StringFormat='{}{0:F1}'}"
Foreground="White" FontSize="8" FontWeight="SemiBold" Margin="2,0,0,0"/>
<TextBlock Text="L/min" Foreground="LightPink" FontSize="6" Opacity="0.9" Margin="1,0,0,0"/>
</StackPanel>
</Border>
<!-- Balance de flujo -->
<Border Background="{Binding FlowBalanceColor}" CornerRadius="3" Padding="4,3" Margin="2">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Δ" Foreground="White" FontSize="9" FontWeight="Bold"/>
<TextBlock Text="{Binding FlowBalance, StringFormat='{}{0:F1}'}"
Foreground="White" FontSize="8" FontWeight="SemiBold" Margin="2,0,0,0"/>
<TextBlock Text="L/min" Foreground="White" FontSize="6" Opacity="0.9" Margin="1,0,0,0"/>
</StackPanel>
</Border>
</StackPanel>
<!-- Fila 3: Información de tres secciones (solo si está habilitado) -->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,2"
Visibility="{Binding EnableThreeSection, Converter={StaticResource BooleanToVisibilityConverter}}">
<!-- Sección secundaria -->
<Border Background="#AA1E90FF" CornerRadius="3" Padding="3,2" Margin="1">
<StackPanel Orientation="Horizontal">
<TextBlock Text="S:" Foreground="White" FontSize="7" FontWeight="Bold"/>
<TextBlock Text="{Binding SecondaryLevelM, StringFormat='{}{0:F2}m'}"
Foreground="White" FontSize="7" Margin="1,0,0,0"/>
<TextBlock Text="{Binding SecondaryVolumeL, StringFormat=' {0:F0}L'}"
Foreground="LightCyan" FontSize="6" Opacity="0.9"/>
</StackPanel>
</Border>
<!-- Sección primaria -->
<Border Background="#AAFF6347" CornerRadius="3" Padding="3,2" Margin="1">
<StackPanel Orientation="Horizontal">
<TextBlock Text="P:" Foreground="White" FontSize="7" FontWeight="Bold"/>
<TextBlock Text="{Binding PrimaryLevelM, StringFormat='{}{0:F2}m'}"
Foreground="White" FontSize="7" Margin="1,0,0,0"/>
<TextBlock Text="{Binding PrimaryVolumeL, StringFormat=' {0:F0}L'}"
Foreground="LightYellow" FontSize="6" Opacity="0.9"/>
</StackPanel>
</Border>
<!-- Ratio de mezcla -->
<Border Background="#AA8B4513" CornerRadius="3" Padding="3,2" Margin="1">
<StackPanel Orientation="Horizontal">
<TextBlock Text="Mix:" Foreground="White" FontSize="7" FontWeight="Bold"/>
<TextBlock Text="{Binding CurrentMixRatio, StringFormat='{}{0:P0}'}"
Foreground="White" FontSize="7" Margin="1,0,0,0"/>
</StackPanel>
</Border>
</StackPanel>
</StackPanel>
</Border>
</Grid>
</Canvas>
</UserControl>