Viewer of IsoFields is added

This commit is contained in:
Evgeny Redikultsev
2022-09-04 19:47:09 +05:00
parent cf0392ad6f
commit c12e9f70f9
43 changed files with 1550 additions and 1 deletions

View File

@@ -0,0 +1,41 @@
<UserControl x:Class="FieldVisualizer.Windows.UserControls.FieldViewer"
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:FieldVisualizer.Windows.UserControls"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="200"/>
</Grid.ColumnDefinitions>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal">
<Button x:Name="RebuildButton" Content="Rebuild" Click="RebuildButton_Click"/>
<Button x:Name="ZoomInButton" Content="ZoomIn" Click="ZoomInButton_Click"/>
<Button x:Name="ZoomOutButton" Content="ZoomOut" Click="ZoomOutButton_Click"/>
<Button x:Name="ChangeColorMapButton" Content="ColorMap" Click="ChangeColorMapButton_Click"/>
</StackPanel>
<ScrollViewer Name="WorkPlaneViewer" Grid.Row="1" HorizontalScrollBarVisibility="Visible">
<ScrollViewer.Background>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="Black"/>
<GradientStop Color="White" Offset="1"/>
<GradientStop Color="#FF00EDFF" Offset="0"/>
</LinearGradientBrush>
</ScrollViewer.Background>
<Viewbox Name="WorkPlaneBox" Margin="10">
<Canvas Name="WorkPlaneCanvas"/>
</Viewbox>
</ScrollViewer>
</Grid>
<local:VerticalLegend x:Name="LegendViewer" Grid.Column="2"/>
</Grid>
</UserControl>

View File

@@ -0,0 +1,135 @@
using FieldVisualizer.Entities.ColorMaps;
using FieldVisualizer.Entities.ColorMaps.Factories;
using FieldVisualizer.Entities.Values;
using FieldVisualizer.Entities.Values.Primitives;
using FieldVisualizer.InfraStructures.Enums;
using FieldVisualizer.Services.ColorServices;
using FieldVisualizer.Services.PrimitiveServices;
using FieldVisualizer.Services.ValueRanges;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace FieldVisualizer.Windows.UserControls
{
/// <summary>
/// Логика взаимодействия для FieldViewer.xaml
/// </summary>
public partial class FieldViewer : UserControl
{
public IPrimitiveSet _PrimitiveSet { get; set; }
private double dX, dY;
private ColorMapsTypes _ColorMapType;
private IColorMap _ColorMap;
private IValueRange _ValueRange;
private IEnumerable<IValueRange> _ValueRanges;
private IEnumerable<IValueColorRange> _ValueColorRanges;
const int RangeNumber = 16;
public FieldViewer()
{
InitializeComponent();
_ColorMapType = ColorMapsTypes.FullSpectrum;
}
public void Refresh()
{
_ValueRange = PrimitiveOperations.GetValuRange(_PrimitiveSet.ValuePrimitives);
_ValueRanges = ValueRangeOperations.DivideValueRange(_ValueRange, RangeNumber);
_ColorMap = ColorMapFactory.GetColorMap(_ColorMapType);
_ValueColorRanges = ColorOperations.GetValueColorRanges(_ValueRange, _ValueRanges, _ColorMap);
if ((_PrimitiveSet is null) == false)
{
ProcessPrimitives();
LegendViewer.ValueColorRanges = _ValueColorRanges;
LegendViewer.Refresh();
}
}
private void ProcessPrimitives()
{
WorkPlaneCanvas.Children.Clear();
double sizeX = PrimitiveOperations.GetSizeX(_PrimitiveSet.ValuePrimitives);
double sizeY = PrimitiveOperations.GetSizeY(_PrimitiveSet.ValuePrimitives);
dX = PrimitiveOperations.GetMinMaxX(_PrimitiveSet.ValuePrimitives)[0];
dY = PrimitiveOperations.GetMinMaxY(_PrimitiveSet.ValuePrimitives)[0];
WorkPlaneCanvas.Width = Math.Abs(sizeX);
WorkPlaneCanvas.Height = Math.Abs(sizeY);
WorkPlaneBox.Width = WorkPlaneViewer.ActualWidth - 50;
WorkPlaneBox.Height = WorkPlaneViewer.ActualHeight - 50;
foreach (var primitive in _PrimitiveSet.ValuePrimitives)
{
if (primitive is IRectanglePrimitive)
{
IRectanglePrimitive rectanglePrimitive = primitive as IRectanglePrimitive;
Rectangle rectangle = ProcessRectanglePrimitive(rectanglePrimitive);
WorkPlaneCanvas.Children.Add(rectangle);
}
}
}
private void WorkPlaneBox_MouseWheel(object sender, MouseWheelEventArgs e)
{
WorkPlaneBox.Height *= WorkPlaneBox.ActualHeight * 0.5;
WorkPlaneBox.Width *= WorkPlaneBox.ActualWidth * 0.5;
}
private Rectangle ProcessRectanglePrimitive(IRectanglePrimitive rectanglePrimitive)
{
Rectangle rectangle = new Rectangle();
rectangle.Height = rectanglePrimitive.Height;
rectangle.Width = rectanglePrimitive.Width;
SolidColorBrush brush = new SolidColorBrush();
brush.Color = ColorOperations.GetColorByValue(_ValueRange, _ColorMap, rectanglePrimitive.Value);
foreach (var valueRange in _ValueColorRanges)
{
if (rectanglePrimitive.Value >= valueRange.BottomValue & rectanglePrimitive.Value <= valueRange.TopValue & (! valueRange.IsActive))
{
brush.Color = Colors.Gray;
}
}
rectangle.ToolTip = rectanglePrimitive.Value;
rectangle.Fill = brush;
Canvas.SetLeft(rectangle, rectanglePrimitive.CenterX - dX);
Canvas.SetTop(rectangle, rectanglePrimitive.CenterY - dY);
return rectangle;
}
private void RebuildButton_Click(object sender, RoutedEventArgs e)
{
ProcessPrimitives();
}
private void ZoomInButton_Click(object sender, RoutedEventArgs e)
{
WorkPlaneBox.Width *= 1.2;
WorkPlaneBox.Height *= 1.2;
}
private void ChangeColorMapButton_Click(object sender, RoutedEventArgs e)
{
if (_ColorMapType < ColorMapsTypes.BlueToWhite) { _ColorMapType++;}
else { _ColorMapType = 0;}
Refresh();
}
private void ZoomOutButton_Click(object sender, RoutedEventArgs e)
{
WorkPlaneBox.Width *= 0.8;
WorkPlaneBox.Height *= 0.8;
}
}
}

