From 43f46b83afd26f150117bb083bb681e932bdf0dd Mon Sep 17 00:00:00 2001 From: Evgeny Redikultsev Date: Sat, 15 Nov 2025 19:33:21 +0500 Subject: [PATCH] Change value diagram calculator --- DataAccess/DataAccess.csproj | 2 +- FieldVisualizer/FieldVisualizer.csproj | 2 +- FiledVisualzerDemo/FieldVisualzerDemo.csproj | 2 +- .../Libraries/LoaderCalculator.dll | Bin 100352 -> 100864 bytes .../ResultViewers/ForceResultFuncFactory.cs | 7 +- StructureHelper/StructureHelper.csproj | 2 +- .../ForceResultLogic/GetMoqNdmLogic.cs | 34 +++ .../ForceResultLogic/IGetMoqNdmLogic.cs | 15 ++ .../Windows/Graphs/GraphViewModel.cs | 10 - .../CrossSections/AnalysisViewModelLogic.cs | 7 + .../CrossSections/CrossSectionView.xaml | 42 +++- .../CrossSections/PrimitiveViewModelLogic.cs | 40 ++++ .../CrossSections/ValueDiagramLogic.cs | 224 ++++++++++++++++++ .../Windows/Shapes/PolygonShapeView.xaml | 13 +- .../Windows/UserControls/WorkPlane.xaml | 16 ++ .../StructureHelperCommon.csproj | 2 +- .../CrossSections/CalculatorLogic.cs | 2 +- .../IValueDiagramCalculatorResult.cs | 4 +- .../IValueDiagramEntityResult.cs | 14 ++ .../Logics/IValueDiagramEntityLogic.cs | 14 ++ .../Logics/ValueDiagramCalculatorLogic.cs | 75 ++++-- .../Logics/ValueDiagramEntityLogic.cs | 43 ++++ .../ValueDiagrams/ValueDiagramCalculator.cs | 14 +- .../ValueDiagramCalculatorResult.cs | 5 +- .../ValueDiagrams/ValueDiagramEntityResult.cs | 21 ++ .../Logics/CheckPrimitiveCollectionLogic.cs | 15 +- .../StructureHelperLogics.csproj | 2 +- .../StructureHelperTests.csproj | 2 +- 28 files changed, 563 insertions(+), 66 deletions(-) create mode 100644 StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/GetMoqNdmLogic.cs create mode 100644 StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/IGetMoqNdmLogic.cs create mode 100644 StructureHelper/Windows/MainWindow/CrossSections/ValueDiagramLogic.cs create mode 100644 StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/IValueDiagramEntityResult.cs create mode 100644 StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/Logics/IValueDiagramEntityLogic.cs create mode 100644 StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/Logics/ValueDiagramEntityLogic.cs create mode 100644 StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/ValueDiagramEntityResult.cs diff --git a/DataAccess/DataAccess.csproj b/DataAccess/DataAccess.csproj index 2dd161f..cfa93e9 100644 --- a/DataAccess/DataAccess.csproj +++ b/DataAccess/DataAccess.csproj @@ -1,7 +1,7 @@  - net9.0-windows7.0 + net10.0-windows7.0 enable enable diff --git a/FieldVisualizer/FieldVisualizer.csproj b/FieldVisualizer/FieldVisualizer.csproj index 4226f64..b5ba674 100644 --- a/FieldVisualizer/FieldVisualizer.csproj +++ b/FieldVisualizer/FieldVisualizer.csproj @@ -1,7 +1,7 @@ - net9.0-windows7.0 + net10.0-windows7.0 enable true disable diff --git a/FiledVisualzerDemo/FieldVisualzerDemo.csproj b/FiledVisualzerDemo/FieldVisualzerDemo.csproj index f6f93f2..a46f7c0 100644 --- a/FiledVisualzerDemo/FieldVisualzerDemo.csproj +++ b/FiledVisualzerDemo/FieldVisualzerDemo.csproj @@ -2,7 +2,7 @@ WinExe - net9.0-windows7.0 + net10.0-windows7.0 enable true disable diff --git a/StructureHelper/Libraries/LoaderCalculator.dll b/StructureHelper/Libraries/LoaderCalculator.dll index 1534490ffdae2341aae44cae9881263c4158ec5c..a701f0b4eebf91c3b2785fa5a9d6faf977dc5135 100644 GIT binary patch literal 100864 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 Uu$fRI*R21yiuK>6IXn&gFWWvra{vGU diff --git a/StructureHelper/Services/ResultViewers/ForceResultFuncFactory.cs b/StructureHelper/Services/ResultViewers/ForceResultFuncFactory.cs index 06d5350..4a6d08c 100644 --- a/StructureHelper/Services/ResultViewers/ForceResultFuncFactory.cs +++ b/StructureHelper/Services/ResultViewers/ForceResultFuncFactory.cs @@ -56,17 +56,18 @@ namespace StructureHelper.Services.ResultViewers } private static List GetStrainResultFuncs() { - List resultFuncs = new (); + List resultFuncs = []; resultFuncs.Add(new ForceResultFunc() { Name = "Section Strain", ResultFunction = stressLogic.GetSectionStrain }); resultFuncs.Add(new ForceResultFunc() { Name = "Total Strain", ResultFunction = stressLogic.GetTotalStrain }); resultFuncs.Add(new ForceResultFunc() { Name = "Prestrain", ResultFunction = stressLogic.GetPrestrain }); resultFuncs.Add(new ForceResultFunc() { Name = "Elastic Strain", ResultFunction = stressLogic.GetElasticStrain }); resultFuncs.Add(new ForceResultFunc() { Name = "Plastic Strain", ResultFunction = stressLogic.GetPlasticStrain }); + resultFuncs.Add(new ForceResultFunc() { Name = "Limit Strain Ratio", ResultFunction = stressLogic.GetLimitStrainRatio }); return resultFuncs; } private static List GetStressResultFuncs() { - List resultFuncs = new (); + List resultFuncs = []; resultFuncs.Add(new ForceResultFunc() { Name = "Stress", ResultFunction = stressLogic.GetStress, UnitFactor = unitStress.Multiplyer, UnitName = unitStress.Name }); resultFuncs.Add(new ForceResultFunc() { Name = "Secant modulus", ResultFunction = stressLogic.GetSecantModulus, UnitFactor = unitStress.Multiplyer, UnitName = unitStress.Name }); resultFuncs.Add(new ForceResultFunc() { Name = "Modulus degradation", ResultFunction = stressLogic.GetModulusDegradation }); @@ -74,7 +75,7 @@ namespace StructureHelper.Services.ResultViewers } private static List GetForcesResultFuncs() { - List resultFuncs = new (); + List resultFuncs = []; resultFuncs.Add(new ForceResultFunc() { Name = "Force", ResultFunction = stressLogic.GetForce, UnitFactor = unitForce.Multiplyer, UnitName = unitForce.Name }); resultFuncs.Add(new ForceResultFunc() { Name = "Moment X", ResultFunction = stressLogic.GetMomentX, UnitFactor = unitMoment.Multiplyer, UnitName = unitMoment.Name }); resultFuncs.Add(new ForceResultFunc() { Name = "Moment Y", ResultFunction = stressLogic.GetMomentY, UnitFactor = unitMoment.Multiplyer, UnitName = unitMoment.Name }); diff --git a/StructureHelper/StructureHelper.csproj b/StructureHelper/StructureHelper.csproj index 7d4251c..b8173b9 100644 --- a/StructureHelper/StructureHelper.csproj +++ b/StructureHelper/StructureHelper.csproj @@ -2,7 +2,7 @@ WinExe - net9.0-windows7.0 + net10.0-windows7.0 true enable true diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/GetMoqNdmLogic.cs b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/GetMoqNdmLogic.cs new file mode 100644 index 0000000..9f2bbfa --- /dev/null +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/GetMoqNdmLogic.cs @@ -0,0 +1,34 @@ +using LoaderCalculator.Data.Ndms; +using StructureHelperCommon.Models.Shapes; +using StructureHelperCommon.Models.States; +using StructureHelperLogics.NdmCalculations.Primitives; +using System; +using System.Collections.Generic; +using System.Text; + +namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalculatorViews +{ + public class GetMoqNdmLogic : IGetMoqNdmLogic + { + public INdm GetMockNdm(INdmPrimitive ndmPrimitive, IStateCalcTermPair stateCalcTermPair, IPoint2D point, double area = 0) + { + var limitState = stateCalcTermPair.LimitState; + var calcTerm = stateCalcTermPair.CalcTerm; + var material = ndmPrimitive.NdmElement.HeadMaterial.GetLoaderMaterial(limitState, calcTerm); + var userPrestrain = ndmPrimitive.NdmElement.UsersPrestrain; + var autoPrestrain = ndmPrimitive.NdmElement.AutoPrestrain; + var ndm = new Ndm() + { + Area = area, + CenterX = point.X, + CenterY = point.Y, + Material = material, + }; + var prestrain = (userPrestrain.Mx + autoPrestrain.Mx) * point.Y + + (userPrestrain.My + autoPrestrain.My) * point.X + + userPrestrain.Nz + autoPrestrain.Nz; + ndm.PrestrainLogic.Add(PrestrainTypes.Prestrain, prestrain); + return ndm; + } + } +} diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/IGetMoqNdmLogic.cs b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/IGetMoqNdmLogic.cs new file mode 100644 index 0000000..2071501 --- /dev/null +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/IGetMoqNdmLogic.cs @@ -0,0 +1,15 @@ +using LoaderCalculator.Data.Ndms; +using StructureHelperCommon.Models.Shapes; +using StructureHelperCommon.Models.States; +using StructureHelperLogics.NdmCalculations.Primitives; +using System; +using System.Collections.Generic; +using System.Text; + +namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalculatorViews +{ + public interface IGetMoqNdmLogic + { + INdm GetMockNdm(INdmPrimitive ndmPrimitive, IStateCalcTermPair stateCalcTermPair, IPoint2D point, double area = 0); + } +} diff --git a/StructureHelper/Windows/Graphs/GraphViewModel.cs b/StructureHelper/Windows/Graphs/GraphViewModel.cs index 7a7586a..1ebd0c1 100644 --- a/StructureHelper/Windows/Graphs/GraphViewModel.cs +++ b/StructureHelper/Windows/Graphs/GraphViewModel.cs @@ -4,22 +4,12 @@ using StructureHelper.Infrastructure; using StructureHelper.Services.Exports; using StructureHelper.Windows.ViewModels; using StructureHelperCommon.Models.Parameters; -using StructureHelperCommon.Services.Exports; using StructureHelperCommon.Services.Exports.Factories; -using StructureHelperLogics.NdmCalculations.Analyses; -using StructureHelperLogics.NdmCalculations.Analyses.ByForces; using System; using System.Collections.Generic; using System.Collections.ObjectModel; -using System.IO; using System.Linq; -using System.Windows; -using System.Windows.Controls; using System.Windows.Input; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Media.Media3D; -using System.Xml.Linq; //Copyright (c) 2023 Redikultsev Evgeny, Ekaterinburg, Russia diff --git a/StructureHelper/Windows/MainWindow/CrossSections/AnalysisViewModelLogic.cs b/StructureHelper/Windows/MainWindow/CrossSections/AnalysisViewModelLogic.cs index f03c72d..ee8ab45 100644 --- a/StructureHelper/Windows/MainWindow/CrossSections/AnalysisViewModelLogic.cs +++ b/StructureHelper/Windows/MainWindow/CrossSections/AnalysisViewModelLogic.cs @@ -6,6 +6,7 @@ using StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalculato using StructureHelper.Windows.CalculationWindows.CalculatorsViews.ValueDiagrams; using StructureHelper.Windows.CalculationWindows.ProgressViews; using StructureHelper.Windows.Errors; +using StructureHelper.Windows.MainWindow.CrossSections; using StructureHelper.Windows.ViewModels.Calculations.Calculators; using StructureHelper.Windows.ViewModels.Errors; using StructureHelperCommon.Infrastructures.Exceptions; @@ -269,6 +270,12 @@ namespace StructureHelper.Windows.ViewModels.NdmCrossSections var wnd = new CrackResultView(crackCalculator.Result as CrackResult); wnd.ShowDialog(); } + else if (SelectedItem is IValueDiagramCalculator valueDiagramCalculator) + { + IValueDiagramCalculatorResult? diagramCalcualtorResult = valueDiagramCalculator.Result as IValueDiagramCalculatorResult; + ValueDiagramLogic valueDiagramLogic = new(diagramCalcualtorResult); + valueDiagramLogic.Show(); + } else { throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(SelectedItem)); diff --git a/StructureHelper/Windows/MainWindow/CrossSections/CrossSectionView.xaml b/StructureHelper/Windows/MainWindow/CrossSections/CrossSectionView.xaml index 1ef32dd..5269f7f 100644 --- a/StructureHelper/Windows/MainWindow/CrossSections/CrossSectionView.xaml +++ b/StructureHelper/Windows/MainWindow/CrossSections/CrossSectionView.xaml @@ -156,7 +156,7 @@ + DescriptionText="Exports primitives to new *.dxf file"/> @@ -166,7 +166,7 @@ + DescriptionText="Imports primitives from *.dxf file"/> @@ -307,6 +307,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + deletAllCommand ??= new RelayCommand(DeleteAll, o => Items.Count > 0); + + private void DeleteAll(object obj) + { + var dialogResult = MessageBox.Show("Delete all primitives?", "Please, confirm deleting", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + if (dialogResult == DialogResult.Yes) + { + repository.Primitives.Clear(); + Items.Clear(); + Refresh(); + OnPropertyChanged(nameof(Items)); + OnPropertyChanged(nameof(PrimitivesCount)); + } + } + public ICommand DeleteSelectedCommand => deleteSelectedCommand ??= new RelayCommand(DeleteSelected, o => Items.Count > 0); + + private void DeleteSelected(object commandParameter) + { + var vm = new SelectPrimitivesViewModel(repository.Primitives); + var wnd = new SelectPrimitivesView(vm); + wnd.ShowDialog(); + if (wnd.DialogResult == true) + { + var selectedNdmPrimitives = vm.Items.CollectionItems.Where(x => x.IsSelected == true).Select(x => x.Item.GetNdmPrimitive()); + var deletePrimitivesList = Items + .Where(x => selectedNdmPrimitives.Contains(x.NdmPrimitive)) + .ToList(); + foreach (var item in deletePrimitivesList) + { + repository.Primitives.Remove(item.NdmPrimitive); + Items.Remove(item); + } + Refresh(); + OnPropertyChanged(nameof(Items)); + OnPropertyChanged(nameof(PrimitivesCount)); + } + } + private void SetMaterialToPrimitives(object obj) { if (SelectedItem is null) { return; } @@ -478,5 +517,6 @@ namespace StructureHelper.Windows.ViewModels.NdmCrossSections AddItems(PrimitiveOperations.ConvertNdmPrimitivesToPrimitiveBase(this.repository.Primitives)); } + private RelayCommand deleteSelectedCommand; } } diff --git a/StructureHelper/Windows/MainWindow/CrossSections/ValueDiagramLogic.cs b/StructureHelper/Windows/MainWindow/CrossSections/ValueDiagramLogic.cs new file mode 100644 index 0000000..560c492 --- /dev/null +++ b/StructureHelper/Windows/MainWindow/CrossSections/ValueDiagramLogic.cs @@ -0,0 +1,224 @@ +using LoaderCalculator.Data.Matrix; +using LoaderCalculator.Data.Ndms; +using LoaderCalculator.Logics; +using StructureHelper.Services.ResultViewers; +using StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalculatorViews; +using StructureHelper.Windows.Graphs; +using StructureHelperCommon.Infrastructures.Exceptions; +using StructureHelperCommon.Models.Parameters; +using StructureHelperCommon.Models.Shapes; +using StructureHelperLogics.NdmCalculations.Analyses.ByForces; +using StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams; +using StructureHelperLogics.NdmCalculations.Primitives; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace StructureHelper.Windows.MainWindow.CrossSections +{ + internal class ValueDiagramLogic + { + private IStressLogic stressLogic = new StressLogic(); + private IValueDiagramCalculatorResult valueDiagramResult; + private List resultFuncs = []; + private List labels; + + public ValueDiagramLogic(IValueDiagramCalculatorResult valueDiagramResult) + { + this.valueDiagramResult = valueDiagramResult; + } + + internal void Show() + { + resultFuncs.AddRange(ForceResultFuncFactory.GetResultFuncs(FuncsTypes.Strain)); + resultFuncs.AddRange(ForceResultFuncFactory.GetResultFuncs(FuncsTypes.Stress)); + GetLabels(); + if (valueDiagramResult.IsValid == false || + valueDiagramResult.ForceTupleResults + .Where(x => x.IsValid) + .Count() == 0) + { + // + } + List seriesList = []; + foreach (var forceTupleResult in valueDiagramResult.ForceTupleResults) + { + if (forceTupleResult.IsValid == false) { continue; } + foreach (var entityResult in valueDiagramResult.EntityResults) + { + var primitives = valueDiagramResult.InputData.Primitives + .Where(x => x is IHasDivisionSize); + Series series = GetSeries(forceTupleResult, valueDiagramResult.InputData.Primitives, entityResult.PointList); + seriesList.Add(series); + } + } + var vm = new GraphViewModel(seriesList); + var wnd = new GraphView(vm); + wnd.ShowDialog(); + } + + private Series GetSeries(IForceTupleCalculatorResult tupleResult, List ndmPrimitives, List points) + { + List<(INdmPrimitive ndmPrimitive, IPoint2D point)> pointPrimitives = GetPrimitivePoints(ndmPrimitives, points); + ArrayParameter arrayParameter = new(pointPrimitives.Count + 3, labels); + var data = arrayParameter.Data; + IPoint2D startPoint = pointPrimitives[0].point; + IPoint2D endPoint = pointPrimitives[^1].point; + for (int i = 0; i < pointPrimitives.Count; i++) + { + IPoint2D currentPoint = pointPrimitives[i].point; + double distance = GetDistance(startPoint, currentPoint); + data[i, 0] = distance; + data[i, 1] = currentPoint.X; + data[i, 2] = currentPoint.Y; + for (int j = 0; j < resultFuncs.Count; j++) + { + data[i, j + 3] = GetValueByPoint(tupleResult.LoaderResults.StrainMatrix, pointPrimitives[i].ndmPrimitive, pointPrimitives[i].point, resultFuncs[j]); + } + + } + data[pointPrimitives.Count, 0] = GetDistance(startPoint, endPoint); + data[pointPrimitives.Count, 1] = endPoint.X; + data[pointPrimitives.Count, 2] = endPoint.Y; + + data[pointPrimitives.Count + 1, 0] = 0.0; + data[pointPrimitives.Count + 1, 1] = startPoint.X; + data[pointPrimitives.Count + 1, 2] = startPoint.Y; + + data[pointPrimitives.Count, 0] = 0.0; + data[pointPrimitives.Count + 2, 1] = startPoint.X; + data[pointPrimitives.Count + 2, 2] = startPoint.Y; + for (int j = 0; j < resultFuncs.Count; j++) + { + data[pointPrimitives.Count, j+3] = 0.0; + data[pointPrimitives.Count + 1, j+3] = 0.0; + data[pointPrimitives.Count + 2, j + 3] = GetValueByPoint(tupleResult.LoaderResults.StrainMatrix, pointPrimitives[0].ndmPrimitive, pointPrimitives[0].point, resultFuncs[j]); + } + + StructureHelperCommon.Models.Forces.IForceTuple inputForceTuple = tupleResult.InputData.ForceTuple; + Series series = new Series(arrayParameter) + { + Name = $"Mx = {inputForceTuple.Mx}, My = {inputForceTuple.My}, Nz = {inputForceTuple.Nz}", + }; + return series; + } + + private static double GetDistance(IPoint2D startPoint, IPoint2D currentPoint) + { + double dx = currentPoint.X - startPoint.X; + double dy = currentPoint.Y - startPoint.Y; + double distance = Math.Sqrt(dx * dx + dy * dy); + return distance; + } + + private List<(INdmPrimitive ndmPrimitive, IPoint2D point)> GetPrimitivePoints(List primitives, List points) + { + List<(INdmPrimitive ndmPrimitive, IPoint2D point)> values = []; + for (int i = 0; i < points.Count; i++) + { + var currentPoint = points[i]; + + var areaPrimitives = GetPrimitivesInPoint(primitives, currentPoint); + + if (areaPrimitives.Count() == 1) + { + (INdmPrimitive ndmPrimitive, IPoint2D point) newValue = (areaPrimitives[0], points[i]); + values.Add(newValue); + } + else if (areaPrimitives.Count() > 1) + { + values.AddRange(GetPrimitiveByFewPoints(areaPrimitives, points, i)); + } + } + return values; + } + + private static List GetPrimitivesInPoint(List primitives, IPoint2D point) + { + return primitives + .Where(x => x is IHasDivisionSize) + .Where(x => (x as IHasDivisionSize).IsPointInside(point) == true) + .ToList(); + } + + private List<(INdmPrimitive ndmPrimitive, IPoint2D point)> GetPrimitiveByFewPoints(List areaPrimitives, List points, int i) + { + List<(INdmPrimitive ndmPrimitive, IPoint2D point)> values = []; + var primitives = areaPrimitives + .OrderBy(x=> x.VisualProperty.ZIndex) + .ToList(); + if (primitives[0] is IHasDivisionSize firstPrimitiveHasSize) + { + if (firstPrimitiveHasSize.DivisionSize.ClearUnderlying == true) + { + if (primitives[0].NdmElement.Triangulate == true) + { + (INdmPrimitive ndmPrimitive, IPoint2D point) newValue = (primitives[0], points[i]); + values.Add(newValue); + } + } + else + { + if (primitives.Count > 2) + { + throw new StructureHelperException($"Too many primitives in point X = {points[i].X}, Y = {points[i].Y}"); + } + if (i == 0) + { + var primitive = GetPrimitiveInAjacentPoint(primitives, points, i, 1); + (INdmPrimitive ndmPrimitive, IPoint2D point) newValue = (primitive, points[i]); + values.Add(newValue); + } + else if (i == points.Count - 1) + { + var primitive = GetPrimitiveInAjacentPoint(primitives, points, i, -1); + (INdmPrimitive ndmPrimitive, IPoint2D point) newValue = (primitive, points[i]); + values.Add(newValue); + } + else + { + foreach (var primitive in primitives) + { + (INdmPrimitive ndmPrimitive, IPoint2D point) newValue = (primitive, points[i]); + values.Add(newValue); + } + } + } + } + return values; + } + + private INdmPrimitive GetPrimitiveInAjacentPoint(List primitives, List points, int i, int sign) + { + var nextPointPrimitives = GetPrimitivesInPoint(primitives, points[i + 1 * sign]); + try + { + var primitive = nextPointPrimitives.Single(); + return primitive; + } + catch (Exception ex) + { + throw new StructureHelperException($"Error of obtaining of primitive X = {points[i].X}, Y = {points[i].Y}"); + } + } + + private double GetValueByPoint(IStrainMatrix strainMatrix, INdmPrimitive primitive, IPoint2D point, ForceResultFunc resultFunc) + { + var logic = new GetMoqNdmLogic(); + var moqNdm = logic.GetMockNdm(primitive, valueDiagramResult.InputData.StateTermPair, point); + return resultFunc.ResultFunction(strainMatrix, moqNdm) * resultFunc.UnitFactor; + } + + private void GetLabels() + { + labels = []; + labels.Add("Distance"); + labels.Add("Global X"); + labels.Add("Global Y"); + foreach (var resultFunc in resultFuncs) + { + labels.Add($"{resultFunc.Name}, {resultFunc.UnitName}"); + } + } + } +} diff --git a/StructureHelper/Windows/Shapes/PolygonShapeView.xaml b/StructureHelper/Windows/Shapes/PolygonShapeView.xaml index c99a955..b6842e0 100644 --- a/StructureHelper/Windows/Shapes/PolygonShapeView.xaml +++ b/StructureHelper/Windows/Shapes/PolygonShapeView.xaml @@ -123,9 +123,14 @@ - + + + + + + - + @@ -139,7 +144,7 @@ - @@ -147,7 +152,7 @@ - + diff --git a/StructureHelper/Windows/UserControls/WorkPlane.xaml b/StructureHelper/Windows/UserControls/WorkPlane.xaml index 19aa224..97a4008 100644 --- a/StructureHelper/Windows/UserControls/WorkPlane.xaml +++ b/StructureHelper/Windows/UserControls/WorkPlane.xaml @@ -103,6 +103,22 @@ + + + + + + + + + + + + + + + + diff --git a/StructureHelperCommon/StructureHelperCommon.csproj b/StructureHelperCommon/StructureHelperCommon.csproj index 819d17b..1460606 100644 --- a/StructureHelperCommon/StructureHelperCommon.csproj +++ b/StructureHelperCommon/StructureHelperCommon.csproj @@ -1,7 +1,7 @@  - net9.0-windows7.0 + net10.0-windows7.0 disable enable true diff --git a/StructureHelperLogics/Models/Templates/CrossSections/CalculatorLogic.cs b/StructureHelperLogics/Models/Templates/CrossSections/CalculatorLogic.cs index 752eb61..69c9191 100644 --- a/StructureHelperLogics/Models/Templates/CrossSections/CalculatorLogic.cs +++ b/StructureHelperLogics/Models/Templates/CrossSections/CalculatorLogic.cs @@ -20,7 +20,7 @@ namespace StructureHelperLogics.Models.Templates.CrossSections return calculators; } - private ValueDiagramCalculator GetDiagramCalculator() + private static ValueDiagramCalculator GetDiagramCalculator() { ValueDiagramCalculator diagramCalculator = new(Guid.NewGuid()) { Name = "New value diagram calcualtor"}; ValueDiagramEntity diagramEntity = new(Guid.NewGuid()) { Name = "New diagram" }; diff --git a/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/IValueDiagramCalculatorResult.cs b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/IValueDiagramCalculatorResult.cs index 819f370..77dc90d 100644 --- a/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/IValueDiagramCalculatorResult.cs +++ b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/IValueDiagramCalculatorResult.cs @@ -7,7 +7,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams public interface IValueDiagramCalculatorResult : IResult { IValueDiagramCalculatorInputData? InputData { get; set; } - List Points { get; set; } - List ForceTupleResults { get; set; } + List EntityResults { get; set; } + List ForceTupleResults { get; set; } } } diff --git a/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/IValueDiagramEntityResult.cs b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/IValueDiagramEntityResult.cs new file mode 100644 index 0000000..7be7c11 --- /dev/null +++ b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/IValueDiagramEntityResult.cs @@ -0,0 +1,14 @@ +using StructureHelperCommon.Models.Calculators; +using StructureHelperCommon.Models.Shapes; +using System; +using System.Collections.Generic; +using System.Text; + +namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams +{ + public interface IValueDiagramEntityResult : IResult + { + IValueDiagramEntity ValueDiagramEntity { get; } + List PointList { get; set;} + } +} diff --git a/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/Logics/IValueDiagramEntityLogic.cs b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/Logics/IValueDiagramEntityLogic.cs new file mode 100644 index 0000000..4ceac9b --- /dev/null +++ b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/Logics/IValueDiagramEntityLogic.cs @@ -0,0 +1,14 @@ +using StructureHelperCommon.Infrastructures.Interfaces; +using System; +using System.Collections.Generic; +using System.Text; + +namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams +{ + public interface IValueDiagramEntityLogic : ILogic + { + IValueDiagramEntity ValueDiagramEntity { get; set; } + IValueDiagramEntityResult Result { get; } + void Run(); + } +} diff --git a/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/Logics/ValueDiagramCalculatorLogic.cs b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/Logics/ValueDiagramCalculatorLogic.cs index 3113b0c..1362ee4 100644 --- a/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/Logics/ValueDiagramCalculatorLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/Logics/ValueDiagramCalculatorLogic.cs @@ -1,21 +1,21 @@ -using StructureHelperCommon.Infrastructures.Enums; +using LoaderCalculator.Data.Ndms; using StructureHelperCommon.Models; using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Forces; +using StructureHelperCommon.Models.Sections; +using StructureHelperCommon.Models.Sections.Logics; +using StructureHelperCommon.Models.Shapes; using StructureHelperLogics.NdmCalculations.Analyses.ByForces; using StructureHelperLogics.Services.NdmPrimitives; using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams { public class ValueDiagramCalculatorLogic : IValueDiagramCalculatorLogic { + private readonly IValueDiagramEntityLogic entityLogic = new ValueDiagramEntityLogic(); private ITriangulatePrimitiveLogic triangulateLogic; - + private List ndms; private IValueDiagramCalculatorResult result; public IValueDiagramCalculatorInputData InputData { get; set; } public IShiftTraceLogger? TraceLogger { get; set; } @@ -23,7 +23,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams public IValueDiagramCalculatorResult GetResult() { PrepareResult(); - GetPoints(); + GetEntitiesResults(); CalculateTupleResults(); return result; } @@ -37,30 +37,67 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams CalcTerm = InputData.StateTermPair.CalcTerm, TraceLogger = TraceLogger }; - var ndms = triangulateLogic.GetNdms(); + ndms = triangulateLogic.GetNdms(); foreach (var forceAction in InputData.ForceActions) { var combination = forceAction.GetCombinations(); List forceTuples = []; foreach (var action in combination) { - var actionCombination = action + var forceTuple = action .DesignForces - .Where(x => x.LimitState == InputData.StateTermPair.LimitState && x.CalcTerm == InputData.StateTermPair.CalcTerm); - } - ForceTupleInputData forceTupleInputData = new() - { - NdmCollection = ndms, - Accuracy = new Accuracy(), - CheckStrainLimit = true, + .Single(x => x.LimitState == InputData.StateTermPair.LimitState && x.CalcTerm == InputData.StateTermPair.CalcTerm) + .ForceTuple; + + + IPoint2D point2D; + IProcessorLogic forcelogic = new ForceTupleCopier(forceTuple); + if (action.SetInGravityCenter == true) + { + var (Cx, Cy) = LoaderCalculator.Logics.Geometry.GeometryOperations.GetGravityCenter(ndms); + point2D = new Point2D() { X = Cx, Y = Cy }; + forcelogic = new ForceTupleMoveToPointDecorator(forcelogic) { Point2D = point2D }; + } + var newTuple = forcelogic.GetValue(); + GetForceTupleResult(forceAction, newTuple); + } - }; } } - private void GetPoints() + private void GetForceTupleResult(IForceAction forceAction, IForceTuple forceTuple) { - throw new NotImplementedException(); + ForceTupleInputData forceTupleInputData = new() + { + ForceTuple = forceTuple, + NdmCollection = ndms, + Accuracy = new Accuracy() { IterationAccuracy = 0.001, MaxIterationCount = 1000}, + CheckStrainLimit = InputData.CheckStrainLimit, + }; + ForceTupleCalculator calculator = new ForceTupleCalculator() + { + InputData = forceTupleInputData, + TraceLogger = TraceLogger?.GetSimilarTraceLogger(100) + }; + calculator.Run(); + var tupleResult = calculator.Result as IForceTupleCalculatorResult; + if (tupleResult.IsValid == false) + { + TraceLogger?.AddMessage($"Result is not valid for action {forceAction.Name}: {tupleResult.Description}", TraceLogStatuses.Error); + } + result.ForceTupleResults.Add(tupleResult); + } + + private void GetEntitiesResults() + { + var entities = InputData.Digrams + .Where(x => x.IsTaken == true); + foreach (var entity in entities) + { + entityLogic.ValueDiagramEntity = entity; + entityLogic.Run(); + result.EntityResults.Add(entityLogic.Result); + } } private void PrepareResult() diff --git a/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/Logics/ValueDiagramEntityLogic.cs b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/Logics/ValueDiagramEntityLogic.cs new file mode 100644 index 0000000..4780ab6 --- /dev/null +++ b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/Logics/ValueDiagramEntityLogic.cs @@ -0,0 +1,43 @@ +using StructureHelperCommon.Models; +using StructureHelperCommon.Models.Shapes; +using System; +using System.Collections.Generic; +using System.Text; + +namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams +{ + public class ValueDiagramEntityLogic : IValueDiagramEntityLogic + { + public IValueDiagramEntity ValueDiagramEntity { get; set; } + + private IValueDiagramEntityResult result; + + public IShiftTraceLogger? TraceLogger { get; set; } + + public IValueDiagramEntityResult Result => result; + + public void Run() + { + result = new ValueDiagramEntityResult(ValueDiagramEntity); + result.PointList = GetPoints(); + } + + private List GetPoints() + { + TraceLogger?.AddMessage($"Getting point for diagram {ValueDiagramEntity.Name} has been started"); + var startPoint = ValueDiagramEntity.ValueDigram.Point2DRange.StartPoint; + var endPoint = ValueDiagramEntity.ValueDigram.Point2DRange.EndPoint; + double dx = (endPoint.X - startPoint.X) / ValueDiagramEntity.ValueDigram.StepNumber; + double dy = (endPoint.Y - startPoint.Y) / ValueDiagramEntity.ValueDigram.StepNumber; + List point2Ds = []; + for (int i = 0; i < ValueDiagramEntity.ValueDigram.StepNumber + 1; i++) + { + double x = startPoint.X + dx * i; + double y = startPoint.Y + dy * i; + point2Ds.Add(new Point2D(x, y)); + } + TraceLogger?.AddMessage($"Getting point for diagram {ValueDiagramEntity.Name} has been finished, total {point2Ds.Count} points obtained"); + return point2Ds; + } + } +} diff --git a/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/ValueDiagramCalculator.cs b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/ValueDiagramCalculator.cs index 45a9d77..4421ba4 100644 --- a/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/ValueDiagramCalculator.cs +++ b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/ValueDiagramCalculator.cs @@ -1,16 +1,13 @@ -using StructureHelperCommon.Models; +using StructureHelperCommon.Infrastructures.Interfaces; +using StructureHelperCommon.Models; using StructureHelperCommon.Models.Calculators; -using StructureHelperLogics.NdmCalculations.Analyses.ByForces; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams { public class ValueDiagramCalculator : IValueDiagramCalculator { + private readonly IValueDiagramCalculatorLogic valueDiagramCalculatorLogic = new ValueDiagramCalculatorLogic(); + private readonly ICheckInputDataLogic checkInputDataLogic; private IValueDiagramCalculatorResult result; public Guid Id { get; } @@ -38,7 +35,8 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams public void Run() { - throw new NotImplementedException(); + valueDiagramCalculatorLogic.InputData = InputData; + result = valueDiagramCalculatorLogic.GetResult(); } } } diff --git a/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/ValueDiagramCalculatorResult.cs b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/ValueDiagramCalculatorResult.cs index 2b2b433..4311527 100644 --- a/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/ValueDiagramCalculatorResult.cs +++ b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/ValueDiagramCalculatorResult.cs @@ -7,11 +7,10 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams { public IValueDiagramCalculatorInputData? InputData { get; set; } - public List Points { get; set; } = []; - - public List ForceTupleResults { get; set; } = []; + public List ForceTupleResults { get; set; } = []; public bool IsValid { get; set; } = true; public string? Description { get; set; } = string.Empty; + public List EntityResults { get; set; } = []; } } diff --git a/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/ValueDiagramEntityResult.cs b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/ValueDiagramEntityResult.cs new file mode 100644 index 0000000..e9b27df --- /dev/null +++ b/StructureHelperLogics/NdmCalculations/Analyses/ValueDiagrams/ValueDiagramEntityResult.cs @@ -0,0 +1,21 @@ +using StructureHelperCommon.Models.Shapes; +using System; +using System.Collections.Generic; +using System.Text; + +namespace StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams +{ + public class ValueDiagramEntityResult : IValueDiagramEntityResult + { + public IValueDiagramEntity ValueDiagramEntity { get; } + + public ValueDiagramEntityResult(IValueDiagramEntity valueDiagramEntity) + { + ValueDiagramEntity = valueDiagramEntity; + } + + public List PointList { get; set; } = []; + public bool IsValid { get; set; } = true; + public string? Description { get; set; } = string.Empty; + } +} diff --git a/StructureHelperLogics/NdmCalculations/Primitives/Logics/CheckPrimitiveCollectionLogic.cs b/StructureHelperLogics/NdmCalculations/Primitives/Logics/CheckPrimitiveCollectionLogic.cs index 97b3e30..acabea8 100644 --- a/StructureHelperLogics/NdmCalculations/Primitives/Logics/CheckPrimitiveCollectionLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Primitives/Logics/CheckPrimitiveCollectionLogic.cs @@ -1,13 +1,6 @@ using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Models; -using StructureHelperCommon.Models.Calculators; -using StructureHelperCommon.Models.Materials; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace StructureHelperLogics.NdmCalculations.Primitives.Logics { @@ -57,8 +50,16 @@ namespace StructureHelperLogics.NdmCalculations.Primitives.Logics } else { + foreach (var primitive in Entity.Primitives) { + if (primitive.NdmElement.HeadMaterial is null) + { + result = false; + string message = $"Primitive {primitive.Name} does not have material\n"; + checkResult += message; + TraceLogger?.AddMessage(message, TraceLogStatuses.Error); + } if (primitive is IRebarNdmPrimitive rebar) { CheckRebar(rebar); diff --git a/StructureHelperLogics/StructureHelperLogics.csproj b/StructureHelperLogics/StructureHelperLogics.csproj index 3517da1..dfc6ea3 100644 --- a/StructureHelperLogics/StructureHelperLogics.csproj +++ b/StructureHelperLogics/StructureHelperLogics.csproj @@ -1,7 +1,7 @@  - net9.0-windows7.0 + net10.0-windows7.0 enable enable diff --git a/StructureHelperTests/StructureHelperTests.csproj b/StructureHelperTests/StructureHelperTests.csproj index 3b1bbb5..b982019 100644 --- a/StructureHelperTests/StructureHelperTests.csproj +++ b/StructureHelperTests/StructureHelperTests.csproj @@ -1,7 +1,7 @@  - net9.0-windows7.0 + net10.0-windows7.0 enable enable false