diff --git a/StructureHelper/StructureHelper.csproj.user b/StructureHelper/StructureHelper.csproj.user
index d1809bb..5b22347 100644
--- a/StructureHelper/StructureHelper.csproj.user
+++ b/StructureHelper/StructureHelper.csproj.user
@@ -18,6 +18,9 @@
Code
+
+ Code
+
Code
@@ -47,6 +50,9 @@
Designer
+
+ Designer
+
Designer
diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForcesResultsView.xaml b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForcesResultsView.xaml
index 48ab589..ef7698c 100644
--- a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForcesResultsView.xaml
+++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForcesResultsView.xaml
@@ -40,6 +40,7 @@
+
diff --git a/StructureHelper/Windows/Graphs/GraphView.xaml b/StructureHelper/Windows/Graphs/GraphView.xaml
new file mode 100644
index 0000000..f6955a7
--- /dev/null
+++ b/StructureHelper/Windows/Graphs/GraphView.xaml
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/StructureHelper/Windows/Graphs/GraphView.xaml.cs b/StructureHelper/Windows/Graphs/GraphView.xaml.cs
new file mode 100644
index 0000000..3d3cd34
--- /dev/null
+++ b/StructureHelper/Windows/Graphs/GraphView.xaml.cs
@@ -0,0 +1,31 @@
+using StructureHelper.Windows.ViewModels.Graphs;
+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 StructureHelper.Windows.Graphs
+{
+ ///
+ /// Логика взаимодействия для GraphView.xaml
+ ///
+ public partial class GraphView : Window
+ {
+ GraphViewModel vm;
+ public GraphView(GraphViewModel vm)
+ {
+ this.vm = vm;
+ InitializeComponent();
+ DataContext = vm;
+ }
+ }
+}
diff --git a/StructureHelper/Windows/MainWindow/MainViewModel.cs b/StructureHelper/Windows/MainWindow/MainViewModel.cs
index 405cb00..773727e 100644
--- a/StructureHelper/Windows/MainWindow/MainViewModel.cs
+++ b/StructureHelper/Windows/MainWindow/MainViewModel.cs
@@ -328,7 +328,7 @@ namespace StructureHelper.Windows.MainWindow
});
}
- private void afterMaterialEdit(CRUDViewModelBase sender, CRUDVMEventArgs e)
+ private void afterMaterialEdit(SelectedItemViewModel sender, CRUDVMEventArgs e)
{
foreach (var primitive in primitiveLogic.Items)
{
diff --git a/StructureHelper/Windows/MainWindow/Materials/MaterialDiagramView.xaml b/StructureHelper/Windows/MainWindow/Materials/MaterialDiagramView.xaml
index 121a847..082d589 100644
--- a/StructureHelper/Windows/MainWindow/Materials/MaterialDiagramView.xaml
+++ b/StructureHelper/Windows/MainWindow/Materials/MaterialDiagramView.xaml
@@ -17,7 +17,7 @@
-
+
@@ -52,9 +52,7 @@
-
-
-
+
diff --git a/StructureHelper/Windows/ViewModels/Calculations/Calculators/ForcesResultsViewModel.cs b/StructureHelper/Windows/ViewModels/Calculations/Calculators/ForcesResultsViewModel.cs
index ddfb562..ba15b37 100644
--- a/StructureHelper/Windows/ViewModels/Calculations/Calculators/ForcesResultsViewModel.cs
+++ b/StructureHelper/Windows/ViewModels/Calculations/Calculators/ForcesResultsViewModel.cs
@@ -10,14 +10,20 @@ using StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalculato
using StructureHelper.Windows.CalculationWindows.CalculatorsViews.GeometryCalculatorViews;
using StructureHelper.Windows.Errors;
using StructureHelper.Windows.Forces;
+using StructureHelper.Windows.Graphs;
using StructureHelper.Windows.PrimitivePropertiesWindow;
using StructureHelper.Windows.ViewModels.Errors;
using StructureHelper.Windows.ViewModels.Forces;
+using StructureHelper.Windows.ViewModels.Graphs;
using StructureHelper.Windows.ViewModels.PrimitiveProperties;
+using StructureHelperCommon.Infrastructures.Enums;
+using StructureHelperCommon.Infrastructures.Settings;
using StructureHelperCommon.Infrastructures.Strings;
using StructureHelperCommon.Models.Forces;
+using StructureHelperCommon.Models.Parameters;
using StructureHelperCommon.Models.Shapes;
using StructureHelperCommon.Services.Forces;
+using StructureHelperCommon.Services.Units;
using StructureHelperLogics.NdmCalculations.Analyses;
using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
using StructureHelperLogics.NdmCalculations.Analyses.Geometry;
@@ -43,6 +49,10 @@ namespace StructureHelper.Windows.ViewModels.Calculations.Calculators
private IEnumerable ndms;
private IReport isoFieldReport;
+ static string firstAxisName => ProgramSetting.CrossSectionAxisNames.FirstAxis;
+ static string secondAxisName => ProgramSetting.CrossSectionAxisNames.SecondAxis;
+ static string thirdAxisName => ProgramSetting.CrossSectionAxisNames.ThirdAxis;
+
public ForcesTupleResult SelectedResult { get; set; }
private RelayCommand showIsoFieldCommand;
private RelayCommand exportToCSVCommand;
@@ -94,6 +104,64 @@ namespace StructureHelper.Windows.ViewModels.Calculations.Calculators
exportService.Export();
}
+ private ICommand showGraphsCommand;
+
+ public ICommand ShowGraphsCommand
+ {
+ get => showGraphsCommand ??= new RelayCommand(o => showGraphs());
+ }
+
+ private void showGraphs()
+ {
+ var unitForce = CommonOperation.GetUnit(UnitTypes.Force, "kN");
+ var unitMoment = CommonOperation.GetUnit(UnitTypes.Moment, "kNm");
+ var unitCurvature = CommonOperation.GetUnit(UnitTypes.Curvature, "1/m");
+
+ var labels = new string[]
+ {
+ $"M{firstAxisName}, {unitMoment.Name}",
+ $"M{secondAxisName}, {unitMoment.Name}",
+ $"N{thirdAxisName}, {unitForce.Name}",
+ $"K{firstAxisName}, {unitCurvature.Name}",
+ $"K{secondAxisName}, {unitCurvature.Name}",
+ $"Eps_{thirdAxisName}"
+ };
+ var resultList = forcesResults.ForcesResultList.Where(x => x.IsValid == true).ToList();
+ var array = new ArrayParameter(resultList.Count(), labels.Count(), labels);
+ var data = array.Data;
+ for (int i = 0; i < resultList.Count(); i++)
+ {
+ var valueList = new List
+ {
+ resultList[i].DesignForceTuple.ForceTuple.Mx * unitMoment.Multiplyer,
+ resultList[i].DesignForceTuple.ForceTuple.My * unitMoment.Multiplyer,
+ resultList[i].DesignForceTuple.ForceTuple.Nz * unitForce.Multiplyer,
+ resultList[i].LoaderResults.ForceStrainPair.StrainMatrix.Kx * unitCurvature.Multiplyer,
+ resultList[i].LoaderResults.ForceStrainPair.StrainMatrix.Ky * unitCurvature.Multiplyer,
+ resultList[i].LoaderResults.ForceStrainPair.StrainMatrix.EpsZ
+ };
+ for (int j = 0; j < valueList.Count(); j++)
+ {
+ data[i, j] = valueList[j];
+ }
+ }
+ var graphViewModel = new GraphViewModel(array);
+ var wnd = new GraphView(graphViewModel);
+ try
+ {
+ wnd.ShowDialog();
+ }
+ catch(Exception ex)
+ {
+ var vm = new ErrorProcessor()
+ {
+ ShortText = "Errors apearred during showing isofield, see detailed information",
+ DetailText = $"{ex}"
+ };
+ new ErrorMessage(vm).ShowDialog();
+ }
+ }
+
public RelayCommand InterpolateCommand
{
get
diff --git a/StructureHelper/Windows/ViewModels/Calculations/Calculators/GeometryCalculatorVMs/GeometryCalculatorResultViewModel.cs b/StructureHelper/Windows/ViewModels/Calculations/Calculators/GeometryCalculatorVMs/GeometryCalculatorResultViewModel.cs
index 03024d2..9457891 100644
--- a/StructureHelper/Windows/ViewModels/Calculations/Calculators/GeometryCalculatorVMs/GeometryCalculatorResultViewModel.cs
+++ b/StructureHelper/Windows/ViewModels/Calculations/Calculators/GeometryCalculatorVMs/GeometryCalculatorResultViewModel.cs
@@ -18,7 +18,7 @@ namespace StructureHelper.Windows.ViewModels.Calculations.Calculators.GeometryCa
IGeometryResult result;
private ICommand exportToCSVCommand;
- public List TextParameters
+ public List> TextParameters
{
get => result.TextParameters;
}
diff --git a/StructureHelper/Windows/ViewModels/Forces/ActionsViewModel.cs b/StructureHelper/Windows/ViewModels/Forces/ActionsViewModel.cs
index a00a383..fcf6d21 100644
--- a/StructureHelper/Windows/ViewModels/Forces/ActionsViewModel.cs
+++ b/StructureHelper/Windows/ViewModels/Forces/ActionsViewModel.cs
@@ -14,7 +14,7 @@ using System.Windows.Forms;
namespace StructureHelper.Windows.ViewModels.Forces
{
- public class ActionsViewModel : CRUDViewModelBase
+ public class ActionsViewModel : SelectedItemViewModel
{
ICrossSectionRepository repository;
@@ -41,7 +41,7 @@ namespace StructureHelper.Windows.ViewModels.Forces
var dialogResult = MessageBox.Show("Delete action?", "Please, confirm deleting", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (dialogResult == DialogResult.Yes)
{
- DeleteAction();
+ if (DeleteAction() != true) return;
base.DeleteMethod(parameter);
}
}
@@ -71,8 +71,9 @@ namespace StructureHelper.Windows.ViewModels.Forces
this.repository = repository;
}
- private void DeleteAction()
+ private bool DeleteAction()
{
+ bool result = true;
var calcRepository = repository.CalculatorsList;
foreach (var item in calcRepository)
{
@@ -83,11 +84,15 @@ namespace StructureHelper.Windows.ViewModels.Forces
if (containSelected)
{
var dialogResultCalc = MessageBox.Show($"Action is contained in calculator {item.Name}", "Please, confirm deleting", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
- if (dialogResultCalc == DialogResult.OK) { forceCalculator.ForceActions.Remove(SelectedItem); }
- else return;
+ if (dialogResultCalc == DialogResult.Yes)
+ {
+ forceCalculator.ForceActions.Remove(SelectedItem);
+ }
+ else result = false;
}
}
}
+ return result;
}
}
}
diff --git a/StructureHelper/Windows/ViewModels/Forces/ForceTuplesViewModel.cs b/StructureHelper/Windows/ViewModels/Forces/ForceTuplesViewModel.cs
index b8e5130..b1195d9 100644
--- a/StructureHelper/Windows/ViewModels/Forces/ForceTuplesViewModel.cs
+++ b/StructureHelper/Windows/ViewModels/Forces/ForceTuplesViewModel.cs
@@ -9,7 +9,7 @@ using System.Threading.Tasks;
namespace StructureHelper.Windows.ViewModels.Forces
{
- public class ForceTuplesViewModel : CRUDViewModelBase
+ public class ForceTuplesViewModel : SelectedItemViewModel
{
public override void AddMethod(object parameter)
{
diff --git a/StructureHelper/Windows/ViewModels/Graphs/GraphViewModel.cs b/StructureHelper/Windows/ViewModels/Graphs/GraphViewModel.cs
new file mode 100644
index 0000000..6b69efb
--- /dev/null
+++ b/StructureHelper/Windows/ViewModels/Graphs/GraphViewModel.cs
@@ -0,0 +1,178 @@
+using LiveCharts;
+using LiveCharts.Configurations;
+using LiveCharts.Wpf;
+using StructureHelper.Infrastructure;
+using StructureHelper.Infrastructure.UI.Converters.Units;
+using StructureHelperCommon.Infrastructures.Enums;
+using StructureHelperCommon.Models.Parameters;
+using StructureHelperCommon.Models.Shapes;
+using StructureHelperCommon.Services.ColorServices;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Input;
+using System.Windows.Media;
+
+namespace StructureHelper.Windows.ViewModels.Graphs
+{
+ public class GraphViewModel : ViewModelBase
+ {
+ public class ColumnInfo
+ {
+ public string Header { get; set; }
+ public string BindingPath { get; set; }
+ }
+
+
+ IArrayParameter arrayParameter;
+ List> valueParameters;
+ Dictionary, double[]> valueList;
+ private RelayCommand redrawLinesCommand;
+ private bool invertXValues;
+ private bool invertYValues;
+
+ public SelectedItemViewModel> XItems { get; private set; }
+ public SelectItemsViewModel> YItems { get; set; }
+ public ObservableCollection Columns { get; } = new ObservableCollection();
+
+
+ public bool InvertXValues
+ {
+ get { return invertXValues; }
+ set
+ {
+ invertXValues = value;
+ OnPropertyChanged(nameof(InvertXValues));
+ }
+ }
+ public bool InvertYValues
+ {
+ get { return invertYValues; }
+ set
+ {
+ invertYValues = value;
+ OnPropertyChanged(nameof(InvertYValues));
+ }
+ }
+
+ private double lineSmoothness;
+
+ public double LineSmoothness
+ {
+ get { return lineSmoothness; }
+ set
+ {
+ value = Math.Max(value, 0d);
+ value = Math.Min(value, 1d);
+ value = Math.Round(value, 2);
+ lineSmoothness = value;
+ OnPropertyChanged(nameof(LineSmoothness));
+ }
+ }
+
+
+ public SeriesCollection SeriesCollection { get; set; }
+ public List Labels { get; set; }
+ public Func YFormatter { get; set; }
+
+ public ICommand RedrawLinesCommand
+ {
+ get => redrawLinesCommand ??= new RelayCommand(o => DrawLines());
+ }
+
+
+ public GraphViewModel(IArrayParameter arrayParameter)
+ {
+ this.arrayParameter = arrayParameter;
+ valueParameters = GetParameters();
+ XItems = new SelectedItemViewModel>(valueParameters);
+ YItems = new SelectItemsViewModel>(valueParameters);
+ YItems.ShowButtons = true;
+ XItems.SelectedItem = XItems.Collection[0];
+ YItems.UnSelectAllCommand.Execute(null);
+ lineSmoothness = 0.3d;
+ }
+
+ private List> GetParameters()
+ {
+ valueList = new Dictionary, double[]>();
+ var items = new List>();
+ var data = arrayParameter.Data;
+ int columnCount = data.GetLength(1);
+ for (int i = 0; i < columnCount; i++)
+ {
+ var item = new ValueParameter()
+ {
+ Name = arrayParameter.ColumnLabels[i],
+ Color = ColorProcessor.GetRandomColor(),
+ };
+ items.Add(item);
+ int rowCount = data.GetLength(0);
+ var values = new double[rowCount];
+ for (int j = 0; j < rowCount; j++)
+ {
+ values[j] = data[j, i];
+ }
+ valueList.Add(item, values);
+ }
+ return items;
+ }
+
+ private void DrawLines()
+ {
+ if (XItems.SelectedItem is null || YItems.SelectedCount == 0) return;
+ SetLines();
+ OnPropertyChanged(nameof(SeriesCollection));
+ OnPropertyChanged(nameof(Labels));
+ }
+
+ private void SetLines()
+ {
+ var xParameter = XItems.SelectedItem;
+ var yParameters = YItems.SelectedItems;
+ var xFactor = invertXValues ? -1d : 1d;
+ var yFactor = invertYValues ? -1d : 1d;
+ var labels = new List();
+ SeriesCollection = new SeriesCollection();
+ foreach (var yParameter in yParameters)
+ {
+ var localLabels = new List();
+ var lineSeries = new LineSeries()
+ {
+ Configuration = new CartesianMapper()
+ .X(point => point.X)
+ .Y(point => point.Y),
+ Title = yParameter.Name,
+ PointGeometry = null,
+ Stroke = new SolidColorBrush(yParameter.Color),
+ Fill = Brushes.Transparent,
+ LineSmoothness = lineSmoothness
+ };
+ _ = valueList.TryGetValue(xParameter, out double[] xValues);
+ _ = valueList.TryGetValue(yParameter, out double[] yValues);
+ var chartValues = new ChartValues();
+ for (int i = 0; i < yValues.Count(); i++)
+ {
+ double diagramValue = yValues[i] * yFactor;
+ var x = xValues[i] * xFactor;
+ var y = yValues[i] * yFactor;
+ var point = new Point2D() { X = x, Y = y};
+ chartValues.Add(point);
+ labels.Add(x);
+ localLabels.Add(x);
+ }
+ lineSeries.Values = chartValues;
+ //lineSeries.LabelPoint = point => localLabels[(int)point.X].ToString();
+ SeriesCollection.Add(lineSeries);
+ }
+ Labels = labels
+ .OrderBy(x => x)
+ .Distinct()
+ .Select(x => x.ToString())
+ .ToList();
+ }
+ }
+}
diff --git a/StructureHelper/Windows/ViewModels/Materials/MaterialDiagramViewModel.cs b/StructureHelper/Windows/ViewModels/Materials/MaterialDiagramViewModel.cs
index f58e2c8..b00dd75 100644
--- a/StructureHelper/Windows/ViewModels/Materials/MaterialDiagramViewModel.cs
+++ b/StructureHelper/Windows/ViewModels/Materials/MaterialDiagramViewModel.cs
@@ -105,9 +105,9 @@ namespace StructureHelper.Windows.ViewModels.Materials
private void SetLines()
{
- var materials = MaterialsModel.CollectionItems.Where(x => x.IsSelected == true).Select(x => x.Item);
- var limitStates = LimitStatesModel.CollectionItems.Where(x => x.IsSelected == true).Select(x => x.Item);
- var calcTerms = CalcTermsModel.CollectionItems.Where(x => x.IsSelected == true).Select(x => x.Item); ;
+ var materials = MaterialsModel.SelectedItems;
+ var limitStates = LimitStatesModel.SelectedItems;
+ var calcTerms = CalcTermsModel.SelectedItems; ;
var labels = new List();
var factor = positiveInTension ? 1d : -1d;
diff --git a/StructureHelper/Windows/ViewModels/Materials/MaterialsViewModel.cs b/StructureHelper/Windows/ViewModels/Materials/MaterialsViewModel.cs
index f4619eb..0833667 100644
--- a/StructureHelper/Windows/ViewModels/Materials/MaterialsViewModel.cs
+++ b/StructureHelper/Windows/ViewModels/Materials/MaterialsViewModel.cs
@@ -20,7 +20,7 @@ using System.Windows.Input;
namespace StructureHelper.Windows.ViewModels.Materials
{
- public class MaterialsViewModel : CRUDViewModelBase
+ public class MaterialsViewModel : SelectedItemViewModel
{
ICrossSectionRepository repository;
private ICommand editMaterialsCommand;
diff --git a/StructureHelper/Windows/ViewModels/Materials/PartialFactorsViewModel.cs b/StructureHelper/Windows/ViewModels/Materials/PartialFactorsViewModel.cs
index 439ff06..e0554cb 100644
--- a/StructureHelper/Windows/ViewModels/Materials/PartialFactorsViewModel.cs
+++ b/StructureHelper/Windows/ViewModels/Materials/PartialFactorsViewModel.cs
@@ -7,7 +7,7 @@ using System.Threading.Tasks;
namespace StructureHelper.Windows.ViewModels.Materials
{
- internal class PartialFactorsViewModel : CRUDViewModelBase
+ internal class PartialFactorsViewModel : SelectedItemViewModel
{
public override void AddMethod(object parameter)
{
diff --git a/StructureHelper/Windows/ViewModels/Materials/SafetyFactorsViewModel.cs b/StructureHelper/Windows/ViewModels/Materials/SafetyFactorsViewModel.cs
index fa6eabd..dd233f6 100644
--- a/StructureHelper/Windows/ViewModels/Materials/SafetyFactorsViewModel.cs
+++ b/StructureHelper/Windows/ViewModels/Materials/SafetyFactorsViewModel.cs
@@ -10,7 +10,7 @@ using System.Threading.Tasks;
namespace StructureHelper.Windows.ViewModels.Materials
{
- internal class SafetyFactorsViewModel : CRUDViewModelBase
+ internal class SafetyFactorsViewModel : SelectedItemViewModel
{
private RelayCommand showPartialCommand;
diff --git a/StructureHelper/Windows/ViewModels/NdmCrossSections/AnalysisVewModelLogic.cs b/StructureHelper/Windows/ViewModels/NdmCrossSections/AnalysisVewModelLogic.cs
index 24955fe..9f1650d 100644
--- a/StructureHelper/Windows/ViewModels/NdmCrossSections/AnalysisVewModelLogic.cs
+++ b/StructureHelper/Windows/ViewModels/NdmCrossSections/AnalysisVewModelLogic.cs
@@ -15,7 +15,7 @@ using System.Windows.Forms;
namespace StructureHelper.Windows.ViewModels.NdmCrossSections
{
- public class AnalysisVewModelLogic : CRUDViewModelBase
+ public class AnalysisVewModelLogic : SelectedItemViewModel
{
private ICrossSectionRepository repository;
private RelayCommand runCommand;
diff --git a/StructureHelper/Windows/ViewModels/SelectItemsViewModel.cs b/StructureHelper/Windows/ViewModels/SelectItemsViewModel.cs
index f043d3d..406ddc8 100644
--- a/StructureHelper/Windows/ViewModels/SelectItemsViewModel.cs
+++ b/StructureHelper/Windows/ViewModels/SelectItemsViewModel.cs
@@ -86,5 +86,11 @@ namespace StructureHelper.Windows.ViewModels
CollectionItems.Add(new CollectionItem() { IsSelected = true, Item = item });
}
}
+
+ public IEnumerable SelectedItems
+ {
+ get => CollectionItems.Where(x => x.IsSelected == true).Select(x => x.Item);
+ }
+ public int SelectedCount => SelectedItems.Count();
}
}
diff --git a/StructureHelper/Windows/ViewModels/CRUDViewModelBase.cs b/StructureHelper/Windows/ViewModels/SelectedItemViewModel.cs
similarity index 93%
rename from StructureHelper/Windows/ViewModels/CRUDViewModelBase.cs
rename to StructureHelper/Windows/ViewModels/SelectedItemViewModel.cs
index 3f42aeb..c541b1c 100644
--- a/StructureHelper/Windows/ViewModels/CRUDViewModelBase.cs
+++ b/StructureHelper/Windows/ViewModels/SelectedItemViewModel.cs
@@ -12,7 +12,7 @@ using System.Windows.Input;
namespace StructureHelper.Windows.ViewModels
{
- public abstract class CRUDViewModelBase : ViewModelBase, ICRUDViewModel where TItem : class
+ public class SelectedItemViewModel : ViewModelBase, ICRUDViewModel where TItem : class
{
private ICommand addCommand;
private ICommand deleteCommand;
@@ -115,7 +115,7 @@ namespace StructureHelper.Windows.ViewModels
}
}
- public CRUDViewModelBase(List collection)
+ public SelectedItemViewModel(List collection)
{
Collection = collection;
Refresh();
@@ -126,7 +126,7 @@ namespace StructureHelper.Windows.ViewModels
OnPropertyChanged(nameof(Items));
AfterItemsEdit?.Invoke(this, new CRUDVMEventArgs());
}
- public delegate void CRUDHandler(CRUDViewModelBase sender, CRUDVMEventArgs e);
+ public delegate void CRUDHandler(SelectedItemViewModel sender, CRUDVMEventArgs e);
public event CRUDHandler? AfterItemsEdit;
}
}
diff --git a/StructureHelperCommon/Models/Parameters/ArrayParameter.cs b/StructureHelperCommon/Models/Parameters/ArrayParameter.cs
new file mode 100644
index 0000000..d340774
--- /dev/null
+++ b/StructureHelperCommon/Models/Parameters/ArrayParameter.cs
@@ -0,0 +1,37 @@
+using StructureHelperCommon.Infrastructures.Exceptions;
+using StructureHelperCommon.Infrastructures.Strings;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace StructureHelperCommon.Models.Parameters
+{
+ public class ArrayParameter : IArrayParameter
+ {
+ private string[] columnLabels;
+ public string[] ColumnLabels
+ {
+ get { return columnLabels; }
+ set
+ {
+ var labelCount = value.Count();
+ var columnCount = Data.GetLength(1);
+ if (labelCount != columnCount)
+ {
+ throw new StructureHelperException(ErrorStrings.IncorrectValue + $" of label count: expected {columnCount}, but was {labelCount}");
+ }
+ columnLabels = value;
+ }
+ }
+
+ public T[,] Data { get; private set; }
+
+ public ArrayParameter(int rowCount, int columnCount, string[] columnLabels = null)
+ {
+ Data = new T[rowCount, columnCount];
+ if (columnLabels is not null) { ColumnLabels = columnLabels; }
+ }
+ }
+}
diff --git a/StructureHelperCommon/Models/Parameters/IArrayParameter.cs b/StructureHelperCommon/Models/Parameters/IArrayParameter.cs
new file mode 100644
index 0000000..e863c75
--- /dev/null
+++ b/StructureHelperCommon/Models/Parameters/IArrayParameter.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace StructureHelperCommon.Models.Parameters
+{
+ public interface IArrayParameter
+ {
+ T[,] Data { get; }
+ string[] ColumnLabels { get; set; }
+ }
+}
diff --git a/StructureHelperCommon/Models/Parameters/ITextParameter.cs b/StructureHelperCommon/Models/Parameters/IValueParameter.cs
similarity index 74%
rename from StructureHelperCommon/Models/Parameters/ITextParameter.cs
rename to StructureHelperCommon/Models/Parameters/IValueParameter.cs
index d315eb8..afdb75f 100644
--- a/StructureHelperCommon/Models/Parameters/ITextParameter.cs
+++ b/StructureHelperCommon/Models/Parameters/IValueParameter.cs
@@ -3,16 +3,18 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using System.Windows.Media;
namespace StructureHelperCommon.Models.Parameters
{
- public interface ITextParameter
+ public interface IValueParameter
{
bool IsValid { get; set; }
string Name { get; set; }
string ShortName { get; set; }
+ Color Color { get; set; }
string MeasurementUnit { get; set; }
- double Value { get; set; }
+ T Value { get; set; }
string Description { get; set; }
}
}
diff --git a/StructureHelperCommon/Models/Parameters/TextParameter.cs b/StructureHelperCommon/Models/Parameters/ValueParameter.cs
similarity index 71%
rename from StructureHelperCommon/Models/Parameters/TextParameter.cs
rename to StructureHelperCommon/Models/Parameters/ValueParameter.cs
index 10512fb..1e008ba 100644
--- a/StructureHelperCommon/Models/Parameters/TextParameter.cs
+++ b/StructureHelperCommon/Models/Parameters/ValueParameter.cs
@@ -3,16 +3,18 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using System.Windows.Media;
namespace StructureHelperCommon.Models.Parameters
{
- public class TextParameter : ITextParameter
+ public class ValueParameter : IValueParameter
{
public bool IsValid { get; set; }
public string Name { get; set; }
public string ShortName { get; set; }
+ public Color Color { get; set; }
public string MeasurementUnit { get; set; }
- public double Value { get; set; }
+ public T Value { get; set; }
public string Description { get; set; }
}
}
diff --git a/StructureHelperCommon/Services/ColorServices/ColorProcessor.cs b/StructureHelperCommon/Services/ColorServices/ColorProcessor.cs
index 56dbfec..8ffe64f 100644
--- a/StructureHelperCommon/Services/ColorServices/ColorProcessor.cs
+++ b/StructureHelperCommon/Services/ColorServices/ColorProcessor.cs
@@ -7,12 +7,22 @@ namespace StructureHelperCommon.Services.ColorServices
{
public static class ColorProcessor
{
+ private static readonly Random random = new Random();
public static Color GetRandomColor()
{
- var randomR = new Random(new Random((int)DateTime.Now.Ticks % 1000).Next(50)).Next(0, 255);
- var randomG = new Random(new Random((int)DateTime.Now.Ticks % 200).Next(100, 200)).Next(0, 255);
- var randomB = new Random(new Random((int)DateTime.Now.Ticks % 50).Next(500, 1000)).Next(0, 255);
- return Color.FromRgb((byte)randomR, (byte)randomG, (byte)randomB);
+ int r = random.Next(0, 255);
+ int g = random.Next(0, 255);
+ int b = random.Next(0, 255);
+
+ // check, that colors are different
+ while (Math.Abs(r - g) < 30 || Math.Abs(g - b) < 30 || Math.Abs(b - r) < 30)
+ {
+ r = random.Next(0, 255);
+ g = random.Next(0, 255);
+ b = random.Next(0, 255);
+ }
+
+ return Color.FromRgb((byte)r, (byte)g, (byte)b);
}
public static void EditColor(ref Color wpfColor)
{
diff --git a/StructureHelperLogics/Models/Templates/CrossSections/ForceLogic.cs b/StructureHelperLogics/Models/Templates/CrossSections/ForceLogic.cs
index 9d078da..df1b77f 100644
--- a/StructureHelperLogics/Models/Templates/CrossSections/ForceLogic.cs
+++ b/StructureHelperLogics/Models/Templates/CrossSections/ForceLogic.cs
@@ -9,13 +9,15 @@ namespace StructureHelperLogics.Models.Templates.CrossSections
{
internal class ForceLogic : IForceLogic
{
- public IEnumerable GetCombinationList()
+ public IEnumerable GetCombinationList()
{
- var combinations = new List();
+ var combinations = new List();
var combination = new ForceCombinationList() { Name = "New Force Action"};
combination.DesignForces.Clear();
combination.DesignForces.AddRange(ForceCombinationListFactory.GetDesignForces(DesignForceType.Suit_1));
combinations.Add(combination);
+ var factorCombination = new ForceCombinationByFactor();
+ combinations.Add(factorCombination);
return combinations;
}
}
diff --git a/StructureHelperLogics/Models/Templates/CrossSections/IForceLogic.cs b/StructureHelperLogics/Models/Templates/CrossSections/IForceLogic.cs
index 2375304..5ce10e1 100644
--- a/StructureHelperLogics/Models/Templates/CrossSections/IForceLogic.cs
+++ b/StructureHelperLogics/Models/Templates/CrossSections/IForceLogic.cs
@@ -9,6 +9,6 @@ namespace StructureHelperLogics.Models.Templates.CrossSections
{
internal interface IForceLogic
{
- IEnumerable GetCombinationList();
+ IEnumerable GetCombinationList();
}
}
diff --git a/StructureHelperLogics/Models/Templates/CrossSections/RCs/SectionTemplate.cs b/StructureHelperLogics/Models/Templates/CrossSections/RCs/SectionTemplate.cs
index 9050caa..51c67fd 100644
--- a/StructureHelperLogics/Models/Templates/CrossSections/RCs/SectionTemplate.cs
+++ b/StructureHelperLogics/Models/Templates/CrossSections/RCs/SectionTemplate.cs
@@ -19,7 +19,7 @@ namespace StructureHelperLogics.Models.Templates.CrossSections.RCs
IRCGeometryLogic geometryLogic;
ICalculatorLogic calculatorLogic;
IEnumerable primitives;
- IEnumerable combinations;
+ IEnumerable combinations;
IEnumerable calculators;
public SectionTemplate(IRCGeometryLogic geometryLogic)
diff --git a/StructureHelperLogics/NdmCalculations/Analyses/ByForces/ForceCalculator.cs b/StructureHelperLogics/NdmCalculations/Analyses/ByForces/ForceCalculator.cs
index be5f093..2a9541e 100644
--- a/StructureHelperLogics/NdmCalculations/Analyses/ByForces/ForceCalculator.cs
+++ b/StructureHelperLogics/NdmCalculations/Analyses/ByForces/ForceCalculator.cs
@@ -83,6 +83,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
{
bucklingCalculator.Run();
var bucklingResult = bucklingCalculator.Result as IConcreteBucklingResult;
+
if (bucklingResult.IsValid != true)
{
result.IsValid = false;
@@ -107,6 +108,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces
Result = ndmResult;
}
+
private void GetCombinations()
{
ForceCombinationLists = new List();
diff --git a/StructureHelperLogics/NdmCalculations/Analyses/Geometry/GeometryResult.cs b/StructureHelperLogics/NdmCalculations/Analyses/Geometry/GeometryResult.cs
index d347627..0c72c91 100644
--- a/StructureHelperLogics/NdmCalculations/Analyses/Geometry/GeometryResult.cs
+++ b/StructureHelperLogics/NdmCalculations/Analyses/Geometry/GeometryResult.cs
@@ -10,7 +10,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.Geometry
public class GeometryResult : IGeometryResult
{
public bool IsValid { get; set; }
- public List TextParameters { get; set; }
+ public List> TextParameters { get; set; }
public string Description { get; set; }
}
}
diff --git a/StructureHelperLogics/NdmCalculations/Analyses/Geometry/IGeometryResult.cs b/StructureHelperLogics/NdmCalculations/Analyses/Geometry/IGeometryResult.cs
index 61b6389..7af8250 100644
--- a/StructureHelperLogics/NdmCalculations/Analyses/Geometry/IGeometryResult.cs
+++ b/StructureHelperLogics/NdmCalculations/Analyses/Geometry/IGeometryResult.cs
@@ -9,6 +9,6 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.Geometry
{
public interface IGeometryResult : INdmResult
{
- List TextParameters { get; set; }
+ List> TextParameters { get; set; }
}
}
diff --git a/StructureHelperLogics/Services/NdmPrimitives/TextParametersLogic.cs b/StructureHelperLogics/Services/NdmPrimitives/TextParametersLogic.cs
index b6df4c9..0cbac64 100644
--- a/StructureHelperLogics/Services/NdmPrimitives/TextParametersLogic.cs
+++ b/StructureHelperLogics/Services/NdmPrimitives/TextParametersLogic.cs
@@ -23,9 +23,9 @@ namespace StructureHelperLogics.Services.NdmPrimitives
static IEnumerable units = UnitsFactory.GetUnitCollection();
private IEnumerable ndms;
private IStrainMatrix strainMatrix;
- public List GetTextParameters()
+ public List> GetTextParameters()
{
- var parameters = new List();
+ var parameters = new List>();
parameters.AddRange(GetGravityCenter(prefixInitial, ndms));
parameters.AddRange(GetSimpleArea(ndms));
parameters.AddRange(GetArea(prefixInitial, ndms));
@@ -38,15 +38,15 @@ namespace StructureHelperLogics.Services.NdmPrimitives
return parameters;
}
- private IEnumerable GetSimpleArea(IEnumerable ndms)
+ private IEnumerable> GetSimpleArea(IEnumerable ndms)
{
const string name = "Summary Area";
const string shortName = "A";
- var parameters = new List();
+ var parameters = new List>();
var unitArea = CommonOperation.GetUnit(UnitTypes.Area, "mm2");
var unitName = $"{unitArea.Name}";
var unitMultiPlayer = unitArea.Multiplyer;
- var firstParameter = new TextParameter()
+ var firstParameter = new ValueParameter()
{
IsValid = true,
Name = $"{name}",
@@ -56,28 +56,28 @@ namespace StructureHelperLogics.Services.NdmPrimitives
};
try
{
- firstParameter.Value = ndms.Sum(x => x.Area) * unitMultiPlayer;
+ firstParameter.Value = (ndms.Sum(x => x.Area) * unitMultiPlayer).ToString();
}
catch (Exception ex)
{
firstParameter.IsValid = false;
- firstParameter.Value = double.NaN;
+ firstParameter.Value = (double.NaN).ToString();
firstParameter.Description += $": {ex}";
}
parameters.Add(firstParameter);
return parameters;
}
- private IEnumerable GetMomentOfInertia(string prefix, IEnumerable locNdms, IStrainMatrix? locStrainMatrix = null)
+ private IEnumerable> GetMomentOfInertia(string prefix, IEnumerable locNdms, IStrainMatrix? locStrainMatrix = null)
{
const string name = "Bending stiffness";
const string shortName = "EI";
- var parameters = new List();
+ var parameters = new List>();
var unitArea = CommonOperation.GetUnit(UnitTypes.Area, "mm2");
var unitStress = CommonOperation.GetUnit(UnitTypes.Stress, "MPa");
var unitName = $"{unitStress.Name} * {unitArea.Name} * {unitArea.Name}";
var unitMultiPlayer = unitArea.Multiplyer * unitArea.Multiplyer * unitStress.Multiplyer;
- var firstParameter = new TextParameter()
+ var firstParameter = new ValueParameter()
{
IsValid = true,
Name = $"{prefix} {name} {firstAxisName.ToUpper()}",
@@ -85,7 +85,7 @@ namespace StructureHelperLogics.Services.NdmPrimitives
MeasurementUnit = unitName,
Description = $"{prefix} {name} of cross-section arbitrary {firstAxisName}-axis multiplied by {prefix} modulus"
};
- var secondParameter = new TextParameter()
+ var secondParameter = new ValueParameter()
{
IsValid = true,
Name = $"{prefix} {name} {secondAxisName}",
@@ -96,28 +96,28 @@ namespace StructureHelperLogics.Services.NdmPrimitives
try
{
var gravityCenter = GeometryOperations.GetReducedMomentsOfInertia(locNdms, locStrainMatrix);
- firstParameter.Value = gravityCenter.MomentX * unitMultiPlayer;
- secondParameter.Value = gravityCenter.MomentY * unitMultiPlayer;
+ firstParameter.Value = (gravityCenter.MomentX * unitMultiPlayer).ToString();
+ secondParameter.Value = (gravityCenter.MomentY * unitMultiPlayer).ToString();
}
catch (Exception ex)
{
firstParameter.IsValid = false;
- firstParameter.Value = double.NaN;
+ firstParameter.Value = (double.NaN).ToString();
firstParameter.Description += $": {ex}";
secondParameter.IsValid = false;
- secondParameter.Value = double.NaN;
+ secondParameter.Value = (double.NaN).ToString();
secondParameter.Description += $": {ex}";
}
parameters.Add(firstParameter);
parameters.Add(secondParameter);
return parameters;
}
- private IEnumerable GetMomentOfInertiaRatio(IEnumerable locNdms, IStrainMatrix? locStrainMatrix = null)
+ private IEnumerable> GetMomentOfInertiaRatio(IEnumerable locNdms, IStrainMatrix? locStrainMatrix = null)
{
const string name = "Bending stiffness";
const string shortName = "EI";
- var parameters = new List();
- var firstParameter = new TextParameter()
+ var parameters = new List>();
+ var firstParameter = new ValueParameter()
{
IsValid = true,
Name = $"{prefixActual}/{prefixInitial} {name} {firstAxisName.ToUpper()} ratio",
@@ -125,7 +125,7 @@ namespace StructureHelperLogics.Services.NdmPrimitives
MeasurementUnit = "-",
Description = $"{prefixActual}/{prefixInitial} {name} of cross-section arbitrary {firstAxisName}-axis ratio"
};
- var secondParameter = new TextParameter()
+ var secondParameter = new ValueParameter()
{
IsValid = true,
Name = $"{prefixActual}/{prefixInitial} {name} {secondAxisName} ratio",
@@ -137,32 +137,32 @@ namespace StructureHelperLogics.Services.NdmPrimitives
{
var initialMoments = GeometryOperations.GetReducedMomentsOfInertia(locNdms);
var actualMoments = GeometryOperations.GetReducedMomentsOfInertia(locNdms, locStrainMatrix);
- firstParameter.Value = actualMoments.MomentX / initialMoments.MomentX;
- secondParameter.Value = actualMoments.MomentY / initialMoments.MomentY;
+ firstParameter.Value = (actualMoments.MomentX / initialMoments.MomentX).ToString();
+ secondParameter.Value = (actualMoments.MomentY / initialMoments.MomentY).ToString();
}
catch (Exception ex)
{
firstParameter.IsValid = false;
- firstParameter.Value = double.NaN;
+ firstParameter.Value = (double.NaN).ToString();
firstParameter.Description += $": {ex}";
secondParameter.IsValid = false;
- secondParameter.Value = double.NaN;
+ secondParameter.Value = (double.NaN).ToString();
secondParameter.Description += $": {ex}";
}
parameters.Add(firstParameter);
parameters.Add(secondParameter);
return parameters;
}
- private IEnumerable GetArea(string prefix, IEnumerable locNdms, IStrainMatrix? locStrainMatrix = null)
+ private IEnumerable> GetArea(string prefix, IEnumerable locNdms, IStrainMatrix? locStrainMatrix = null)
{
const string name = "Longitudinal stiffness";
const string shortName = "EA";
- var parameters = new List();
+ var parameters = new List>();
var unitArea = CommonOperation.GetUnit(UnitTypes.Area, "mm2");
var unitStress = CommonOperation.GetUnit(UnitTypes.Stress, "MPa");
var unitName = $"{unitStress.Name} * {unitArea.Name}" ;
var unitMultiPlayer = unitArea.Multiplyer * unitStress.Multiplyer;
- var firstParameter = new TextParameter()
+ var firstParameter = new ValueParameter()
{
IsValid = true,
Name = $"{prefix} {name}",
@@ -172,23 +172,23 @@ namespace StructureHelperLogics.Services.NdmPrimitives
};
try
{
- firstParameter.Value = GeometryOperations.GetReducedArea(locNdms, locStrainMatrix) * unitMultiPlayer;
+ firstParameter.Value = (GeometryOperations.GetReducedArea(locNdms, locStrainMatrix) * unitMultiPlayer).ToString();
}
catch (Exception ex)
{
firstParameter.IsValid = false;
- firstParameter.Value = double.NaN;
+ firstParameter.Value = (double.NaN).ToString();
firstParameter.Description += $": {ex}";
}
parameters.Add(firstParameter);
return parameters;
}
- private IEnumerable GetAreaRatio(IEnumerable locNdms, IStrainMatrix locStrainMatrix)
+ private IEnumerable> GetAreaRatio(IEnumerable locNdms, IStrainMatrix locStrainMatrix)
{
const string name = "Longitudinal stiffness";
const string shortName = "EA";
- var parameters = new List();
- var firstParameter = new TextParameter()
+ var parameters = new List>();
+ var firstParameter = new ValueParameter()
{
IsValid = true,
Name = $"{prefixActual}/{prefixInitial} {name} ratio",
@@ -200,12 +200,12 @@ namespace StructureHelperLogics.Services.NdmPrimitives
{
var actual = GeometryOperations.GetReducedArea(locNdms, locStrainMatrix);
var initial = GeometryOperations.GetReducedArea(locNdms);
- firstParameter.Value = actual / initial;
+ firstParameter.Value = (actual / initial).ToString();
}
catch (Exception ex)
{
firstParameter.IsValid = false;
- firstParameter.Value = double.NaN;
+ firstParameter.Value = (double.NaN).ToString();
firstParameter.Description += $": {ex}";
}
parameters.Add(firstParameter);
@@ -216,14 +216,14 @@ namespace StructureHelperLogics.Services.NdmPrimitives
this.ndms = ndms;
this.strainMatrix = strainMatrix;
}
- private IEnumerable GetGravityCenter(string prefix, IEnumerable locNdms, IStrainMatrix? locStrainMatrix = null)
+ private IEnumerable> GetGravityCenter(string prefix, IEnumerable locNdms, IStrainMatrix? locStrainMatrix = null)
{
- var parameters = new List();
+ var parameters = new List>();
var unitType = UnitTypes.Length;
var unit = CommonOperation.GetUnit(unitType, "mm");
var unitName = unit.Name;
var unitMultiPlayer = unit.Multiplyer;
- var firstParameter = new TextParameter()
+ var firstParameter = new ValueParameter()
{
IsValid = true,
Name = $"{prefix} Center{firstAxisName.ToUpper()}",
@@ -231,7 +231,7 @@ namespace StructureHelperLogics.Services.NdmPrimitives
MeasurementUnit = unitName,
Description = $"{prefix} Displacement of center of gravity of cross-section along {firstAxisName}-axis"
};
- var secondParameter = new TextParameter()
+ var secondParameter = new ValueParameter()
{
IsValid = true,
Name = $"{prefix} Center{secondAxisName.ToUpper()}",
@@ -242,16 +242,16 @@ namespace StructureHelperLogics.Services.NdmPrimitives
try
{
var gravityCenter = GeometryOperations.GetGravityCenter(locNdms, locStrainMatrix);
- firstParameter.Value = gravityCenter.CenterX * unitMultiPlayer;
- secondParameter.Value = gravityCenter.CenterY * unitMultiPlayer;
+ firstParameter.Value = (gravityCenter.CenterX * unitMultiPlayer).ToString();
+ secondParameter.Value = (gravityCenter.CenterY * unitMultiPlayer).ToString();
}
catch (Exception ex)
{
firstParameter.IsValid = false;
- firstParameter.Value = double.NaN;
+ firstParameter.Value = (double.NaN).ToString();
firstParameter.Description += $": {ex}";
secondParameter.IsValid = false;
- secondParameter.Value = double.NaN;
+ secondParameter.Value = (double.NaN).ToString();
secondParameter.Description += $": {ex}";
}
parameters.Add(firstParameter);
diff --git a/StructureHelperTests/ViewModelTests/GraphViewModelTest.cs b/StructureHelperTests/ViewModelTests/GraphViewModelTest.cs
new file mode 100644
index 0000000..ac6b3c3
--- /dev/null
+++ b/StructureHelperTests/ViewModelTests/GraphViewModelTest.cs
@@ -0,0 +1,41 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using NUnit.Framework;
+using StructureHelper.Windows.ViewModels.Graphs;
+using StructureHelperCommon.Models.Parameters;
+
+namespace StructureHelperTests.ViewModelTests
+{
+ internal class GraphViewModelTest
+ {
+ [TestCase(2, 3)]
+ [TestCase(2, 4)]
+ [TestCase(3, 3)]
+ public void RunShouldPass(int rowCount, int columnCount)
+ {
+ //Arrange
+ string[] labels = new string[columnCount];
+ for (int i = 0; i < columnCount; i++)
+ {
+ labels[i] = $"Column{i}";
+ }
+ var array = new ArrayParameter(rowCount, columnCount, labels);
+ for (int i = 0; i < columnCount; i++)
+ {
+ for (int j = 0; j < rowCount; j++)
+ {
+ array.Data[j, i] = i + 2 * j;
+ }
+ }
+ //Act
+ var vm = new GraphViewModel(array);
+ //Assert
+ Assert.IsNotNull(vm);
+ Assert.AreEqual(columnCount, vm.XItems.Collection.Count());
+ Assert.AreEqual(columnCount, vm.YItems.CollectionItems.Count());
+ }
+ }
+}