Add series to graph
This commit is contained in:
@@ -86,7 +86,6 @@
|
||||
<Folder Include="Infrastructure\UI\DataContexts\Logics\" />
|
||||
<Folder Include="Resources\" />
|
||||
<Folder Include="Windows\UserControls\MultiplyTuples\" />
|
||||
<Folder Include="Windows\ViewModels\Graphs\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -73,7 +73,9 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews
|
||||
{
|
||||
SafetyProcessor.RunSafeProcess(() =>
|
||||
{
|
||||
var wnd = new GraphView(arrayParameter);
|
||||
var series = new Series(arrayParameter) { Name = "Forces and curvatures" };
|
||||
var vm = new GraphViewModel(new List<Series>() { series });
|
||||
var wnd = new GraphView(vm);
|
||||
wnd.ShowDialog();
|
||||
},
|
||||
"Errors appeared during showing a graph, see detailed information");
|
||||
|
||||
@@ -9,6 +9,7 @@ using StructureHelperCommon.Models.Parameters;
|
||||
using StructureHelperCommon.Models.Shapes;
|
||||
using StructureHelperCommon.Services.Units;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses.ByForces.LimitCurve;
|
||||
using StructureHelperLogics.NdmCalculations.Primitives;
|
||||
using StructureHelperLogics.Services.NdmPrimitives;
|
||||
using System;
|
||||
@@ -17,6 +18,9 @@ using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Windows;
|
||||
|
||||
//Copyright (c) 2023 Redikultsev Evgeny, Ekaterinburg, Russia
|
||||
//All rights reserved.
|
||||
|
||||
namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalculatorViews
|
||||
{
|
||||
internal class InteractionDiagramLogic : ILongProcessLogic
|
||||
@@ -24,46 +28,36 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
const string ForceUnitString = "kN";
|
||||
const string MomentUnitString = "kNm";
|
||||
|
||||
private ArrayParameter<double> arrayParameter;
|
||||
//private List<ArrayParameter<double>> arrayParameters;
|
||||
private IResult result;
|
||||
private IUnit unitForce = CommonOperation.GetUnit(UnitTypes.Force, ForceUnitString);
|
||||
private IUnit unitMoment = CommonOperation.GetUnit(UnitTypes.Moment, MomentUnitString);
|
||||
private int stepCount;
|
||||
|
||||
private static GeometryNames GeometryNames => ProgramSetting.GeometryNames;
|
||||
|
||||
public int StepCount => SurroundData.PointCount;
|
||||
public LimitCurveInputData InputData { get; set; }
|
||||
public int StepCount { get => stepCount; set => stepCount = value; }
|
||||
|
||||
public Action<int> SetProgress { get; set; }
|
||||
public bool Result { get; set; }
|
||||
public IEnumerable<INdmPrimitive> NdmPrimitives { get; set; }
|
||||
public LimitStates LimitState { get; set; }
|
||||
public CalcTerms CalcTerm { get; set; }
|
||||
//public ForceTuple ForceTuple { get; set; }
|
||||
|
||||
|
||||
public SurroundData SurroundData { get; set; }
|
||||
|
||||
public InteractionDiagramLogic(SurroundData surroundData)
|
||||
public InteractionDiagramLogic(LimitCurveInputData inputData)
|
||||
{
|
||||
SurroundData = surroundData;
|
||||
InputData = inputData;
|
||||
stepCount = InputData.PointCount;
|
||||
stepCount *= InputData.LimitStates.Count();
|
||||
stepCount *= InputData.CalcTerms.Count();
|
||||
stepCount *= InputData.PredicateEntries.Count();
|
||||
//arrayParameters = new();
|
||||
}
|
||||
|
||||
private void DoCalculations()
|
||||
{
|
||||
var ndmCollection = NdmPrimitivesService.GetNdms(NdmPrimitives, LimitState, CalcTerm);
|
||||
var convertLogic = SurroundData.ConvertLogicEntity;
|
||||
convertLogic.ConstDirectionValue = SurroundData.ConstZ;
|
||||
var predicateFactory = new PredicateFactory()
|
||||
var convertLogic = InputData.SurroundData.ConvertLogicEntity;
|
||||
var calculator = new LimitCurvesCalculator()
|
||||
{
|
||||
Ndms = ndmCollection,
|
||||
ConvertLogic = convertLogic.ConvertLogic,
|
||||
InputData = InputData
|
||||
};
|
||||
Predicate<IPoint2D> predicate = predicateFactory.IsSectionFailure;
|
||||
//Predicate<IPoint2D> predicate = predicateFactory.IsSectionCracked;
|
||||
//var logic = new StabLimitCurveLogic();
|
||||
var logic = new LimitCurveLogic(predicate);
|
||||
var calculator = new LimitCurveCalculator(logic);
|
||||
calculator.SurroundData = SurroundData;
|
||||
calculator.ActionToOutputResults = SetProgressByResult;
|
||||
SafetyProcessor.RunSafeProcess(() =>
|
||||
{
|
||||
@@ -71,15 +65,34 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
}, "Errors appeared during showing a graph, see detailed information");
|
||||
}
|
||||
|
||||
private void CalcResult(LimitCurveCalculator calculator)
|
||||
private void CalcResult(LimitCurvesCalculator calculator)
|
||||
{
|
||||
calculator.Run();
|
||||
result = calculator.Result;
|
||||
if (result.IsValid == false) { return; }
|
||||
var interactionResult = result as LimitCurveResult;
|
||||
var curvesResult = calculator.Result as LimitCurvesResult;
|
||||
if (curvesResult.IsValid == false) { return; }
|
||||
result = curvesResult;
|
||||
foreach (var curveResult in curvesResult.LimitCurveResults)
|
||||
{
|
||||
ProcessCurveResult(curveResult);
|
||||
}
|
||||
}
|
||||
|
||||
private void ProcessCurveResult(LimitCurveResult curveResult)
|
||||
{
|
||||
if (curveResult.IsValid == false)
|
||||
{
|
||||
SafetyProcessor.ShowMessage("Calculation error", curveResult.Description);
|
||||
return;
|
||||
}
|
||||
//var arrayParameter = GetParametersByCurveResult(curveResult);
|
||||
//arrayParameters.Add(arrayParameter);
|
||||
}
|
||||
|
||||
private ArrayParameter<double> GetParametersByCurveResult(LimitCurveResult curveResult)
|
||||
{
|
||||
string[] labels = GetLabels();
|
||||
var items = interactionResult.Points;
|
||||
arrayParameter = new ArrayParameter<double>(items.Count(), labels.Count(), labels);
|
||||
var items = curveResult.Points;
|
||||
var arrayParameter = new ArrayParameter<double>(items.Count(), labels.Count(), labels);
|
||||
var data = arrayParameter.Data;
|
||||
for (int i = 0; i < items.Count(); i++)
|
||||
{
|
||||
@@ -94,23 +107,25 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
data[i, j] = valueList[j];
|
||||
}
|
||||
}
|
||||
return arrayParameter;
|
||||
}
|
||||
|
||||
private void SetProgressByResult(IResult calcResult)
|
||||
{
|
||||
if (calcResult is not LimitCurveResult)
|
||||
if (calcResult is not LimitCurvesResult)
|
||||
{
|
||||
throw new StructureHelperException(ErrorStrings.ExpectedWas(typeof(LimitCurveResult), calcResult));
|
||||
throw new StructureHelperException(ErrorStrings.ExpectedWas(typeof(LimitCurvesResult), calcResult));
|
||||
}
|
||||
var parameterResult = calcResult as LimitCurveResult;
|
||||
var parameterResult = calcResult as LimitCurvesResult;
|
||||
StepCount = stepCount;// parameterResult.MaxIterationCount;
|
||||
SetProgress?.Invoke(parameterResult.IterationNumber);
|
||||
}
|
||||
|
||||
private string[] GetLabels()
|
||||
{
|
||||
string[] strings = new string[2];
|
||||
strings[0] = GetLabel(SurroundData.ConvertLogicEntity.XForceType);
|
||||
strings[1] = GetLabel(SurroundData.ConvertLogicEntity.YForceType);
|
||||
strings[0] = GetLabel(InputData.SurroundData.ConvertLogicEntity.XForceType);
|
||||
strings[1] = GetLabel(InputData.SurroundData.ConvertLogicEntity.YForceType);
|
||||
return strings;
|
||||
}
|
||||
|
||||
@@ -141,7 +156,15 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
{
|
||||
if (result.IsValid == true)
|
||||
{
|
||||
var wnd = new GraphView(arrayParameter);
|
||||
var curveResult = result as LimitCurvesResult;
|
||||
var seriesList = new List<Series>();
|
||||
foreach (var item in curveResult.LimitCurveResults)
|
||||
{
|
||||
var series = new Series(GetParametersByCurveResult(item)) { Name = item.Name };
|
||||
seriesList.Add(series);
|
||||
}
|
||||
var vm = new GraphViewModel(seriesList);
|
||||
var wnd = new GraphView(vm);
|
||||
wnd.ShowDialog();
|
||||
}
|
||||
else
|
||||
|
||||
@@ -13,9 +13,23 @@
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="35"/>
|
||||
<RowDefinition Height="35"/>
|
||||
</Grid.RowDefinitions>
|
||||
<fc:SurroundDataControl x:Name="SurData" SurroundData="{Binding SurroundData}"/>
|
||||
<Grid Grid.Row="1">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="25"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="150"/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition Width="120"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="Point count"/>
|
||||
<TextBox Grid.Column="1" Text="{Binding PointCount, ValidatesOnDataErrors=True}"/>
|
||||
<uc:MultiplyDouble Margin="2" Grid.Column="3" ValueChanged="PointCountChanged"/>
|
||||
</Grid>
|
||||
<!--<ContentControl ContentTemplate="{StaticResource SurroundData}" Content="{Binding SurroundDataViewModel}"/>-->
|
||||
<ContentControl Grid.Row="1" ContentTemplate="{StaticResource OkCancelButtons}" Content="{Binding}"/>
|
||||
<ContentControl Grid.Row="2" ContentTemplate="{StaticResource OkCancelButtons}" Content="{Binding}"/>
|
||||
</Grid>
|
||||
</Window>
|
||||
|
||||
@@ -31,5 +31,16 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
InitializeComponent();
|
||||
SurData.SurroundData = vm.SurroundData;
|
||||
}
|
||||
private void PointCountChanged(object sender, EventArgs e)
|
||||
{
|
||||
viewModel.PointCount = Convert.ToInt32(viewModel.PointCount * ChangeValue(sender));
|
||||
}
|
||||
|
||||
private double ChangeValue(object sender)
|
||||
{
|
||||
var obj = (MultiplyDouble)sender;
|
||||
var factor = obj.DoubleFactor;
|
||||
return factor;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ using StructureHelperCommon.Models.Shapes;
|
||||
using StructureHelperCommon.Services.Units;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses.ByForces.LimitCurve;
|
||||
using StructureHelperLogics.NdmCalculations.Primitives;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
@@ -17,16 +18,75 @@ using System.Windows.Data;
|
||||
|
||||
namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalculatorViews.ForceResultLogic
|
||||
{
|
||||
public class LimitCurveDataViewModel : OkCancelViewModelBase
|
||||
public class LimitCurveDataViewModel : OkCancelViewModelBase, IDataErrorInfo
|
||||
{
|
||||
private int pointCount;
|
||||
|
||||
//public SurroundDataViewModel SurroundDataViewModel { get; private set; }
|
||||
public SurroundData SurroundData { get; set; }
|
||||
public List<INdmPrimitive> Primitives { get; set; }
|
||||
public int PointCount
|
||||
{
|
||||
get => pointCount; set
|
||||
{
|
||||
try
|
||||
{
|
||||
pointCount = value;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
pointCount = 40;
|
||||
}
|
||||
OnPropertyChanged(nameof(PointCount));
|
||||
}
|
||||
}
|
||||
|
||||
public LimitCurveDataViewModel(SurroundData surroundData)
|
||||
{
|
||||
//SurroundDataViewModel = new(surroundData);
|
||||
SurroundData = surroundData;
|
||||
pointCount = 80;
|
||||
}
|
||||
|
||||
public LimitCurveDataViewModel() : this (new SurroundData())
|
||||
{
|
||||
}
|
||||
|
||||
public LimitCurveInputData GetLimitCurveInputData()
|
||||
{
|
||||
LimitCurveInputData inputData = new()
|
||||
{
|
||||
SurroundData = SurroundData,
|
||||
PointCount = pointCount
|
||||
};
|
||||
inputData.LimitStates.Add(LimitStates.ULS);
|
||||
inputData.LimitStates.Add(LimitStates.SLS);
|
||||
inputData.CalcTerms.Add(CalcTerms.ShortTerm);
|
||||
inputData.CalcTerms.Add(CalcTerms.LongTerm);
|
||||
inputData.PredicateEntries.Add(new PredicateEntry() { Name = "Strength", PredicateType = PredicateTypes.Strength });
|
||||
inputData.PredicateEntries.Add(new PredicateEntry() { Name = "Cracking", PredicateType = PredicateTypes.Cracking });
|
||||
inputData.Primitives = Primitives;
|
||||
return inputData;
|
||||
}
|
||||
|
||||
public string Error => throw new NotImplementedException();
|
||||
|
||||
public string this[string columnName]
|
||||
{
|
||||
get
|
||||
{
|
||||
string error = String.Empty;
|
||||
switch (columnName)
|
||||
{
|
||||
case nameof(PointCount):
|
||||
if (PointCount < 24)
|
||||
{
|
||||
error = "Point count must be greater than 24";
|
||||
}
|
||||
break;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,9 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
{
|
||||
SafetyProcessor.RunSafeProcess(() =>
|
||||
{
|
||||
var wnd = new GraphView(arrayParameter);
|
||||
var series = new Series(arrayParameter) { Name = "Forces and curvatures" };
|
||||
var vm = new GraphViewModel(new List<Series>() { series});
|
||||
var wnd = new GraphView(vm);
|
||||
wnd.ShowDialog();
|
||||
},
|
||||
"Errors appeared during showing a graph, see detailed information");
|
||||
|
||||
@@ -46,6 +46,7 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
|
||||
public void ShowProgressResult(int progressValue)
|
||||
{
|
||||
progressViewModel.MaxValue = processLogic.StepCount;
|
||||
progressViewModel.ProgressValue = progressValue;
|
||||
}
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@ using StructureHelperCommon.Models.Shapes;
|
||||
using StructureHelperCommon.Services.Forces;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses.ByForces;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses.ByForces.LimitCurve;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses.ByForces.Logics;
|
||||
using StructureHelperLogics.NdmCalculations.Analyses.Geometry;
|
||||
using StructureHelperLogics.NdmCalculations.Primitives;
|
||||
@@ -74,26 +75,21 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
return showInteractionDiagramCommand ??
|
||||
(showInteractionDiagramCommand = new RelayCommand(o =>
|
||||
{
|
||||
var tuple = SelectedResult.DesignForceTuple.ForceTuple.Clone() as ForceTuple;
|
||||
var data = new SurroundData();
|
||||
//data.ConstZ = tuple.My;
|
||||
var wnd = new LimitCurveDataView(data);
|
||||
var surroundDdata = new SurroundData();
|
||||
var vm = new LimitCurveDataViewModel(surroundDdata);
|
||||
vm.Primitives = ndmPrimitives.ToList();
|
||||
var wnd = new LimitCurveDataView(vm);
|
||||
wnd.ShowDialog();
|
||||
if (wnd.DialogResult != true) return;
|
||||
interactionDiagramLogic = new(data)
|
||||
{
|
||||
//ForceTuple = tuple,
|
||||
LimitState = SelectedResult.DesignForceTuple.LimitState,
|
||||
CalcTerm = SelectedResult.DesignForceTuple.CalcTerm,
|
||||
NdmPrimitives = ndmPrimitives
|
||||
};
|
||||
var inputData = vm.GetLimitCurveInputData();
|
||||
interactionDiagramLogic = new(inputData);
|
||||
showProgressLogic = new(interactionDiagramLogic)
|
||||
{
|
||||
WindowTitle = "Diagram creating...",
|
||||
ShowResult = interactionDiagramLogic.ShowWindow
|
||||
};
|
||||
showProgressLogic.Show();
|
||||
}, o => SelectedResult != null && SelectedResult.IsValid));
|
||||
}));
|
||||
}
|
||||
}
|
||||
public ICommand ShowIsoFieldCommand
|
||||
@@ -160,7 +156,7 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
};
|
||||
showProgressLogic.Show();
|
||||
}
|
||||
}
|
||||
}, o => SelectedResult != null && SelectedResult.IsValid
|
||||
);
|
||||
}
|
||||
public ICommand ShowCrackGraphsCommand
|
||||
@@ -191,7 +187,7 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
};
|
||||
showProgressLogic.Show();
|
||||
}
|
||||
}
|
||||
}, o => SelectedResult != null && SelectedResult.IsValid
|
||||
);
|
||||
}
|
||||
public ICommand ShowCrackResultCommand
|
||||
|
||||
@@ -87,17 +87,6 @@
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
<Grid Margin="35,0,0,0">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="25"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="150"/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition Width="120"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<TextBlock Text="Point count"/>
|
||||
<TextBox Grid.Column="1" Text="{Binding PointCount, ValidatesOnDataErrors=True}"/>
|
||||
<uc:MultiplyDouble Margin="2" Grid.Column="3" ValueChanged="PointCountChanged"/>
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
@@ -59,7 +59,7 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
{
|
||||
if (SurroundData is null)
|
||||
{
|
||||
ViewModel = new SurroundDataViewModel(new() { PointCount = 40 });
|
||||
ViewModel = new SurroundDataViewModel(new());
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -90,10 +90,7 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
{
|
||||
ViewModel.ConstZ *= ChangeValue(sender);
|
||||
}
|
||||
private void PointCountChanged(object sender, EventArgs e)
|
||||
{
|
||||
ViewModel.PointCount = Convert.ToInt32(ViewModel.PointCount * ChangeValue(sender));
|
||||
}
|
||||
|
||||
|
||||
private double ChangeValue(object sender)
|
||||
{
|
||||
|
||||
@@ -39,7 +39,6 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
OnPropertyChanged(nameof(YMax));
|
||||
OnPropertyChanged(nameof(YMin));
|
||||
OnPropertyChanged(nameof(ConstZ));
|
||||
OnPropertyChanged(nameof(PointCount));
|
||||
OnPropertyChanged(nameof(XLabel));
|
||||
OnPropertyChanged(nameof(YLabel));
|
||||
OnPropertyChanged(nameof(ZLabel));
|
||||
@@ -162,22 +161,6 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
}
|
||||
}
|
||||
|
||||
public int PointCount
|
||||
{
|
||||
get => SurroundData.PointCount; set
|
||||
{
|
||||
try
|
||||
{
|
||||
SurroundData.PointCount = value;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
SurroundData.PointCount = 40;
|
||||
}
|
||||
OnPropertyChanged(nameof(PointCount));
|
||||
}
|
||||
}
|
||||
|
||||
public string Error => throw new NotImplementedException();
|
||||
|
||||
public string this[string columnName]
|
||||
@@ -187,12 +170,12 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
|
||||
string error = String.Empty;
|
||||
switch (columnName)
|
||||
{
|
||||
case nameof(PointCount):
|
||||
if (PointCount < 24)
|
||||
{
|
||||
error = "Point count must be greater than 24";
|
||||
}
|
||||
break;
|
||||
//case nameof(PointCount):
|
||||
// if (PointCount < 24)
|
||||
// {
|
||||
// error = "Point count must be greater than 24";
|
||||
// }
|
||||
// break;
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
@@ -15,6 +15,10 @@ namespace StructureHelper.Windows.Graphs
|
||||
{
|
||||
lineSeries.Stroke = new SolidColorBrush(color);
|
||||
lineSeries.Fill = new SolidColorBrush(color) { Opacity = visualProps.Opacity };
|
||||
SetVisualProps(lineSeries, visualProps);
|
||||
}
|
||||
public static void SetVisualProps(LineSeries lineSeries, GraphVisualProps visualProps)
|
||||
{
|
||||
lineSeries.LineSmoothness = visualProps.LineSmoothness;
|
||||
lineSeries.PointGeometry = DefaultGeometries.Circle;
|
||||
lineSeries.PointGeometrySize = visualProps.StrokeSize;
|
||||
|
||||
@@ -24,51 +24,60 @@
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition/>
|
||||
<RowDefinition Height="170"/>
|
||||
<RowDefinition Height="40"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="70"/>
|
||||
<RowDefinition/>
|
||||
<RowDefinition Height="170"/>
|
||||
</Grid.RowDefinitions>
|
||||
<GroupBox Grid.Row="0" Header="X-axis values">
|
||||
<StackPanel>
|
||||
<ComboBox ItemsSource="{Binding XItems.Collection}" SelectedItem="{Binding XItems.SelectedItem}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="20"/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Rectangle Grid.Column="0" Margin="3">
|
||||
<Rectangle.Fill>
|
||||
<SolidColorBrush Color="{Binding Color}"/>
|
||||
</Rectangle.Fill>
|
||||
</Rectangle>
|
||||
<TextBlock Grid.Column="1" Text="{Binding Name}"/>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
<CheckBox Margin="5" Content="Invert Values" IsChecked="{Binding InvertXValues}"/>
|
||||
</StackPanel>
|
||||
<ListBox ItemsSource="{Binding Series}">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Expander Header="{Binding Name}" IsExpanded="True" Background="{Binding Color}">
|
||||
<Grid >
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="70"/>
|
||||
<RowDefinition/>
|
||||
</Grid.RowDefinitions>
|
||||
<GroupBox Grid.Row="0" Margin="10,0,10,0" Header="X-axis values">
|
||||
<StackPanel>
|
||||
<ComboBox ItemsSource="{Binding XItems.Collection}" SelectedItem="{Binding XItems.SelectedItem}">
|
||||
<ComboBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<Grid>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="20"/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Rectangle Grid.Column="0" Margin="3">
|
||||
<Rectangle.Fill>
|
||||
<SolidColorBrush Color="{Binding Color}"/>
|
||||
</Rectangle.Fill>
|
||||
</Rectangle>
|
||||
<TextBlock Grid.Column="1" Text="{Binding Name}"/>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</ComboBox.ItemTemplate>
|
||||
</ComboBox>
|
||||
<CheckBox Margin="5" Content="Invert Values" IsChecked="{Binding InvertXValues}"/>
|
||||
</StackPanel>
|
||||
|
||||
</GroupBox>
|
||||
<GroupBox Grid.Row="1" Header="Y-axis values">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition/>
|
||||
<RowDefinition Height="30"/>
|
||||
</Grid.RowDefinitions>
|
||||
<ContentControl ContentTemplate="{StaticResource ResourceKey=SelectItems}" Content="{Binding YItems}"/>
|
||||
<CheckBox Grid.Row="1" Margin="5" Content="Invert Values" IsChecked="{Binding InvertYValues}"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
<ContentControl Grid.Row="2" ContentTemplate="{StaticResource ResourceKey=LineVisualProperties}" Content="{Binding VisualProps}"/>
|
||||
</Grid>
|
||||
<StackPanel Grid.Row="1">
|
||||
</GroupBox>
|
||||
<GroupBox Grid.Row="1" Margin="10,0,10,0" Header="Y-axis values">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition/>
|
||||
<RowDefinition Height="30"/>
|
||||
</Grid.RowDefinitions>
|
||||
<ContentControl ContentTemplate="{StaticResource ResourceKey=SelectItems}" Content="{Binding YItems}"/>
|
||||
<CheckBox Grid.Row="1" Margin="5" Content="Invert Values" IsChecked="{Binding InvertYValues}"/>
|
||||
</Grid>
|
||||
</GroupBox>
|
||||
</Grid>
|
||||
</Expander>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
<ContentControl Grid.Row="1" ContentTemplate="{StaticResource ResourceKey=LineVisualProperties}" Content="{Binding VisualProps}"/>
|
||||
|
||||
<StackPanel Grid.Row="2">
|
||||
<Button Margin="3" Content="Draw Lines" ToolTip="Draw Lines" Command="{Binding RedrawLinesCommand}"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
@@ -35,5 +35,8 @@ namespace StructureHelper.Windows.Graphs
|
||||
public GraphView(ArrayParameter<double> arrayParameter) : this(new GraphViewModel(arrayParameter))
|
||||
{
|
||||
}
|
||||
public GraphView(IEnumerable<ArrayParameter<double>> arrayParameters) : this(new GraphViewModel(arrayParameters))
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,9 @@ using System.Windows.Input;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Imaging;
|
||||
|
||||
//Copyright (c) 2023 Redikultsev Evgeny, Ekaterinburg, Russia
|
||||
//All rights reserved.
|
||||
|
||||
namespace StructureHelper.Windows.Graphs
|
||||
{
|
||||
public class GraphViewModel : ViewModelBase
|
||||
@@ -28,9 +31,8 @@ namespace StructureHelper.Windows.Graphs
|
||||
}
|
||||
|
||||
|
||||
IArrayParameter<double> arrayParameter;
|
||||
List<IValueParameter<double>> valueParameters;
|
||||
Dictionary<IValueParameter<double>, double[]> valueList;
|
||||
List<IArrayParameter<double>> arrayParameters;
|
||||
|
||||
private RelayCommand redrawLinesCommand;
|
||||
private bool invertXValues;
|
||||
private bool invertYValues;
|
||||
@@ -39,6 +41,7 @@ namespace StructureHelper.Windows.Graphs
|
||||
public SelectedItemViewModel<IValueParameter<double>> XItems { get; private set; }
|
||||
public SelectItemsViewModel<IValueParameter<double>> YItems { get; set; }
|
||||
public ObservableCollection<ColumnInfo> Columns { get; } = new ObservableCollection<ColumnInfo>();
|
||||
public ObservableCollection<Series> Series { get;}
|
||||
|
||||
|
||||
public bool InvertXValues
|
||||
@@ -68,7 +71,7 @@ namespace StructureHelper.Windows.Graphs
|
||||
|
||||
public ICommand RedrawLinesCommand
|
||||
{
|
||||
get => redrawLinesCommand ??= new RelayCommand(o => DrawLines());
|
||||
get => redrawLinesCommand ??= new RelayCommand(o => DrawSeries());
|
||||
}
|
||||
|
||||
public ICommand SaveAsImage
|
||||
@@ -102,47 +105,36 @@ namespace StructureHelper.Windows.Graphs
|
||||
Clipboard.SetImage(bitmapImage);
|
||||
}
|
||||
|
||||
public GraphViewModel(IArrayParameter<double> arrayParameter)
|
||||
public GraphViewModel(IArrayParameter<double> arrayParameter) : this (new List<IArrayParameter<double>>() { arrayParameter})
|
||||
{
|
||||
this.arrayParameter = arrayParameter;
|
||||
valueParameters = GetParameters();
|
||||
XItems = new SelectedItemViewModel<IValueParameter<double>>(valueParameters);
|
||||
YItems = new SelectItemsViewModel<IValueParameter<double>>(valueParameters);
|
||||
YItems.ShowButtons = true;
|
||||
XItems.SelectedItem = XItems.Collection[0];
|
||||
YItems.UnSelectAllCommand.Execute(null);
|
||||
|
||||
}
|
||||
|
||||
public GraphViewModel(IEnumerable<IArrayParameter<double>> arrayParameters)
|
||||
{
|
||||
this.arrayParameters = arrayParameters.ToList();
|
||||
Series = new();
|
||||
foreach (var item in this.arrayParameters)
|
||||
{
|
||||
Series.Add(new Series(item));
|
||||
}
|
||||
VisualProps = new();
|
||||
}
|
||||
|
||||
private List<IValueParameter<double>> GetParameters()
|
||||
public GraphViewModel(IEnumerable<Series> series)
|
||||
{
|
||||
valueList = new Dictionary<IValueParameter<double>, double[]>();
|
||||
var items = new List<IValueParameter<double>>();
|
||||
var data = arrayParameter.Data;
|
||||
int columnCount = data.GetLength(1);
|
||||
for (int i = 0; i < columnCount; i++)
|
||||
Series = new();
|
||||
foreach (var item in series)
|
||||
{
|
||||
var item = new ValueParameter<double>()
|
||||
{
|
||||
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);
|
||||
Series.Add(item);
|
||||
}
|
||||
return items;
|
||||
VisualProps = new();
|
||||
}
|
||||
|
||||
private void DrawLines()
|
||||
|
||||
|
||||
private void DrawSeries()
|
||||
{
|
||||
if (XItems.SelectedItem is null || YItems.SelectedCount == 0) return;
|
||||
SetLines();
|
||||
OnPropertyChanged(nameof(SeriesCollection));
|
||||
OnPropertyChanged(nameof(Labels));
|
||||
@@ -150,47 +142,15 @@ namespace StructureHelper.Windows.Graphs
|
||||
|
||||
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<double>();
|
||||
SeriesCollection = new SeriesCollection();
|
||||
foreach (var yParameter in yParameters)
|
||||
Labels = new();
|
||||
foreach (var series in Series)
|
||||
{
|
||||
var localLabels = new List<double>();
|
||||
var lineSeries = new LineSeries()
|
||||
{
|
||||
Configuration = new CartesianMapper<IPoint2D>()
|
||||
.X(point => point.X)
|
||||
.Y(point => point.Y),
|
||||
Title = yParameter.Name,
|
||||
};
|
||||
GraphService.SetVisualProps(lineSeries, VisualProps, yParameter.Color);
|
||||
_ = valueList.TryGetValue(xParameter, out double[] xValues);
|
||||
_ = valueList.TryGetValue(yParameter, out double[] yValues);
|
||||
var chartValues = new ChartValues<Point2D>();
|
||||
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);
|
||||
series.VisualProps = VisualProps;
|
||||
series.RefreshSeries();
|
||||
SeriesCollection.AddRange(series.SeriesCollection);
|
||||
Labels.AddRange(series.Labels);
|
||||
}
|
||||
Labels = labels
|
||||
.OrderBy(x => x)
|
||||
.Distinct()
|
||||
.Select(x => x.ToString())
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -220,7 +220,7 @@ namespace StructureHelper.Windows.Graphs
|
||||
}
|
||||
else
|
||||
{
|
||||
GraphService.SetVisualProps(lineSeries, VisualProps, ColorProcessor.GetRandomColor());
|
||||
GraphService.SetVisualProps(lineSeries, VisualProps);
|
||||
}
|
||||
var chartValues = new ChartValues<double>();
|
||||
for (double s = minValue; s < maxValue; s += step)
|
||||
|
||||
148
StructureHelper/Windows/Graphs/Series.cs
Normal file
148
StructureHelper/Windows/Graphs/Series.cs
Normal file
@@ -0,0 +1,148 @@
|
||||
using LiveCharts;
|
||||
using LiveCharts.Configurations;
|
||||
using LiveCharts.Wpf;
|
||||
using StructureHelper.Infrastructure;
|
||||
using StructureHelper.Windows.ViewModels;
|
||||
using StructureHelperCommon.Models.Parameters;
|
||||
using StructureHelperCommon.Models.Shapes;
|
||||
using StructureHelperCommon.Services.ColorServices;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Media;
|
||||
|
||||
//Copyright (c) 2023 Redikultsev Evgeny, Ekaterinburg, Russia
|
||||
//All rights reserved.
|
||||
|
||||
namespace StructureHelper.Windows.Graphs
|
||||
{
|
||||
public class Series : ViewModelBase
|
||||
{
|
||||
private IArrayParameter<double> arrayParameter;
|
||||
private List<IValueParameter<double>> valueParameters;
|
||||
private Dictionary<IValueParameter<double>, double[]> valueList;
|
||||
private bool invertXValues;
|
||||
private bool invertYValues;
|
||||
|
||||
public SelectedItemViewModel<IValueParameter<double>> XItems { get; }
|
||||
public SelectItemsViewModel<IValueParameter<double>> YItems { get; }
|
||||
public bool InvertXValues
|
||||
{
|
||||
get { return invertXValues; }
|
||||
set
|
||||
{
|
||||
invertXValues = value;
|
||||
OnPropertyChanged(nameof(InvertXValues));
|
||||
}
|
||||
}
|
||||
public bool InvertYValues
|
||||
{
|
||||
get { return invertYValues; }
|
||||
set
|
||||
{
|
||||
invertYValues = value;
|
||||
OnPropertyChanged(nameof(InvertYValues));
|
||||
}
|
||||
}
|
||||
|
||||
public GraphVisualProps VisualProps { get; set; }
|
||||
public SeriesCollection SeriesCollection { get; private set; }
|
||||
public List<string> Labels { get; private set; }
|
||||
public Color Color { get; private set; }
|
||||
|
||||
public string Name { get; set; }
|
||||
public IArrayParameter<double> ArrayParameter { get; set; }
|
||||
public Series(IArrayParameter<double> arrayParameter)
|
||||
{
|
||||
this.arrayParameter = arrayParameter;
|
||||
valueParameters = GetParameters();
|
||||
XItems = new SelectedItemViewModel<IValueParameter<double>>(valueParameters);
|
||||
YItems = new SelectItemsViewModel<IValueParameter<double>>(valueParameters);
|
||||
YItems.ShowButtons = true;
|
||||
XItems.SelectedItem = XItems.Collection[0];
|
||||
YItems.UnSelectAllCommand.Execute(null);
|
||||
VisualProps = new();
|
||||
Color = ColorProcessor.GetRandomColor();
|
||||
}
|
||||
|
||||
private List<IValueParameter<double>> GetParameters()
|
||||
{
|
||||
valueList = new Dictionary<IValueParameter<double>, double[]>();
|
||||
var items = new List<IValueParameter<double>>();
|
||||
var data = arrayParameter.Data;
|
||||
int columnCount = data.GetLength(1);
|
||||
for (int i = 0; i < columnCount; i++)
|
||||
{
|
||||
var item = new ValueParameter<double>()
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
public void DrawLines()
|
||||
{
|
||||
if (XItems.SelectedItem is null || YItems.SelectedCount == 0) return;
|
||||
RefreshSeries();
|
||||
OnPropertyChanged(nameof(SeriesCollection));
|
||||
OnPropertyChanged(nameof(Labels));
|
||||
}
|
||||
|
||||
public void RefreshSeries()
|
||||
{
|
||||
var xParameter = XItems.SelectedItem;
|
||||
var yParameters = YItems.SelectedItems;
|
||||
var xFactor = invertXValues ? -1d : 1d;
|
||||
var yFactor = invertYValues ? -1d : 1d;
|
||||
var labels = new List<double>();
|
||||
SeriesCollection = new SeriesCollection();
|
||||
foreach (var yParameter in yParameters)
|
||||
{
|
||||
var localLabels = new List<double>();
|
||||
var lineSeries = new LineSeries()
|
||||
{
|
||||
Configuration = new CartesianMapper<IPoint2D>()
|
||||
.X(point => point.X)
|
||||
.Y(point => point.Y),
|
||||
Title = yParameter.Name,
|
||||
};
|
||||
GraphService.SetVisualProps(lineSeries, VisualProps, yParameter.Color);
|
||||
_ = valueList.TryGetValue(xParameter, out double[] xValues);
|
||||
_ = valueList.TryGetValue(yParameter, out double[] yValues);
|
||||
var chartValues = new ChartValues<Point2D>();
|
||||
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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,5 +26,14 @@ namespace StructureHelper.Windows.ViewModels.Errors
|
||||
new ErrorMessage(vm).ShowDialog();
|
||||
}
|
||||
}
|
||||
public static void ShowMessage(string shortText, string detailText)
|
||||
{
|
||||
var vm = new ErrorProcessor()
|
||||
{
|
||||
ShortText = shortText,
|
||||
DetailText = detailText
|
||||
};
|
||||
new ErrorMessage(vm).ShowDialog();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user