View File

@@ -0,0 +1,47 @@
<UserControl x:Class="FieldVisualizer.Windows.UserControls.VerticalLegend"
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:FieldVisualizer.Windows.UserControls"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<Grid x:Name="grid">
<StackPanel>
<ListBox Name="LegendBox" ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Height="30" Width="194" VerticalAlignment="Top" Background="{DynamicResource {x:Static SystemColors.MenuBarBrushKey}}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="10"/>
<ColumnDefinition/>
<ColumnDefinition Width="10"/>
</Grid.ColumnDefinitions>
<CheckBox Name="ActiveCheckBox" Grid.Column="0" IsChecked="{Binding Path=IsActive}" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<Rectangle Grid.Column="1" Margin="0,2,0,2" ToolTip="{Binding Path=BottomValue}">
<Rectangle.Fill>
<SolidColorBrush Color="{Binding Path=BottomColor}"/>
</Rectangle.Fill>
</Rectangle>
<Rectangle Grid.Column="2" Margin="0,2,0,2">
<Rectangle.Fill>
<LinearGradientBrush EndPoint="1,1" StartPoint="0,0">
<GradientStop Color="{Binding Path=BottomColor}"/>
<GradientStop Color="{Binding Path=TopColor}" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Rectangle Grid.Column="3" Margin="0,2,0,2" ToolTip="{Binding Path=TopValue}">
<Rectangle.Fill>
<SolidColorBrush Color="{Binding Path=TopColor}"/>
</Rectangle.Fill>
</Rectangle>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
</Grid>
</UserControl>

View File

@@ -0,0 +1,36 @@
using FieldVisualizer.Entities.ColorMaps;
using FieldVisualizer.Entities.Values;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace FieldVisualizer.Windows.UserControls
{
/// <summary>
/// Логика взаимодействия для VerticalLegend.xaml
/// </summary>
public partial class VerticalLegend : UserControl
{
public IEnumerable<IValueColorRange> ValueColorRanges;
public VerticalLegend()
{
InitializeComponent();
}
public void Refresh()
{
this.DataContext = ValueColorRanges;
}
}
}

View File

@@ -0,0 +1,4 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
</ResourceDictionary>

View File

@@ -0,0 +1,30 @@
<Window x:Class="FieldVisualizer.Windows.WndFieldViewer"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
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:FieldViewerControl="clr-namespace:FieldVisualizer.Windows.UserControls"
xmlns:local="clr-namespace:FieldVisualizer.Windows"
mc:Ignorable="d"
Title="FieldViewer" Height="700" Width="1200" WindowStartupLocation="CenterOwner">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="300"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ListBox Name="SetsList" ItemsSource="{Binding}" SelectionChanged="SetsList_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Height="20">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="1" Text="{Binding Path=Name}" Width="270"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<FieldViewerControl:FieldViewer x:Name="FieldViewerControl" Grid.Column="1"/>
</Grid>
</Window>

View File

@@ -0,0 +1,40 @@
using FieldVisualizer.Entities.Values.Primitives;
using FieldVisualizer.Windows.UserControls;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace FieldVisualizer.Windows
{
/// <summary>
/// Логика взаимодействия для WndFieldViewer.xaml
/// </summary>
public partial class WndFieldViewer : Window
{
public WndFieldViewer(IEnumerable<IPrimitiveSet> primitiveSets)
{
InitializeComponent();
this.DataContext = primitiveSets;
foreach (var primitiveSet in primitiveSets)
{
FieldViewerControl._PrimitiveSet = primitiveSet;
}
}
private void SetsList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
FieldViewerControl.Refresh();
}
}
}