Init commit

This commit is contained in:
NickAppLab
2022-06-13 21:24:13 +05:00
commit 60eb406cbe
42 changed files with 3806 additions and 0 deletions

View File

@@ -0,0 +1,58 @@
using System.Collections.Generic;
using StructureHelper.Infrastructure;
namespace StructureHelper
{
public class MaterialCatalogModel
{
public NamedList<MaterialDefinitionBase> ConcreteDefinitions;
public NamedList<MaterialDefinitionBase> RebarDefinitions;
public List<NamedList<MaterialDefinitionBase>> Materials;
public MaterialCatalogModel()
{
InitializeMaterialCollections();
Materials = new List<NamedList<MaterialDefinitionBase>>();
Materials.Add(ConcreteDefinitions);
Materials.Add(RebarDefinitions);
}
public void InitializeMaterialCollections()
{
InitializeConcreteDefinitions();
InitializeRebarDefinitions();
}
private void InitializeRebarDefinitions()
{
RebarDefinitions = new NamedList<MaterialDefinitionBase>()
{
new RebarDefinition("S240", 2, 240, 240, 1.15, 1.15),
new RebarDefinition("S400", 2, 400, 400, 1.15, 1.15),
new RebarDefinition("S500", 2, 500, 500, 1.15, 1.15)
};
RebarDefinitions.Name = "Арматура";
}
private void InitializeConcreteDefinitions()
{
ConcreteDefinitions = new NamedList<MaterialDefinitionBase>()
{
new ConcreteDefinition("C10", 0, 10, 0, 1.3, 1.5),
new ConcreteDefinition("C15", 0, 15, 0, 1.3, 1.5),
new ConcreteDefinition("C20", 0, 20, 0, 1.3, 1.5),
new ConcreteDefinition("C25", 0, 25, 0, 1.3, 1.5),
new ConcreteDefinition("C30", 0, 30, 0, 1.3, 1.5),
new ConcreteDefinition("C35", 0, 35, 0, 1.3, 1.5),
new ConcreteDefinition("C40", 0, 40, 0, 1.3, 1.5),
new ConcreteDefinition("C45", 0, 45, 0, 1.3, 1.5),
new ConcreteDefinition("C50", 0, 50, 0, 1.3, 1.5),
new ConcreteDefinition("C60", 0, 60, 0, 1.3, 1.5),
new ConcreteDefinition("C70", 0, 70, 0, 1.3, 1.5),
new ConcreteDefinition("C80", 0, 80, 0, 1.3, 1.5)
};
ConcreteDefinitions.Name = "Бетон";
}
}
}

View File

@@ -0,0 +1,80 @@
<Window x:Class="StructureHelper.MaterialCatalogView"
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:local="clr-namespace:StructureHelper"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance local:MaterialCatalogViewModel}"
Title="Справочник материалов" Height="900" Width="1100">
<Window.Resources>
<DataTemplate x:Key="RebarYoungModulusTemplate">
<StackPanel Orientation="Horizontal">
<TextBox VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5,0" Text="{Binding YoungModulus}"/>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Text=" x 10^11"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="CompressiveStrengthTemplate">
<StackPanel Orientation="Horizontal">
<TextBox VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5,0" Text="{Binding CompressiveStrength}"/>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Text=" x 10^6"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="TensileStrengthTemplate">
<StackPanel Orientation="Horizontal">
<TextBox VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5,0" Text="{Binding TensileStrength}"/>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" Text=" x 10^6"/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="MaterialClassTemplate">
<TextBox VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5,0" Text="{Binding MaterialClass}"/>
</DataTemplate>
<DataTemplate x:Key="MaterialCoefInCompressTemplate">
<TextBox VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5,0" Text="{Binding MaterialCoefInCompress}"/>
</DataTemplate>
<DataTemplate x:Key="MaterialCoefInTensionTemplate">
<TextBox VerticalAlignment="Center" HorizontalAlignment="Left" Margin="5,0" Text="{Binding MaterialCoefInTension}"/>
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="40"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Margin="10">
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10,20,10,10" Text="Бетон" FontSize="16"/>
<DataGrid ItemsSource="{Binding ConcreteDefinitions}" AutoGenerateColumns="False" SelectedItem="{Binding SelectedMaterial}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Класс" CellTemplate="{StaticResource MaterialClassTemplate}"/>
<DataGridTextColumn Header="Модуль упругости" Binding="{Binding YoungModulus, StringFormat={}{0} x 10^6}" IsReadOnly="True"/>
<DataGridTemplateColumn Header="Нормативная прочность на сжатие" CellTemplate="{StaticResource CompressiveStrengthTemplate}"/>
<DataGridTextColumn Header="Нормативная прочность на растяжение" Binding="{Binding TensileStrength, StringFormat={}{0} x 10^3}" IsReadOnly="True"/>
<DataGridTemplateColumn Header="Коэффициент надежности при сжатии" CellTemplate="{StaticResource MaterialCoefInCompressTemplate}"/>
<DataGridTemplateColumn Header="Коэффициент надежности при растяжении" CellTemplate="{StaticResource MaterialCoefInTensionTemplate}"/>
</DataGrid.Columns>
</DataGrid>
<TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Margin="10,20,10,10" Text="Арматура" FontSize="16"/>
<DataGrid ItemsSource="{Binding RebarDefinitions}" AutoGenerateColumns="False" SelectedItem="{Binding SelectedMaterial}">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Класс" CellTemplate="{StaticResource MaterialClassTemplate}"/>
<DataGridTemplateColumn Header="Модуль упругости" CellTemplate="{StaticResource RebarYoungModulusTemplate}"/>
<DataGridTemplateColumn Header="Нормативная прочность на сжатие" CellTemplate="{StaticResource CompressiveStrengthTemplate}"/>
<DataGridTemplateColumn Header="Нормативная прочность на растяжение" CellTemplate="{StaticResource TensileStrengthTemplate}"/>
<DataGridTemplateColumn Header="Коэффициент надежности при сжатии" CellTemplate="{StaticResource MaterialCoefInCompressTemplate}"/>
<DataGridTemplateColumn Header="Коэффициент надежности при растяжении" CellTemplate="{StaticResource MaterialCoefInTensionTemplate}"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="300"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="300"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Left" Content="Добавить материал" Margin="10" Command="{Binding AddMaterial}"/>
<Button Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Right" Content="Выбрать материал" Margin="10" Command="{Binding SelectMaterial}" Visibility="{Binding SelectMaterialButtonVisibility}"/>
<Button Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Left" Content="Сохранить справочник" Margin="10" Command="{Binding SaveCatalog}"/>
<Button Grid.Column="2" VerticalAlignment="Center" HorizontalAlignment="Right" Content="Загрузить справочник" Margin="10" Command="{Binding LoadCatalog}"/>
</Grid>
</Grid>
</Window>

