Add series to graph

This commit is contained in:
Evgeny Redikultsev
2023-12-23 22:40:42 +05:00
parent a19333f7df
commit 0a6d29bcfc
38 changed files with 762 additions and 233 deletions

View File

@@ -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");

View File

@@ -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

View File

@@ -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>

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}
}
}

View File

@@ -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");

View File

@@ -46,6 +46,7 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu
public void ShowProgressResult(int progressValue)
{
progressViewModel.MaxValue = processLogic.StepCount;
progressViewModel.ProgressValue = progressValue;
}

View File

@@ -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

View File

@@ -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>

View File

@@ -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)
{

View File

@@ -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;
}