From 70bfd065c497686e6cb79c65a762465631a53513 Mon Sep 17 00:00:00 2001 From: Evgeny Redikultsev Date: Sat, 6 Dec 2025 20:30:51 +0500 Subject: [PATCH] Add cylinders to 3dLogic --- .../CurvatureCalculatorInputDataDTO.cs | 3 + .../Infrastructure/HelixViewModelBase.cs | 2 +- .../Libraries/LoaderCalculator.dll | Bin 100864 -> 103936 bytes .../ResultViewers/ShowIsoFieldResult.cs | 42 ++++- .../CurvatureCalculatorInputDataViewModel.cs | 10 ++ .../Curvatures/CurvatureCalculatorView.xaml | 9 +- .../ForceResultLogic/GetMoqNdmLogic.cs | 21 ++- .../ValuePointDiagramLogic.cs | 14 +- .../ForcesResultsViewModel.cs | 2 +- .../GetModels3dByValuePrimivesLogic.cs | 149 ++++++++++++++++++ .../ForceCalculatorViews/IGetModels3dLogic.cs | 21 +++ .../IsoField3DViewerView.xaml | 145 +++++++++++------ .../IsoField3DViewerView.xaml.cs | 2 +- .../IsoField3DViewerViewModel.cs | 107 ++++++------- .../Logics/ForceTupleTraceResultLogic.cs | 2 +- .../CurvatureCalculatorInputData.cs | 1 + .../Curvatures/CurvatureForceCalculator.cs | 40 +++-- .../CurvatureForceCalculatorInputData.cs | 1 + .../ICurvatureCalculatorInputData.cs | 1 + .../ICurvatureForceCalculatorInputData.cs | 1 + ...vatureCalculatorInputDataUpdateStrategy.cs | 2 +- .../Logics/CurvatureCalculatorLogic.cs | 3 +- .../Analyses/RC/InputDataFactory.cs | 12 +- .../Cracking/IsSectionCrackedByForceLogic.cs | 4 +- .../Cracking/RebarStressCalculator.cs | 8 +- .../RebarStressSofteningLogic.cs | 10 +- .../Triangulations/PointTriangulationLogic.cs | 1 - .../Triangulations/RebarTriangulationLogic.cs | 12 +- .../RectangleTriangulationLogic.cs | 1 - .../Triangulations/TriangulationService.cs | 7 - .../NdmPrimitives/MeshElasticLogic.cs | 9 +- .../Ndms/RCSections/RCSectionTest.cs | 1 - 32 files changed, 459 insertions(+), 184 deletions(-) create mode 100644 StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/GetModels3dByValuePrimivesLogic.cs create mode 100644 StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IGetModels3dLogic.cs diff --git a/DataAccess/DTOs/DTOEntities/Curvatures/CurvatureCalculatorInputDataDTO.cs b/DataAccess/DTOs/DTOEntities/Curvatures/CurvatureCalculatorInputDataDTO.cs index 2785a9d..18b0b59 100644 --- a/DataAccess/DTOs/DTOEntities/Curvatures/CurvatureCalculatorInputDataDTO.cs +++ b/DataAccess/DTOs/DTOEntities/Curvatures/CurvatureCalculatorInputDataDTO.cs @@ -18,6 +18,9 @@ namespace DataAccess.DTOs public List ForceActions { get; } = []; [JsonProperty("Primitives")] public List Primitives { get; } = []; + [JsonProperty("ConsiderSofteningFactor")] + public bool ConsiderSofteningFactor { get; set; } = false; + public CurvatureCalculatorInputDataDTO(Guid id) { Id = id; diff --git a/StructureHelper/Infrastructure/HelixViewModelBase.cs b/StructureHelper/Infrastructure/HelixViewModelBase.cs index fbbfb4a..c7210d7 100644 --- a/StructureHelper/Infrastructure/HelixViewModelBase.cs +++ b/StructureHelper/Infrastructure/HelixViewModelBase.cs @@ -112,7 +112,7 @@ namespace StructureHelper.Infrastructure // setup lighting AmbientLightColor = Colors.DimGray; DirectionalLightColor = Colors.White; - DirectionalLightDirection = new Vector3D(-2, -5, -2); + DirectionalLightDirection = new Vector3D(-2, -5, 2); BackgroundTexture = BitmapExtensions.CreateLinearGradientBitmapStream(EffectsManager, 128, 128, Direct2DImageFormat.Bmp, diff --git a/StructureHelper/Libraries/LoaderCalculator.dll b/StructureHelper/Libraries/LoaderCalculator.dll index a701f0b4eebf91c3b2785fa5a9d6faf977dc5135..41f80eee8da9ec3c979d31ed10dcb34ec11d8f8d 100644 GIT binary patch literal 103936 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∾NDChmMujc-Y{pS60GIJ{T2V_Hv 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
!@} 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 GetPrimitiveSets(IStrainMatrix strainMatrix, IEnumerable ndms, IEnumerable resultFuncs) + public static List GetPrimitiveSets(IStrainMatrix strainMatrix, IEnumerable ndms, IEnumerable resultFuncs, bool convertRectangles = false) { List primitiveSets = new List(); foreach (var valDelegate in resultFuncs) @@ -31,7 +32,7 @@ namespace StructureHelper.Services.ResultViewers List primitives = new List(); foreach (INdm ndm in ndms) { - primitives.Add(ProcessNdm(strainMatrix, valDelegate, ndm)); + primitives.AddRange(ProcessNdm(strainMatrix, valDelegate, ndm, convertRectangles)); } primitiveSet.ValuePrimitives = primitives; primitiveSets.Add(primitiveSet); @@ -72,35 +73,47 @@ namespace StructureHelper.Services.ResultViewers return valuePrimitive; } - private static IValuePrimitive ProcessNdm(IStrainMatrix strainMatrix, ForceResultFunc valDelegate, INdm ndm) + private static List ProcessNdm(IStrainMatrix strainMatrix, ForceResultFunc valDelegate, INdm ndm, bool convertRectangles) { + List valuePrimitives = []; double delegateResult = valDelegate.ResultFunction.Invoke(strainMatrix, ndm); double val = delegateResult * valDelegate.UnitFactor; //val = roundLogic.RoundValue(val); IValuePrimitive valuePrimitive; if (ndm is IRectangleNdm shapeNdm) { - valuePrimitive = ProcessRectangle(shapeNdm, val); + if (convertRectangles) + { + valuePrimitives.AddRange(ProcessRectangleToTriangles(shapeNdm, strainMatrix, valDelegate)); + } + else + { + valuePrimitive = ProcessRectangle(shapeNdm, val); + valuePrimitives.Add(valuePrimitive); + } } else if (ndm is ITriangleNdm triangle) { //valuePrimitive = ProcessTriangle(triangle, val); valuePrimitive = ProcessTriangle(strainMatrix, valDelegate, triangle); + valuePrimitives.Add(valuePrimitive); } else { valuePrimitive = ProcessCircle(ndm, val); + valuePrimitives.Add(valuePrimitive); } - return valuePrimitive; + return valuePrimitives; } private static IValuePrimitive ProcessTriangle(IStrainMatrix strainMatrix, ForceResultFunc valDelegate, ITriangleNdm triangle) { double delegateResult = valDelegate.ResultFunction.Invoke(strainMatrix, triangle); double val = delegateResult * valDelegate.UnitFactor; - var moqNdm1 = new Ndm() { CenterX = triangle.Point1.X, CenterY = triangle.Point1.Y, Area = triangle.Area, Material = triangle.Material }; - var moqNdm2 = new Ndm() { CenterX = triangle.Point2.X, CenterY = triangle.Point2.Y, Area = triangle.Area, Material = triangle.Material }; - var moqNdm3 = new Ndm() { CenterX = triangle.Point3.X, CenterY = triangle.Point3.Y, Area = triangle.Area, Material = triangle.Material }; + var moqLogic = new GetMoqNdmLogic(); + var moqNdm1 = moqLogic.GetMockNdm(triangle, new Point2D(triangle.Point1.X, triangle.Point1.Y)); + var moqNdm2 = moqLogic.GetMockNdm(triangle, new Point2D(triangle.Point2.X, triangle.Point2.Y)); + var moqNdm3 = moqLogic.GetMockNdm(triangle, new Point2D(triangle.Point3.X, triangle.Point3.Y)); var primitive = new TrianglePrimitive() { Point1 = new Point2D() { X = triangle.Point1.X, Y = triangle.Point1.Y }, @@ -127,6 +140,19 @@ namespace StructureHelper.Services.ResultViewers // return primitive; //} + private static List ProcessRectangleToTriangles(IRectangleNdm shapeNdm, IStrainMatrix strainMatrix, ForceResultFunc valDelegate) + { + List triangles = NdmTransform.ConvertRectangleToTriangleNdm(shapeNdm); + List valuePrimitives = []; + foreach (var item in triangles) + { + double delegateResult = valDelegate.ResultFunction.Invoke(strainMatrix, item); + double val = delegateResult * valDelegate.UnitFactor; + valuePrimitives.Add(ProcessTriangle(strainMatrix, valDelegate, (ITriangleNdm)item)); + } + return valuePrimitives; + } + private static IValuePrimitive ProcessRectangle(IRectangleNdm shapeNdm, double val) { return new RectanglePrimitive() diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/Curvatures/CurvatureCalculatorInputDataViewModel.cs b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/Curvatures/CurvatureCalculatorInputDataViewModel.cs index d0e969b..119fd47 100644 --- a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/Curvatures/CurvatureCalculatorInputDataViewModel.cs +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/Curvatures/CurvatureCalculatorInputDataViewModel.cs @@ -12,8 +12,18 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.Curvatures public class CurvatureCalculatorInputDataViewModel : ViewModelBase { private ICurvatureCalculatorInputData inputData; + private bool considerSofteningFactor; public DeflectionFactorViewModel DeflectionFactor { get; } + public bool ConsiderSofteningFactor + { + get => inputData.ConsiderSofteningFactor; + set + { + inputData.ConsiderSofteningFactor = value; + OnPropertyChanged(nameof(ConsiderSofteningFactor)); + } + } public SourceTargetVM CombinationViewModel { get; } public SourceTargetVM PrimitivesViewModel { get; } diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/Curvatures/CurvatureCalculatorView.xaml b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/Curvatures/CurvatureCalculatorView.xaml index 0a8000c..6e9beb0 100644 --- a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/Curvatures/CurvatureCalculatorView.xaml +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/Curvatures/CurvatureCalculatorView.xaml @@ -48,11 +48,14 @@ + - + + + - + @@ -71,7 +74,7 @@ - + diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/GetMoqNdmLogic.cs b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/GetMoqNdmLogic.cs index 9f2bbfa..45a177c 100644 --- a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/GetMoqNdmLogic.cs +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/GetMoqNdmLogic.cs @@ -1,4 +1,6 @@ -using LoaderCalculator.Data.Ndms; +using LoaderCalculator.Data.Matrix; +using LoaderCalculator.Data.Ndms; +using LoaderCalculator.Infrastructure.Geometry; using StructureHelperCommon.Models.Shapes; using StructureHelperCommon.Models.States; using StructureHelperLogics.NdmCalculations.Primitives; @@ -24,11 +26,20 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu 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); + StrainMatrix prestrainMatrix = new() + { + Kx = (userPrestrain.Mx + autoPrestrain.Mx), + Ky = (userPrestrain.My + autoPrestrain.My), + EpsZ = userPrestrain.Nz + autoPrestrain.Nz + }; + ndm.PrestrainLogic.Add(PrestrainTypes.Prestrain, prestrainMatrix); return ndm; } + + public INdm GetMockNdm(INdm ndm, IPoint2D point) + { + INdm newNdm = NdmTransform.GetMoqNdmAtPoint(ndm, new PointLd2D(point.X, point.Y)); + return newNdm; + } } } diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/ValuePointDiagramLogic.cs b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/ValuePointDiagramLogic.cs index a9355e1..20cf8ec 100644 --- a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/ValuePointDiagramLogic.cs +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForceResultLogic/ValuePointDiagramLogic.cs @@ -1,4 +1,5 @@ -using LoaderCalculator.Data.Ndms; +using LoaderCalculator.Data.Matrix; +using LoaderCalculator.Data.Ndms; using StructureHelper.Services.ResultViewers; using StructureHelper.Windows.Forces; using StructureHelperCommon.Infrastructures.Exceptions; @@ -145,10 +146,13 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu CenterY = valuePoint.areaPoint.Point.Y, Material = material, }; - var prestrain = (userPrestrain.Mx + autoPrestrain.Mx) * valuePoint.areaPoint.Point.Y - + (userPrestrain.My + autoPrestrain.My) * valuePoint.areaPoint.Point.X - + userPrestrain.Nz + autoPrestrain.Nz; - ndm.PrestrainLogic.Add(PrestrainTypes.Prestrain, prestrain); + StrainMatrix prestrainMatrix = new() + { + Kx = (userPrestrain.Mx + autoPrestrain.Mx), + Ky = (userPrestrain.My + autoPrestrain.My), + EpsZ = userPrestrain.Nz + autoPrestrain.Nz + }; + ndm.PrestrainLogic.Add(PrestrainTypes.Prestrain, prestrainMatrix); return ndm; } private List GetValueLabels(IEnumerable selectedDelegates) diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForcesResultsViewModel.cs b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForcesResultsViewModel.cs index 5e9c9df..9a0a641 100644 --- a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForcesResultsViewModel.cs +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/ForcesResultsViewModel.cs @@ -154,7 +154,7 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu try { IStrainMatrix strainMatrix = SelectedResult.ForcesTupleResult.LoaderResults.ForceStrainPair.StrainMatrix; - var primitiveSets = ShowIsoFieldResult.GetPrimitiveSets(strainMatrix, ndms, ForceResultFuncFactory.GetResultFuncs()); + var primitiveSets = ShowIsoFieldResult.GetPrimitiveSets(strainMatrix, ndms, ForceResultFuncFactory.GetResultFuncs(), true); var report = new IsoField3DReport(primitiveSets); report.Show(); } diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/GetModels3dByValuePrimivesLogic.cs b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/GetModels3dByValuePrimivesLogic.cs new file mode 100644 index 0000000..b61b8a2 --- /dev/null +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/GetModels3dByValuePrimivesLogic.cs @@ -0,0 +1,149 @@ +using FieldVisualizer.Entities.ColorMaps; +using FieldVisualizer.Entities.Values; +using FieldVisualizer.Entities.Values.Primitives; +using FieldVisualizer.Services.ColorServices; +using HelixToolkit.Geometry; +using HelixToolkit.Maths; +using HelixToolkit.SharpDX; +using HelixToolkit.SharpDX.Core; +using HelixToolkit.Wpf.SharpDX; +using System; +using System.Collections.Generic; +using System.Numerics; +using System.Text; + +namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalculatorViews +{ + public class GetModels3dByValuePrimivesLogic : IGetModels3dLogic + { + public double ZoomValue { get; set; } + public bool InvertNormal { get; set; } + public IColorMap ColorMap { get; set; } + public IValueRange ValueRange { get; set; } + public bool ShowZeroPlane { get; set; } + + public void GetModels3d(IEnumerable valuePrimitives, Viewport3DX viewport) + { + foreach (var primitive in valuePrimitives) + { + if (primitive is ICirclePrimitive circlePrimitive) + { + if (circlePrimitive.Value != 0) + { + var model2 = CreateCylinder(circlePrimitive); + viewport.Items.Add(model2); + } + } + else if (primitive is ITrianglePrimitive triangle) + { + var model2 = CreateTriangle(triangle); + viewport.Items.Add(model2); + if (ShowZeroPlane == true) + { + var model1 = CreateZeroTriangle(triangle); + viewport.Items.Add(model1); + } + } + } + } + + private MeshGeometryModel3D CreateCylinder(ICirclePrimitive circle) + { + // Create mesh along Z-axis + var builder = new MeshBuilder(); + + Vector3 p0 = new Vector3((float)circle.CenterX, (float)circle.CenterY, 0); // bottom center + float cylinderHeight = (float)(circle.Value * ZoomValue); + Vector3 p1 = new Vector3((float)circle.CenterX, (float)circle.CenterY, cylinderHeight); // top center + + builder.AddCylinder(p0, p1, (float)circle.Diameter, 8); + + // Build geometry + var cylinderGeometry = builder.ToMeshGeometry3D(); + + // Create material (constant grey) + var material = new PhongMaterial + { + DiffuseColor = ToColor4(ColorOperations.GetColorByValue(ValueRange, ColorMap, circle.Value)), + SpecularShininess = 50f + }; + + // Create model + var cylinderModel = new MeshGeometryModel3D + { + Geometry = cylinderGeometry, + Material = material + }; + return cylinderModel; + } + + private MeshGeometryModel3D CreateZeroTriangle(ITrianglePrimitive triangle) + { + // Triangle vertices + Vector3 p0 = new Vector3((float)triangle.Point1.X, (float)triangle.Point1.Y, 0); + Vector3 p1 = new Vector3((float)triangle.Point2.X, (float)triangle.Point2.Y, 0); + Vector3 p2 = new Vector3((float)triangle.Point3.X, (float)triangle.Point3.Y, 0); + + var builder = new MeshBuilder(); + builder.AddTriangle(p0, p1, p2); + + var mesh = builder.ToMeshGeometry3D(); + + var material = new PBRMaterial + { + AlbedoColor = new Color4(0.5f, 0.5f, 0.5f, 0.4f), // 40% opacity + RoughnessFactor = 0.8f, + MetallicFactor = 0.0f + }; + + + var model = new MeshGeometryModel3D + { + Geometry = mesh, + Material = material, + CullMode = SharpDX.Direct3D11.CullMode.None, + InvertNormal = InvertNormal, + }; + return model; + } + + private MeshGeometryModel3D CreateTriangle(ITrianglePrimitive triangle) + { + // Triangle vertices + Vector3 p0 = new Vector3((float)triangle.Point1.X, (float)triangle.Point1.Y, (float)(triangle.ValuePoint1 * ZoomValue)); + Vector3 p1 = new Vector3((float)triangle.Point2.X, (float)triangle.Point2.Y, (float)(triangle.ValuePoint2 * ZoomValue)); + Vector3 p2 = new Vector3((float)triangle.Point3.X, (float)triangle.Point3.Y, (float)(triangle.ValuePoint3 * ZoomValue)); + + var builder = new MeshBuilder(); + builder.AddTriangle(p0, p1, p2); + + var mesh = builder.ToMeshGeometry3D(); + + var material = new PhongMaterial + { + DiffuseColor = ToColor4(ColorOperations.GetColorByValue(ValueRange, ColorMap, triangle.Value)), + SpecularShininess = 50f + }; + + + var model = new MeshGeometryModel3D + { + Geometry = mesh, + Material = material, + CullMode = SharpDX.Direct3D11.CullMode.None, + InvertNormal = InvertNormal + }; + return model; + } + + public static Color4 ToColor4(System.Windows.Media.Color c) + { + return new Color4( + c.R / 255f, + c.G / 255f, + c.B / 255f, + c.A / 255f + ); + } + } +} diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IGetModels3dLogic.cs b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IGetModels3dLogic.cs new file mode 100644 index 0000000..d177b1a --- /dev/null +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IGetModels3dLogic.cs @@ -0,0 +1,21 @@ +using FieldVisualizer.Entities.ColorMaps; +using FieldVisualizer.Entities.Values; +using FieldVisualizer.Entities.Values.Primitives; +using HelixToolkit.Maths; +using HelixToolkit.Wpf.SharpDX; +using System.Collections.Generic; + +namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalculatorViews +{ + public interface IGetModels3dLogic + { + IColorMap ColorMap { get; set; } + bool InvertNormal { get; set; } + bool ShowZeroPlane { get; set; } + IValueRange ValueRange { get; set; } + double ZoomValue { get; set; } + + static abstract Color4 ToColor4(System.Windows.Media.Color c); + void GetModels3d(IEnumerable valuePrimitives, Viewport3DX viewport); + } +} \ No newline at end of file diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IsoField3DViewerView.xaml b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IsoField3DViewerView.xaml index 663f01d..01ff978 100644 --- a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IsoField3DViewerView.xaml +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IsoField3DViewerView.xaml @@ -5,33 +5,87 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalculatorViews" xmlns:hx="http://helix-toolkit.org/wpf/SharpDX" + xmlns:uc="clr-namespace:StructureHelper.Windows.UserControls" d:DataContext="{d:DesignInstance local:IsoField3DViewerViewModel}" mc:Ignorable="d" - Title="Contour 3DViewer" Height="450" Width="800" MinHeight="300" MinWidth="300" MaxHeight="1000" MaxWidth="1400" WindowStartupLocation="CenterScreen"> - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + - - - - - - - - - - - - + + - - - + + + + + + - - + + diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IsoField3DViewerView.xaml.cs b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IsoField3DViewerView.xaml.cs index d2156bd..b09b842 100644 --- a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IsoField3DViewerView.xaml.cs +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IsoField3DViewerView.xaml.cs @@ -25,7 +25,7 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu this.viewModel = viewModel; this.DataContext = viewModel; viewModel.ViewportViewModel.Viewport3D = View3D; - viewModel.Refresh(); + viewModel.SaveCopyViewModel.FrameWorkElement = ViewportGrid; } } } diff --git a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IsoField3DViewerViewModel.cs b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IsoField3DViewerViewModel.cs index eedde4a..09e87c7 100644 --- a/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IsoField3DViewerViewModel.cs +++ b/StructureHelper/Windows/CalculationWindows/CalculatorsViews/ForceCalculatorViews/IsoField3DViewerViewModel.cs @@ -5,28 +5,24 @@ using FieldVisualizer.Entities.Values.Primitives; using FieldVisualizer.Services.ColorServices; using FieldVisualizer.Services.PrimitiveServices; using FieldVisualizer.Services.ValueRanges; -using HelixToolkit; using HelixToolkit.Geometry; using HelixToolkit.Maths; using HelixToolkit.SharpDX; using HelixToolkit.Wpf.SharpDX; using StructureHelper.Infrastructure; -using StructureHelper.Models.Materials; +using StructureHelper.Windows.Graphs; using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Numerics; -using System.Windows.Media; -using System.Windows.Media.Media3D; -using Color = HelixToolkit.Maths.Color; +using System.Windows.Input; namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalculatorViews { public class IsoField3DViewerViewModel : ViewModelBase { const int RangeNumber = 16; - private int userZoomFactor = 100; + private int userZoomFactor = 30; private IEnumerable primitiveSets; private Element3D item0; private Element3D item1; @@ -39,8 +35,10 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu private IColorMap _ColorMap; private ColorMapsTypes _ColorMapType; + public ContourViewportViewModel ViewportViewModel { get; } = new ContourViewportViewModel(); public IEnumerable PrimitiveSets { get => primitiveSets;} + public SaveCopyFWElementViewModel SaveCopyViewModel { get; private set; } = new(); public IsoField3DViewerViewModel(IEnumerable primitiveSets) { @@ -54,6 +52,7 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu set { selectedPrimitiveSet = value; + ViewportViewModel.Title = selectedPrimitiveSet.Name; OnPropertyChanged(nameof(SelectedPrimitiveSet)); RebuildPrimitives(); } @@ -66,12 +65,32 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu { userZoomFactor = value; OnPropertyChanged(nameof(UserZoomFactor)); - RebuildPrimitives (); + } + } + + public bool ShowZeroPlane + { + get => showZeroPlane; + set + { + showZeroPlane = value; + OnPropertyChanged(nameof(ShowZeroPlane)); + } + } + + public bool InvertNormal + { + get => invertNormal; + set + { + invertNormal = value; + OnPropertyChanged(nameof(InvertNormal)); } } private void RebuildPrimitives() { + if (SelectedPrimitiveSet is null) { return; } SetColor(); item0 = ViewportViewModel.Viewport3D.Items[0]; item1 = ViewportViewModel.Viewport3D.Items[1]; @@ -81,61 +100,16 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu ViewportViewModel.Viewport3D.Items.Add(item1); ViewportViewModel.Viewport3D.Items.Add(item2); double maxValue = SelectedPrimitiveSet.ValuePrimitives.Max(x => x.Value) - SelectedPrimitiveSet.ValuePrimitives.Min(x => x.Value); - zoomValue = UserZoomFactor / 100.0 / maxValue; - foreach (var primitive in SelectedPrimitiveSet.ValuePrimitives) + zoomValue = (Math.Pow(1.1, UserZoomFactor) - 1) / 100.0 / maxValue; + var logic = new GetModels3dByValuePrimivesLogic() { - if (primitive is ITrianglePrimitive triangle) - { - var model = CreateTriangle(triangle); - ViewportViewModel.Viewport3D.Items.Add(model); - } - } - } - - - private MeshGeometryModel3D CreateTriangle(ITrianglePrimitive triangle) - { - // Triangle vertices - Vector3 p0 = new Vector3((float)triangle.Point1.X, (float)triangle.Point1.Y, (float)(triangle.ValuePoint1 * zoomValue)); - Vector3 p1 = new Vector3((float)triangle.Point2.X, (float)triangle.Point2.Y, (float)(triangle.ValuePoint2 * zoomValue)); - Vector3 p2 = new Vector3((float)triangle.Point3.X, (float)triangle.Point3.Y, (float)(triangle.ValuePoint3 * zoomValue)); - - var builder = new MeshBuilder(); - builder.AddTriangle(p0, p1, p2); - - var mesh = builder.ToMeshGeometry3D(); - - var material = new PhongMaterial - { - DiffuseColor = ToColor4(ColorOperations.GetColorByValue(valueRange, _ColorMap, triangle.Value)), - SpecularShininess = 50f + ZoomValue = zoomValue, + ShowZeroPlane = ShowZeroPlane, + InvertNormal = InvertNormal, + ColorMap = _ColorMap, + ValueRange = valueRange, }; - - - var model = new MeshGeometryModel3D - { - Geometry = mesh, - Material = material, - CullMode = SharpDX.Direct3D11.CullMode.None, - ToolTip = triangle.Value - }; - return model; - } - - public static Color4 ToColor4(System.Windows.Media.Color c) - { - return new Color4( - c.R / 255f, - c.G / 255f, - c.B / 255f, - c.A / 255f - ); - } - - internal void Refresh() - { - - + logic.GetModels3d(SelectedPrimitiveSet.ValuePrimitives, ViewportViewModel.Viewport3D); } private void SetColor() @@ -144,5 +118,16 @@ namespace StructureHelper.Windows.CalculationWindows.CalculatorsViews.ForceCalcu valueRanges = ValueRangeOperations.DivideValueRange(valueRange, RangeNumber); valueColorRanges = ColorOperations.GetValueColorRanges(valueRange, valueRanges, _ColorMap); } + + private RelayCommand rebuildCommand; + private bool showZeroPlane = true; + private bool invertNormal = false; + + public ICommand RebuildCommand => rebuildCommand ??= new RelayCommand(Rebuild); + + private void Rebuild(object commandParameter) + { + RebuildPrimitives(); + } } } diff --git a/StructureHelperLogics/NdmCalculations/Analyses/ByForces/Logics/ForceTupleTraceResultLogic.cs b/StructureHelperLogics/NdmCalculations/Analyses/ByForces/Logics/ForceTupleTraceResultLogic.cs index 223cc83..9ac37e1 100644 --- a/StructureHelperLogics/NdmCalculations/Analyses/ByForces/Logics/ForceTupleTraceResultLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Analyses/ByForces/Logics/ForceTupleTraceResultLogic.cs @@ -67,7 +67,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces var exitMx = stiffness[0, 0] * strain.Kx + stiffness[0, 1] * strain.Ky + stiffness[0, 2] * strain.EpsZ; var exitMy = stiffness[1, 0] * strain.Kx + stiffness[1, 1] * strain.Ky + stiffness[1, 2] * strain.EpsZ; var exitNz = stiffness[2, 0] * strain.Kx + stiffness[2, 1] * strain.Ky + stiffness[2, 2] * strain.EpsZ; - var PrestressMatrix = new ForceLogic() + var PrestressMatrix = new CalculateForceMatrixLogic() .GetPrestressMatrix(new StiffnessLogic(), ndmCollection, strain); double mx = exitMx + PrestressMatrix.Mx; double my = exitMy + PrestressMatrix.My; diff --git a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/CurvatureCalculatorInputData.cs b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/CurvatureCalculatorInputData.cs index 0a802f1..1e05f59 100644 --- a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/CurvatureCalculatorInputData.cs +++ b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/CurvatureCalculatorInputData.cs @@ -10,6 +10,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.Curvatures public List Primitives { get; } = []; public IDeflectionFactor DeflectionFactor { get; set; } = new DeflectionFactor(Guid.NewGuid()); + public bool ConsiderSofteningFactor { get; set; } = false; public CurvatureCalculatorInputData(Guid id) { diff --git a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/CurvatureForceCalculator.cs b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/CurvatureForceCalculator.cs index 3e15de6..68d7795 100644 --- a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/CurvatureForceCalculator.cs +++ b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/CurvatureForceCalculator.cs @@ -1,4 +1,6 @@ -using StructureHelperCommon.Infrastructures.Enums; +using LoaderCalculator.Data.Materials; +using LoaderCalculator.Logics; +using StructureHelperCommon.Infrastructures.Enums; using StructureHelperCommon.Models; using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Forces; @@ -36,16 +38,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.Curvatures PrepareResult(); try { - if (CheckForCracks(InputData.ForcePair.FullForceTuple, CalcTerms.ShortTerm) || CheckForCracks(InputData.ForcePair.LongForceTuple, CalcTerms.ShortTerm)) - { - TraceLogger?.AddMessage($"Section is cracked"); - calculator = new CurvatureTermCrackedCalculator(TraceLogger) { InputData = InputData }; - } - else - { - TraceLogger?.AddMessage($"Section is not cracked"); - calculator = new CurvatureTermUncrackedCalculator(TraceLogger) { InputData = InputData }; - } + GetCaclculator(); } catch (Exception ex) { @@ -64,7 +57,26 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.Curvatures result.SectionResult = calcResult; } - private bool CheckForCracks(IForceTuple forceTuple, CalcTerms calcTerm) + private void GetCaclculator() + { + if (InputData.ConsiderSofteningFactor == false) + { + calculator = new CurvatureTermUncrackedCalculator(TraceLogger) { InputData = InputData }; + return; + } + if (IsSectionCracked(InputData.ForcePair.FullForceTuple, CalcTerms.ShortTerm) || IsSectionCracked(InputData.ForcePair.LongForceTuple, CalcTerms.ShortTerm)) + { + TraceLogger?.AddMessage($"Section is cracked"); + calculator = new CurvatureTermCrackedCalculator(TraceLogger) { InputData = InputData }; + } + else + { + TraceLogger?.AddMessage($"Section is not cracked"); + calculator = new CurvatureTermUncrackedCalculator(TraceLogger) { InputData = InputData }; + } + } + + private bool IsSectionCracked(IForceTuple forceTuple, CalcTerms calcTerm) { var triangulateLogic = new TriangulatePrimitiveLogic() { @@ -74,6 +86,10 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.Curvatures TraceLogger = TraceLogger }; var ndms = triangulateLogic.GetNdms(); + if (!ndms.Where(x => x.Material is ICrackMaterial).Any()) + { + return false; + } var logic = new IsSectionCrackedByForceLogic() { ForceTuple = forceTuple, diff --git a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/CurvatureForceCalculatorInputData.cs b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/CurvatureForceCalculatorInputData.cs index b02d33a..b60ea40 100644 --- a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/CurvatureForceCalculatorInputData.cs +++ b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/CurvatureForceCalculatorInputData.cs @@ -8,5 +8,6 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.Curvatures public IDesignForcePair ForcePair { get; set; } public List Primitives { get; set; } = []; public IDeflectionFactor DeflectionFactor { get; set; } + public bool ConsiderSofteningFactor { get; set; } } } diff --git a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/ICurvatureCalculatorInputData.cs b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/ICurvatureCalculatorInputData.cs index 2d45f65..706f6bc 100644 --- a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/ICurvatureCalculatorInputData.cs +++ b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/ICurvatureCalculatorInputData.cs @@ -11,5 +11,6 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.Curvatures public interface ICurvatureCalculatorInputData : IInputData, ISaveable, IHasForceActions, IHasPrimitives { IDeflectionFactor DeflectionFactor { get; set; } + bool ConsiderSofteningFactor { get; set; } } } diff --git a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/ICurvatureForceCalculatorInputData.cs b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/ICurvatureForceCalculatorInputData.cs index fb66650..e863ad7 100644 --- a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/ICurvatureForceCalculatorInputData.cs +++ b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/ICurvatureForceCalculatorInputData.cs @@ -8,5 +8,6 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.Curvatures { IDesignForcePair ForcePair {get;set;} IDeflectionFactor DeflectionFactor { get; set; } + bool ConsiderSofteningFactor { get; set; } } } diff --git a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/Logics/CurvatureCalculatorInputDataUpdateStrategy.cs b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/Logics/CurvatureCalculatorInputDataUpdateStrategy.cs index 258e334..8d66164 100644 --- a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/Logics/CurvatureCalculatorInputDataUpdateStrategy.cs +++ b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/Logics/CurvatureCalculatorInputDataUpdateStrategy.cs @@ -46,7 +46,7 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.Curvatures if (ReferenceEquals(target, source)) return; - + target.ConsiderSofteningFactor = source.ConsiderSofteningFactor; if (UpdateChildren) { ValidateChildProperties(target, source); diff --git a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/Logics/CurvatureCalculatorLogic.cs b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/Logics/CurvatureCalculatorLogic.cs index f044bb2..0671f9d 100644 --- a/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/Logics/CurvatureCalculatorLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/Logics/CurvatureCalculatorLogic.cs @@ -71,7 +71,8 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.Curvatures { ForcePair = pair, Primitives = InputData.Primitives, - DeflectionFactor = InputData.DeflectionFactor + DeflectionFactor = InputData.DeflectionFactor, + ConsiderSofteningFactor = InputData.ConsiderSofteningFactor, }; ForceCalculator.InputData = forceInputData; ForceCalculator.Run(); diff --git a/StructureHelperLogics/NdmCalculations/Analyses/RC/InputDataFactory.cs b/StructureHelperLogics/NdmCalculations/Analyses/RC/InputDataFactory.cs index 7544676..73ba4ff 100644 --- a/StructureHelperLogics/NdmCalculations/Analyses/RC/InputDataFactory.cs +++ b/StructureHelperLogics/NdmCalculations/Analyses/RC/InputDataFactory.cs @@ -1,4 +1,5 @@ -using LoaderCalculator.Data.Matrix; +using LoaderCalculator; +using LoaderCalculator.Data.Matrix; using LoaderCalculator.Data.Ndms; using LoaderCalculator.Logics; using StructureHelperCommon.Infrastructures.Enums; @@ -6,11 +7,6 @@ using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperLogics.Models.Materials; using StructureHelperLogics.NdmCalculations.Primitives; using StructureHelperLogics.NdmCalculations.Triangulations; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace StructureHelperLogics.NdmCalculations.Analyses.RC { @@ -42,7 +38,9 @@ namespace StructureHelperLogics.NdmCalculations.Analyses.RC { inputData.ReinforcementStress = inputData.ReinforcementStrength; } - inputData.IsPrestressed = ndm.PrestrainLogic.GetByType(PrestrainTypes.Prestrain).Sum(x => x.PrestrainValue) > 0.0005d ? true : false; + var prestrainLogic = new GetNdmPrestrainLogic(); + var prestrainValue = prestrainLogic.GetPrestrainValueAtCenter(ndm); + inputData.IsPrestressed = prestrainValue > 0.0005d ? true : false; inputData.LappedCountRate = lappedCountRate; return inputData; } diff --git a/StructureHelperLogics/NdmCalculations/Cracking/IsSectionCrackedByForceLogic.cs b/StructureHelperLogics/NdmCalculations/Cracking/IsSectionCrackedByForceLogic.cs index 49f07a2..77b38ce 100644 --- a/StructureHelperLogics/NdmCalculations/Cracking/IsSectionCrackedByForceLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Cracking/IsSectionCrackedByForceLogic.cs @@ -5,7 +5,6 @@ using StructureHelperCommon.Models; using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Forces; using StructureHelperLogics.NdmCalculations.Analyses.ByForces; -using System.Diagnostics.Eventing.Reader; namespace StructureHelperLogics.NdmCalculations.Cracking { @@ -46,7 +45,8 @@ namespace StructureHelperLogics.NdmCalculations.Cracking } var strainMatrix = calcResult.LoaderResults.ForceStrainPair.StrainMatrix; IEnumerable checkedNdmCollection; - var isSectionCracked = stressLogic.IsSectionCracked(strainMatrix, CheckedNdmCollection); + var crackLogic = new CrackedSectionLogic(); + var isSectionCracked = crackLogic.IsSectionCracked(strainMatrix, CheckedNdmCollection); if (isSectionCracked == true) { TraceLogger?.AddMessage($"Cracks are appeared in cross-section for current force combination"); diff --git a/StructureHelperLogics/NdmCalculations/Cracking/RebarStressCalculator.cs b/StructureHelperLogics/NdmCalculations/Cracking/RebarStressCalculator.cs index fd38971..1fc0201 100644 --- a/StructureHelperLogics/NdmCalculations/Cracking/RebarStressCalculator.cs +++ b/StructureHelperLogics/NdmCalculations/Cracking/RebarStressCalculator.cs @@ -1,4 +1,5 @@ -using LoaderCalculator.Data.Ndms; +using LoaderCalculator; +using LoaderCalculator.Data.Ndms; using LoaderCalculator.Logics; using StructureHelperCommon.Infrastructures.Enums; using StructureHelperCommon.Infrastructures.Exceptions; @@ -9,6 +10,7 @@ using StructureHelperCommon.Services.Forces; using StructureHelperLogics.NdmCalculations.Analyses.ByForces; using StructureHelperLogics.NdmCalculations.Primitives; using StructureHelperLogics.NdmCalculations.Triangulations; +using System.Runtime.Intrinsics.Arm; namespace StructureHelperLogics.NdmCalculations.Cracking { @@ -63,7 +65,9 @@ namespace StructureHelperLogics.NdmCalculations.Cracking var strainMatrix = ForceTupleConverter.ConvertToLoaderStrainMatrix(strainTuple); result.RebarStrain = stressLogic.GetSectionStrain(strainMatrix, rebarNdm); result.RebarStress = stressLogic.GetStress(strainMatrix, rebarNdm); - result.ConcreteStrain = -concreteNdm.PrestrainLogic.GetAll().Sum(x => x.PrestrainValue); + var prestrainLogic = new GetNdmPrestrainLogic(); + var prestrainValue = prestrainLogic.GetPrestrainValueAtCenter(concreteNdm); + result.ConcreteStrain = - prestrainValue; } private void PrepareNewResult() diff --git a/StructureHelperLogics/NdmCalculations/Cracking/SofteningLogics/RebarStressSofteningLogic.cs b/StructureHelperLogics/NdmCalculations/Cracking/SofteningLogics/RebarStressSofteningLogic.cs index f06be3f..1b5b391 100644 --- a/StructureHelperLogics/NdmCalculations/Cracking/SofteningLogics/RebarStressSofteningLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Cracking/SofteningLogics/RebarStressSofteningLogic.cs @@ -1,4 +1,5 @@ -using LoaderCalculator.Data.Ndms; +using LoaderCalculator; +using LoaderCalculator.Data.Ndms; using LoaderCalculator.Logics; using StructureHelperCommon.Infrastructures.Enums; using StructureHelperCommon.Infrastructures.Exceptions; @@ -13,6 +14,7 @@ using StructureHelperLogics.NdmCalculations.Triangulations; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.Intrinsics.Arm; using System.Text; using System.Threading.Tasks; @@ -107,10 +109,8 @@ namespace StructureHelperLogics.NdmCalculations.Cracking rebarActualStrain = actualRebarResult.RebarStrain; rebarActualStress = actualRebarResult.RebarStress; TraceLogger?.AddMessage($"Actual strain of rebar EpsilonS = {rebarActualStrain}(dimensionless)"); - concreteStrainActual = concreteNdm - .PrestrainLogic - .GetAll() - .Sum(x => x.PrestrainValue); + var prestrainLogic = new GetNdmPrestrainLogic(); + concreteStrainActual = prestrainLogic.GetPrestrainValueAtCenter(concreteNdm); TraceLogger?.AddMessage($"Actual strain of concrete on the axis of rebar EpsilonC = {concreteStrainActual}(dimensionless)"); if (crackResult.IsSectionCracked == false) { diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogic.cs b/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogic.cs index cc81af9..fddbd8a 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/PointTriangulationLogic.cs @@ -1,5 +1,4 @@ using LoaderCalculator.Data.Ndms; -using LoaderCalculator.Data.Ndms.Transformations; using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Services.Forces; diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/RebarTriangulationLogic.cs b/StructureHelperLogics/NdmCalculations/Triangulations/RebarTriangulationLogic.cs index a4e4c8e..d460471 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/RebarTriangulationLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/RebarTriangulationLogic.cs @@ -1,17 +1,7 @@ -using LoaderCalculator.Data.Materials; -using LoaderCalculator.Data.Matrix; -using LoaderCalculator.Data.Ndms; -using LoaderCalculator.Data.Ndms.Transformations; +using LoaderCalculator.Data.Ndms; using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Models.Forces; -using StructureHelperCommon.Models.Shapes; using StructureHelperCommon.Services.Forces; -using StructureHelperLogics.Models.Primitives; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace StructureHelperLogics.NdmCalculations.Triangulations { diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogic.cs b/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogic.cs index 2b739db..05389ad 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogic.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/RectangleTriangulationLogic.cs @@ -1,5 +1,4 @@ using LoaderCalculator.Data.Ndms; -using LoaderCalculator.Data.Ndms.Transformations; using StructureHelperCommon.Infrastructures.Exceptions; namespace StructureHelperLogics.NdmCalculations.Triangulations diff --git a/StructureHelperLogics/NdmCalculations/Triangulations/TriangulationService.cs b/StructureHelperLogics/NdmCalculations/Triangulations/TriangulationService.cs index 9bbd1ff..de8444c 100644 --- a/StructureHelperLogics/NdmCalculations/Triangulations/TriangulationService.cs +++ b/StructureHelperLogics/NdmCalculations/Triangulations/TriangulationService.cs @@ -1,13 +1,6 @@ using LoaderCalculator.Data.Matrix; using LoaderCalculator.Data.Ndms; -using LoaderCalculator.Data.Ndms.Transformations; using StructureHelperCommon.Models.Forces; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using static System.Windows.Forms.Design.AxImporter; namespace StructureHelperLogics.NdmCalculations.Triangulations { diff --git a/StructureHelperLogics/Services/NdmPrimitives/MeshElasticLogic.cs b/StructureHelperLogics/Services/NdmPrimitives/MeshElasticLogic.cs index 9d092a6..e1e3058 100644 --- a/StructureHelperLogics/Services/NdmPrimitives/MeshElasticLogic.cs +++ b/StructureHelperLogics/Services/NdmPrimitives/MeshElasticLogic.cs @@ -1,4 +1,6 @@ -using LoaderCalculator.Data.Ndms; +using LoaderCalculator; +using LoaderCalculator.Data.Matrix; +using LoaderCalculator.Data.Ndms; using StructureHelperCommon.Infrastructures.Enums; using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Models; @@ -38,11 +40,12 @@ namespace StructureHelperLogics.Services.NdmPrimitives var material = ndm.Material; var materialFunc = material.Diagram; var newMaterialFunc = (double strain) => strain * material.InitModulus; - var existingPrestrain = ndm.PrestrainLogic.GetAll().Sum(x => x.PrestrainValue); + var prestrainLogic = new GetNdmPrestrainLogic(); + var existingPrestrain = prestrainLogic.GetPrestrainValueAtCenter(ndm); var newPrestrain = materialFunc(existingPrestrain) / material.InitModulus; ndm.Material.Diagram = newMaterialFunc; ndm.PrestrainLogic.DeleteAll(); - ndm.PrestrainLogic.Add(PrestrainTypes.Prestrain, newPrestrain); + ndm.PrestrainLogic.Add(PrestrainTypes.Prestrain, new StrainMatrix() { EpsZ = newPrestrain }); } return ndms; } diff --git a/StructureHelperTests/LibrariesTests/Ndms/RCSections/RCSectionTest.cs b/StructureHelperTests/LibrariesTests/Ndms/RCSections/RCSectionTest.cs index ff0a7b5..ac1d605 100644 --- a/StructureHelperTests/LibrariesTests/Ndms/RCSections/RCSectionTest.cs +++ b/StructureHelperTests/LibrariesTests/Ndms/RCSections/RCSectionTest.cs @@ -2,7 +2,6 @@ using LoaderCalculator.Data.Materials.MaterialBuilders; using LoaderCalculator.Data.Matrix; using LoaderCalculator.Data.Ndms; -using LoaderCalculator.Data.Ndms.Transformations; using LoaderCalculator.Data.Planes; using LoaderCalculator.Data.SourceData; using LoaderCalculator.Tests.Infrastructures.Logics;