From efb0fa6e1e813b73c0a6def800673eaf9ff496cd Mon Sep 17 00:00:00 2001 From: RedikultsevEvg Date: Thu, 17 Jul 2025 00:06:26 +0500 Subject: [PATCH] Add new strrrups DTOs --- .../HasStirrupsToDTOUpdateStrategy.cs | 19 ++++++- .../StirrupGroupToDTOConvertStrategy.cs | 19 +++++++ .../BeamShears/StirrupByInclinedRebarDTO.cs | 37 +++++++++++++ .../DTOEntities/BeamShears/StirrupGroupDTO.cs | 27 ++++++++++ .../DTOEntities/Materials/RebarSectionDTO.cs | 26 +++++++++ .../StirrupByInclinedRebarViewModel.cs | 10 ++-- .../StirrupByInclinedReebarView.xaml | 4 +- .../Services/IInterpolateValueLogic.cs | 18 +++++++ .../Services/InterpolateValueLogic.cs | 34 ++++++++++++ .../BeamShears/IStirrupByInclinedRebar.cs | 2 +- .../StirrupByInclinedRebarStrengthLogic.cs | 54 ++++++++++++++++--- .../StirrupByInclinedRebarUpdateStrategy.cs | 2 +- .../BeamShears/StirrupByInclinedRebar.cs | 2 +- 13 files changed, 237 insertions(+), 17 deletions(-) create mode 100644 DataAccess/DTOs/Converters/BeamShears/StirrupGroupToDTOConvertStrategy.cs create mode 100644 DataAccess/DTOs/DTOEntities/BeamShears/StirrupByInclinedRebarDTO.cs create mode 100644 DataAccess/DTOs/DTOEntities/BeamShears/StirrupGroupDTO.cs create mode 100644 DataAccess/DTOs/DTOEntities/Materials/RebarSectionDTO.cs create mode 100644 StructureHelperCommon/Services/IInterpolateValueLogic.cs create mode 100644 StructureHelperCommon/Services/InterpolateValueLogic.cs diff --git a/DataAccess/DTOs/Converters/BeamShears/HasStirrupsToDTOUpdateStrategy.cs b/DataAccess/DTOs/Converters/BeamShears/HasStirrupsToDTOUpdateStrategy.cs index 6286cc0..6b8c90f 100644 --- a/DataAccess/DTOs/Converters/BeamShears/HasStirrupsToDTOUpdateStrategy.cs +++ b/DataAccess/DTOs/Converters/BeamShears/HasStirrupsToDTOUpdateStrategy.cs @@ -47,6 +47,14 @@ namespace DataAccess.DTOs { newItem = ProcessRebar(rebar); } + else if (stirrup is IStirrupGroup group) + { + newItem = ProcessGroup(group); + } + else if (stirrup is IStirrupByInclinedRebar inclinatedRebar) + { + newItem = ProcessInclinatedRebar(inclinatedRebar); + } else if (stirrup is IStirrupByDensity density) { newItem = ProcessDensity(density); @@ -55,10 +63,19 @@ namespace DataAccess.DTOs { throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(stirrup)); } - return newItem; } + private IStirrup ProcessInclinatedRebar(IStirrupByInclinedRebar inclinatedRebar) + { + throw new NotImplementedException(); + } + + private IStirrup ProcessGroup(IStirrupGroup group) + { + throw new NotImplementedException(); + } + private IStirrup ProcessDensity(IStirrupByDensity density) { traceLogger?.AddMessage("Stirrup is stirrup by density"); diff --git a/DataAccess/DTOs/Converters/BeamShears/StirrupGroupToDTOConvertStrategy.cs b/DataAccess/DTOs/Converters/BeamShears/StirrupGroupToDTOConvertStrategy.cs new file mode 100644 index 0000000..57fad2e --- /dev/null +++ b/DataAccess/DTOs/Converters/BeamShears/StirrupGroupToDTOConvertStrategy.cs @@ -0,0 +1,19 @@ +using StructureHelperCommon.Infrastructures.Interfaces; +using StructureHelperLogics.Models.BeamShears; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DataAccess.DTOs +{ + internal class StirrupGroupToDTOConvertStrategy : ConvertStrategy + { + + public override StirrupGroupDTO GetNewItem(IStirrupGroup source) + { + throw new NotImplementedException(); + } + } +} diff --git a/DataAccess/DTOs/DTOEntities/BeamShears/StirrupByInclinedRebarDTO.cs b/DataAccess/DTOs/DTOEntities/BeamShears/StirrupByInclinedRebarDTO.cs new file mode 100644 index 0000000..aa846d0 --- /dev/null +++ b/DataAccess/DTOs/DTOEntities/BeamShears/StirrupByInclinedRebarDTO.cs @@ -0,0 +1,37 @@ +using Newtonsoft.Json; +using StructureHelperLogics.Models.BeamShears; +using StructureHelperLogics.Models.Materials; + +namespace DataAccess.DTOs +{ + public class StirrupByInclinedRebarDTO : IStirrupByInclinedRebar + { + [JsonProperty("Id")] + public Guid Id { get; } + [JsonProperty("Name")] + public string? Name { get; set; } + [JsonProperty("CompressedGap")] + public double CompressedGap { get; set; } + [JsonProperty("StartCoordinate")] + public double StartCoordinate { get; set; } + [JsonProperty("TransferLength")] + public double TransferLength { get; set; } + [JsonProperty("AngleOfInclination")] + public double AngleOfInclination { get; set; } + [JsonProperty("LegCount")] + public double LegCount { get; set; } + [JsonProperty("RebarSection")] + public IRebarSection RebarSection { get; set; } + + + public StirrupByInclinedRebarDTO(Guid id) + { + Id = id; + } + + public object Clone() + { + return this; + } + } +} diff --git a/DataAccess/DTOs/DTOEntities/BeamShears/StirrupGroupDTO.cs b/DataAccess/DTOs/DTOEntities/BeamShears/StirrupGroupDTO.cs new file mode 100644 index 0000000..dba7c39 --- /dev/null +++ b/DataAccess/DTOs/DTOEntities/BeamShears/StirrupGroupDTO.cs @@ -0,0 +1,27 @@ +using Newtonsoft.Json; +using StructureHelperLogics.Models.BeamShears; + +namespace DataAccess.DTOs +{ + public class StirrupGroupDTO : IStirrupGroup + { + [JsonProperty("Id")] + public Guid Id { get; } + [JsonProperty("Name")] + public string? Name { get; set; } + [JsonProperty("CompressedGap")] + public double CompressedGap { get; set; } + [JsonProperty("Stirrups")] + public List Stirrups { get; } = new(); + public StirrupGroupDTO(Guid id) + { + Id = id; + } + + + public object Clone() + { + throw new NotImplementedException(); + } + } +} diff --git a/DataAccess/DTOs/DTOEntities/Materials/RebarSectionDTO.cs b/DataAccess/DTOs/DTOEntities/Materials/RebarSectionDTO.cs new file mode 100644 index 0000000..6df0a81 --- /dev/null +++ b/DataAccess/DTOs/DTOEntities/Materials/RebarSectionDTO.cs @@ -0,0 +1,26 @@ +using Newtonsoft.Json; +using StructureHelperLogics.Models.Materials; + +namespace DataAccess.DTOs +{ + public class RebarSectionDTO : IRebarSection + { + [JsonProperty("Id")] + public Guid Id { get; } + [JsonProperty("Material")] + public IReinforcementLibMaterial Material { get; set; } + [JsonProperty("Diameter")] + public double Diameter { get; set; } + + + public RebarSectionDTO(Guid id) + { + Id = id; + } + + public object Clone() + { + throw new NotImplementedException(); + } + } +} diff --git a/StructureHelper/Windows/BeamShears/StirrupByInclinedRebarViewModel.cs b/StructureHelper/Windows/BeamShears/StirrupByInclinedRebarViewModel.cs index 16fc41b..e30a67b 100644 --- a/StructureHelper/Windows/BeamShears/StirrupByInclinedRebarViewModel.cs +++ b/StructureHelper/Windows/BeamShears/StirrupByInclinedRebarViewModel.cs @@ -6,6 +6,7 @@ namespace StructureHelper.Windows.BeamShears { public class StirrupByInclinedRebarViewModel : OkCancelViewModelBase { + private const double minTransferLengthValue = 0.01; private readonly IStirrupByInclinedRebar stirrupByInclinedRebar; @@ -49,13 +50,14 @@ namespace StructureHelper.Windows.BeamShears } } - public double OffSet + public double TransferLength { - get => stirrupByInclinedRebar.OffSet; + get => stirrupByInclinedRebar.TransferLength; set { - stirrupByInclinedRebar.OffSet = value; - OnPropertyChanged(nameof(OffSet)); + if (value < minTransferLengthValue) { value = minTransferLengthValue; } + stirrupByInclinedRebar.TransferLength = value; + OnPropertyChanged(nameof(TransferLength)); } } diff --git a/StructureHelper/Windows/BeamShears/StirrupByInclinedReebarView.xaml b/StructureHelper/Windows/BeamShears/StirrupByInclinedReebarView.xaml index 6196c1a..d21756d 100644 --- a/StructureHelper/Windows/BeamShears/StirrupByInclinedReebarView.xaml +++ b/StructureHelper/Windows/BeamShears/StirrupByInclinedReebarView.xaml @@ -46,8 +46,8 @@ - - + + diff --git a/StructureHelperCommon/Services/IInterpolateValueLogic.cs b/StructureHelperCommon/Services/IInterpolateValueLogic.cs new file mode 100644 index 0000000..e09c045 --- /dev/null +++ b/StructureHelperCommon/Services/IInterpolateValueLogic.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StructureHelperCommon.Services +{ + public interface IInterpolateValueLogic + { + double X1 { get; set; } + double Y1 { get; set; } + double X2 { get; set; } + double Y2 { get; set; } + double KnownValueX { get; set; } + double GetValueY(); + } +} diff --git a/StructureHelperCommon/Services/InterpolateValueLogic.cs b/StructureHelperCommon/Services/InterpolateValueLogic.cs new file mode 100644 index 0000000..bdcb3c3 --- /dev/null +++ b/StructureHelperCommon/Services/InterpolateValueLogic.cs @@ -0,0 +1,34 @@ +using StructureHelperCommon.Infrastructures.Exceptions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace StructureHelperCommon.Services +{ + public class InterpolateValueLogic : IInterpolateValueLogic + { + public double X1 { get; set; } + public double Y1 { get; set; } + public double X2 { get; set; } + public double Y2 { get; set; } + public double KnownValueX { get; set; } + + public double GetValueY() + { + Check(); + double tangent = (Y2-Y1) / (X2-X1); + double value = Y1 + (tangent * (KnownValueX - X1)); + return value; + } + + private void Check() + { + if (X1 == X2) + { + throw new StructureHelperException(ErrorStrings.DataIsInCorrect + $": Value X1 = {X1} must be inequal to value X2, but it was"); + } + } + } +} diff --git a/StructureHelperLogics/Models/BeamShears/IStirrupByInclinedRebar.cs b/StructureHelperLogics/Models/BeamShears/IStirrupByInclinedRebar.cs index 652b395..b7371c0 100644 --- a/StructureHelperLogics/Models/BeamShears/IStirrupByInclinedRebar.cs +++ b/StructureHelperLogics/Models/BeamShears/IStirrupByInclinedRebar.cs @@ -19,7 +19,7 @@ namespace StructureHelperLogics.Models.BeamShears /// /// Distance beetwen start/end point and point where rebar work is started /// - double OffSet { get; set; } + double TransferLength { get; set; } /// /// Angle of inclination of rebar in degrees /// diff --git a/StructureHelperLogics/Models/BeamShears/Logics/StirrupByInclinedRebarStrengthLogic.cs b/StructureHelperLogics/Models/BeamShears/Logics/StirrupByInclinedRebarStrengthLogic.cs index ae78f0a..28fd1e3 100644 --- a/StructureHelperLogics/Models/BeamShears/Logics/StirrupByInclinedRebarStrengthLogic.cs +++ b/StructureHelperLogics/Models/BeamShears/Logics/StirrupByInclinedRebarStrengthLogic.cs @@ -1,6 +1,8 @@ using StructureHelperCommon.Infrastructures.Enums; using StructureHelperCommon.Models; +using StructureHelperCommon.Services; using StructureHelperLogics.Models.Materials; +using StructureHelperLogics.NdmCalculations.Analyses.ByForces.Logics; using System; using System.Collections.Generic; using System.Linq; @@ -20,6 +22,7 @@ namespace StructureHelperLogics.Models.BeamShears private double rebarEndPoint; private double rebarTrueStartPoint; private double rebarTrueEndPoint; + private IInterpolateValueLogic interpolationLogic; public IShiftTraceLogger? TraceLogger { get; set; } @@ -34,19 +37,55 @@ namespace StructureHelperLogics.Models.BeamShears public double GetShearStrength() { GetGeometry(); - if (inclinedSection.StartCoord > rebarTrueEndPoint) + if (inclinedSection.StartCoord > rebarEndPoint) { - TraceLogger?.AddMessage($"Inclined section start point coordinate X = {inclinedSection.StartCoord} is greater than inclined rebar true end point x = {rebarTrueEndPoint}, inclined rebar has been ignored"); + TraceLogger?.AddMessage($"Inclined section start point coordinate X = {inclinedSection.StartCoord} is greater than inclined rebar end point x = {rebarEndPoint}, inclined rebar has been ignored"); return 0.0; } - if (inclinedSection.EndCoord < rebarTrueStartPoint) + if (inclinedSection.EndCoord < rebarStartPoint) { - TraceLogger?.AddMessage($"Inclined section end point coordinate X = {inclinedSection.EndCoord} is less than inclined rebar true end point x = {rebarTrueStartPoint}, inclined rebar has been ignored"); + TraceLogger?.AddMessage($"Inclined section end point coordinate X = {inclinedSection.EndCoord} is less than inclined rebar start point x = {rebarStartPoint}, inclined rebar has been ignored"); return 0.0; } + if (inclinedSection.StartCoord > rebarTrueEndPoint & inclinedSection.StartCoord < rebarEndPoint) + { + TraceLogger?.AddMessage($"Inclined section start point coordinate X = {inclinedSection.StartCoord} is in end transfer zone"); + return GetEndTransferValue(); + } + if (inclinedSection.EndCoord > rebarStartPoint & inclinedSection.EndCoord < rebarTrueStartPoint) + { + TraceLogger?.AddMessage($"Inclined section end point coordinate X = {inclinedSection.EndCoord} is in start transfer zone"); + return GetStartTransferValue(); + } return GetInclinedRebarStrength(); } + private double GetStartTransferValue() + { + interpolationLogic = new InterpolateValueLogic() + { + X1 = rebarStartPoint, + X2 = rebarTrueStartPoint, + Y1 = 0.0, + Y2 = GetInclinedRebarStrength(), + KnownValueX = inclinedSection.EndCoord + }; + return interpolationLogic.GetValueY(); + } + + private double GetEndTransferValue() + { + interpolationLogic = new InterpolateValueLogic() + { + X1 = rebarTrueEndPoint, + X2 = rebarEndPoint, + Y1 = GetInclinedRebarStrength(), + Y2 = 0.0, + KnownValueX = inclinedSection.StartCoord + }; + return interpolationLogic.GetValueY(); + } + private double GetInclinedRebarStrength() { rebarSectionStrengthLogic ??= new RebarSectionStrengthLogic() @@ -67,12 +106,13 @@ namespace StructureHelperLogics.Models.BeamShears private void GetGeometry() { + double transferLength = Math.Max(inclinedRebar.TransferLength, 0.01); angleInRad = inclinedRebar.AngleOfInclination / 180 * Math.PI; rebarStartPoint = inclinedRebar.StartCoordinate; rebarHeight = inclinedSection.EffectiveDepth - inclinedRebar.CompressedGap; - rebarEndPoint = rebarStartPoint + rebarHeight * Math.Cos(angleInRad); - rebarTrueStartPoint = rebarStartPoint + inclinedRebar.OffSet; - rebarTrueEndPoint = rebarEndPoint - inclinedRebar.OffSet; + rebarEndPoint = rebarStartPoint + rebarHeight / Math.Tan(angleInRad); + rebarTrueStartPoint = rebarStartPoint + transferLength; + rebarTrueEndPoint = rebarEndPoint - transferLength; } } } diff --git a/StructureHelperLogics/Models/BeamShears/Logics/UpdateLogics/StirrupByInclinedRebarUpdateStrategy.cs b/StructureHelperLogics/Models/BeamShears/Logics/UpdateLogics/StirrupByInclinedRebarUpdateStrategy.cs index bd350e2..1a4685d 100644 --- a/StructureHelperLogics/Models/BeamShears/Logics/UpdateLogics/StirrupByInclinedRebarUpdateStrategy.cs +++ b/StructureHelperLogics/Models/BeamShears/Logics/UpdateLogics/StirrupByInclinedRebarUpdateStrategy.cs @@ -17,7 +17,7 @@ namespace StructureHelperLogics.Models.BeamShears baseUpdateStrategy ??= new StirrupBaseUpdateStrategy(); baseUpdateStrategy.Update(targetObject, sourceObject); targetObject.StartCoordinate = sourceObject.StartCoordinate; - targetObject.OffSet = sourceObject.OffSet; + targetObject.TransferLength = sourceObject.TransferLength; targetObject.AngleOfInclination = sourceObject.AngleOfInclination; targetObject.LegCount = sourceObject.LegCount; CheckObject.IsNull(sourceObject.RebarSection, "Rebar section"); diff --git a/StructureHelperLogics/Models/BeamShears/StirrupByInclinedRebar.cs b/StructureHelperLogics/Models/BeamShears/StirrupByInclinedRebar.cs index d9faf3a..fab743c 100644 --- a/StructureHelperLogics/Models/BeamShears/StirrupByInclinedRebar.cs +++ b/StructureHelperLogics/Models/BeamShears/StirrupByInclinedRebar.cs @@ -46,7 +46,7 @@ namespace StructureHelperLogics.Models.BeamShears } } /// - public double OffSet { get; set; } = 0.05; + public double TransferLength { get; set; } = 0.05; /// public double AngleOfInclination {