View File

@@ -0,0 +1,18 @@
using System.Windows;
namespace StructureHelper
{
/// <summary>
/// Логика взаимодействия для MaterialCatalogView.xaml
/// </summary>
public partial class MaterialCatalogView : Window
{
public MaterialCatalogView(bool isMaterialCanBeSelected = false, PrimitiveDefinition primitive = null)
{
var materialCatalogModel = new MaterialCatalogModel();
var materialCatalogViewModel = new MaterialCatalogViewModel(materialCatalogModel, this, isMaterialCanBeSelected, primitive);
DataContext = materialCatalogViewModel;
InitializeComponent();
}
}
}

View File

@@ -0,0 +1,117 @@
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Runtime.CompilerServices;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Input;
using Newtonsoft.Json;
using StructureHelper.Annotations;
using OpenFileDialog = System.Windows.Forms.OpenFileDialog;
using SaveFileDialog = System.Windows.Forms.SaveFileDialog;
namespace StructureHelper
{
[JsonObject(MemberSerialization.OptIn)]
public class MaterialCatalogViewModel : INotifyPropertyChanged
{
private MaterialCatalogModel materialCatalogModel;
private MaterialCatalogView materialCatalogView;
[JsonProperty]
public ObservableCollection<MaterialDefinitionBase> ConcreteDefinitions { get; set; }
[JsonProperty]
public ObservableCollection<MaterialDefinitionBase> RebarDefinitions { get; set; }
public ICommand AddMaterial { get; }
public ICommand SaveCatalog { get; }
public ICommand LoadCatalog { get; }
public ICommand SelectMaterial { get; }
private MaterialDefinitionBase selectedMaterial;
public MaterialDefinitionBase SelectedMaterial
{
get => selectedMaterial;
set
{
selectedMaterial = value;
OnPropertyChanged();
}
}
private bool isMaterialCanBeSelected;
public bool IsMaterialCanBeSelected
{
get => isMaterialCanBeSelected;
set
{
isMaterialCanBeSelected = value;
OnPropertyChanged();
OnPropertyChanged(nameof(SelectMaterialButtonVisibility));
}
}
public Visibility SelectMaterialButtonVisibility => IsMaterialCanBeSelected ? Visibility.Visible : Visibility.Hidden;
public MaterialCatalogViewModel() { }
public MaterialCatalogViewModel(MaterialCatalogModel materialCatalogModel, MaterialCatalogView materialCatalogView, bool isMaterialCanBeSelected, PrimitiveDefinition primitive = null)
{
this.materialCatalogModel = materialCatalogModel;
this.materialCatalogView = materialCatalogView;
IsMaterialCanBeSelected = isMaterialCanBeSelected;
ConcreteDefinitions = new ObservableCollection<MaterialDefinitionBase>(materialCatalogModel.ConcreteDefinitions);
RebarDefinitions = new ObservableCollection<MaterialDefinitionBase>(materialCatalogModel.RebarDefinitions);
AddMaterial = new RelayCommand(o =>
{
AddMaterialView addMaterialView = new AddMaterialView(this.materialCatalogModel, this);
addMaterialView.ShowDialog();
OnPropertyChanged(nameof(ConcreteDefinitions));
OnPropertyChanged(nameof(RebarDefinitions));
});
SaveCatalog = new RelayCommand(o =>
{
string json = JsonConvert.SerializeObject(this, Formatting.Indented);
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.InitialDirectory = @"C:\";
saveDialog.Filter = "json files (*.json)|*.json|All files(*.*)|*.*";
string path = null;
if (saveDialog.ShowDialog() == DialogResult.OK)
{
path = saveDialog.FileName;
File.WriteAllText(path, json);
}
});
LoadCatalog = new RelayCommand(o =>
{
OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.InitialDirectory = @"C:\";
openFileDialog.Filter = "json files (*.json)|*.json|All files(*.*)|*.*";
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
var path = openFileDialog.FileName;
var content = File.ReadAllText(path);
var vm = JsonConvert.DeserializeObject<MaterialCatalogViewModel>(content);
ConcreteDefinitions = vm.ConcreteDefinitions;
OnPropertyChanged(nameof(ConcreteDefinitions));
RebarDefinitions = vm.RebarDefinitions;
OnPropertyChanged(nameof(RebarDefinitions));
}
});
SelectMaterial = new RelayCommand(o =>
{
if (primitive != null)
primitive.Material = SelectedMaterial;
});
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}