Change inclined section viewer

This commit is contained in:
RedikultsevEvg
2025-08-22 19:56:29 +05:00
parent a05138fa8a
commit b38c19f7bb
26 changed files with 363 additions and 136 deletions

View File

@@ -0,0 +1,74 @@
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Loggers;
using StructureHelperCommon.Services.Units;
using StructureHelperLogics.Models.BeamShears.Logics;
namespace StructureHelperLogics.Models.BeamShears
{
public class ConcreteShearStrengthLogic : IBeamShearStrengthLogic
{
private readonly ISectionEffectiveness sectionEffectiveness;
private readonly IInclinedSection inclinedSection;
public IShiftTraceLogger? TraceLogger { get; set; }
public ConcreteShearStrengthLogic(
ISectionEffectiveness sectionEffectiveness,
IInclinedSection inclinedSection,
IShiftTraceLogger? traceLogger = null)
{
this.sectionEffectiveness = sectionEffectiveness ?? throw new StructureHelperException("Section effectiveness cannot be null.");
this.inclinedSection = inclinedSection ?? throw new StructureHelperException("Inclined section cannot be null.");
TraceLogger = traceLogger;
}
public double CalculateShearStrength()
{
TraceLogger?.AddMessage(LoggerStrings.LogicType(this), TraceLogStatuses.Service);
ValidateInput();
double rawCrackLength = inclinedSection.EndCoord - inclinedSection.StartCoord;
double crackLength = RestrictCrackLength(rawCrackLength);
double concreteMoment = CalculateConcreteMoment();
double shearStrength = concreteMoment / crackLength;
TraceLogger?.AddMessage($"Shear strength = {concreteMoment} / {crackLength} = {shearStrength} {UnitsOfSI.Newtons}");
return shearStrength;
}
private double CalculateConcreteMoment() =>
sectionEffectiveness.BaseShapeFactor
* sectionEffectiveness.ShapeFactor
* inclinedSection.ConcreteTensionStrength
* inclinedSection.WebWidth
* inclinedSection.EffectiveDepth
* inclinedSection.EffectiveDepth;
private double RestrictCrackLength(double length)
{
double max = sectionEffectiveness.MaxCrackLengthRatio * inclinedSection.EffectiveDepth;
double min = sectionEffectiveness.MinCrackLengthRatio * inclinedSection.EffectiveDepth;
if (length > max)
{
TraceLogger?.AddMessage($"Crack length reduced from {length} to {max}");
return max;
}
if (length < min)
{
TraceLogger?.AddMessage($"Crack length increased from {length} to {min}");
return min;
}
return length;
}
private void ValidateInput()
{
if (inclinedSection.EffectiveDepth <= 0)
throw new StructureHelperException("Effective depth must be greater than zero.");
}
}
}

View File

@@ -9,7 +9,7 @@ using StructureHelperLogics.Models.BeamShears.Logics;
namespace StructureHelperLogics.Models.BeamShears
{
/// <inheritdoc/>
public class StirrupByDensityStrengthLogic : IBeamShearStrenghLogic
public class StirrupByDensityStrengthLogic : IBeamShearStrengthLogic
{
private readonly IStirrupEffectiveness stirrupEffectiveness;
private readonly IStirrupByDensity stirrupByDensity;
@@ -30,7 +30,7 @@ namespace StructureHelperLogics.Models.BeamShears
public IShiftTraceLogger? TraceLogger { get; set; }
/// <inheritdoc/>
public double GetShearStrength()
public double CalculateShearStrength()
{
Check();
TraceLogger?.AddMessage(LoggerStrings.LogicType(this), TraceLogStatuses.Service);

View File

@@ -6,7 +6,7 @@ using StructureHelperLogics.Models.Materials;
namespace StructureHelperLogics.Models.BeamShears
{
public class StirrupByInclinedRebarStrengthLogic : IBeamShearStrenghLogic
public class StirrupByInclinedRebarStrengthLogic : IBeamShearStrengthLogic
{
const double stirrupEffectivenessFactor = 0.75;
private readonly IStirrupByInclinedRebar inclinedRebar;
@@ -47,7 +47,7 @@ namespace StructureHelperLogics.Models.BeamShears
TraceLogger = traceLogger;
}
public double GetShearStrength()
public double CalculateShearStrength()
{
GetGeometry();
if (inclinedSection.StartCoord > rebarEndPoint)

View File

@@ -7,14 +7,14 @@ using StructureHelperCommon.Models.Forces;
namespace StructureHelperLogics.Models.BeamShears
{
public class StirrupByRebarStrengthLogic : IBeamShearStrenghLogic
public class StirrupByRebarStrengthLogic : IBeamShearStrengthLogic
{
private IStirrupEffectiveness stirrupEffectiveness;
private IStirrupByRebar stirrupByRebar;
private IInclinedSection inclinedSection;
private readonly IForceTuple forceTuple;
private StirrupByDensityStrengthLogic stirrupDensityStrengthLogic;
private IConvertStrategy<IStirrupByDensity, IStirrupByRebar> convertStrategy;
private IObjectConvertStrategy<IStirrupByDensity, IStirrupByRebar> convertStrategy;
public IShiftTraceLogger? TraceLogger { get; set; }
public StirrupByRebarStrengthLogic(
@@ -23,7 +23,7 @@ namespace StructureHelperLogics.Models.BeamShears
IInclinedSection inclinedSection,
IForceTuple forceTuple,
StirrupByDensityStrengthLogic stirrupDensityStrengthLogic,
IConvertStrategy<IStirrupByDensity, IStirrupByRebar> convertStrategy,
IObjectConvertStrategy<IStirrupByDensity, IStirrupByRebar> convertStrategy,
IShiftTraceLogger? traceLogger)
{
this.stirrupEffectiveness = stirrupEffectiveness;
@@ -49,7 +49,7 @@ namespace StructureHelperLogics.Models.BeamShears
TraceLogger = traceLogger;
}
public double GetShearStrength()
public double CalculateShearStrength()
{
InitializeStrategies();
if (stirrupByRebar.EndCoordinate < inclinedSection.StartCoord)
@@ -76,7 +76,7 @@ namespace StructureHelperLogics.Models.BeamShears
TraceLogger?.AddMessage($"Stirrup spacing S = {stirrupByRebar.Spacing}(m) is greater than max stirrup spacing Smax = {maxStirrupSpacingByEffectibeDepth}(m), stirrups are ignored", TraceLogStatuses.Warning);
return 0;
}
double shearStrength = stirrupDensityStrengthLogic.GetShearStrength();
double shearStrength = stirrupDensityStrengthLogic.CalculateShearStrength();
return shearStrength;
}

View File

@@ -0,0 +1,84 @@
using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models;
namespace StructureHelperLogics.Models.BeamShears
{
public class StirrupByRebarToDensityConvertStrategy : IObjectConvertStrategy<IStirrupByDensity, IStirrupByRebar>
{
private const double stirrupStrengthFactor = 0.8d;
private const double maxStirrupStrength = 3e8;
private IInclinedSection inclinedSection;
private IUpdateStrategy<IStirrup> updateStrategy;
public IShiftTraceLogger TraceLogger { get; set; }
public StirrupByRebarToDensityConvertStrategy(IShiftTraceLogger traceLogger, IInclinedSection inclinedSection)
{
TraceLogger = traceLogger;
this.inclinedSection = inclinedSection;
}
public StirrupByRebarToDensityConvertStrategy(IUpdateStrategy<IStirrup> updateStrategy, IShiftTraceLogger traceLogger)
{
this.updateStrategy = updateStrategy;
TraceLogger = traceLogger;
}
public IStirrupByDensity Convert(IStirrupByRebar source)
{
updateStrategy ??= new StirrupBaseUpdateStrategy();
StirrupByDensity stirrupByDensity = new(Guid.NewGuid());
updateStrategy.Update(stirrupByDensity, source);
stirrupByDensity.StirrupDensity = GetStirrupDensity(source);
stirrupByDensity.StartCoordinate = source.StartCoordinate;
stirrupByDensity.EndCoordinate = source.EndCoordinate;
return stirrupByDensity;
}
private double GetStirrupDensity(IStirrupByRebar source)
{
double area = Math.PI * source.Diameter * source.Diameter / 4d;
TraceLogger?.AddMessage($"Area of rebar = {Math.PI} * ({source.Diameter})^2 / 4 = {area}(m^2)");
double minimizedStrength = GetRebarStrength(source);
double spiralEffectiveness = 1;
if (source.IsSpiral == true)
{
spiralEffectiveness = GetSpiralEffectiveness(source);
}
double density = minimizedStrength * area * source.LegCount / source.Spacing * spiralEffectiveness;
TraceLogger?.AddMessage($"Density of stirrups = {minimizedStrength} * {area} * {source.LegCount} / {source.Spacing} * {spiralEffectiveness} = {density}(N/m)");
return density;
}
private double GetRebarStrength(IStirrupByRebar source)
{
double materialStrength = source.Material.GetStrength(LimitStates.ULS, CalcTerms.ShortTerm).Tensile;
TraceLogger?.AddMessage($"Stirrup material strength Rsw = {materialStrength}");
double stirrupStrength = stirrupStrengthFactor * materialStrength;
TraceLogger?.AddMessage($"Strength of rebar Rsw = {stirrupStrengthFactor} * {materialStrength} = {stirrupStrength}(Pa)");
double minimizedStrength = Math.Min(stirrupStrength, maxStirrupStrength);
TraceLogger?.AddMessage($"Strength of rebar Rsw = Min({stirrupStrength}, {maxStirrupStrength})= {minimizedStrength}(Pa)");
return minimizedStrength;
}
private double GetSpiralEffectiveness(IStirrupByRebar source)
{
if (inclinedSection is null)
{
string errorString = ErrorStrings.ParameterIsNull + ": Inclined Section";
TraceLogger?.AddMessage(errorString, TraceLogStatuses.Error);
throw new StructureHelperException(errorString);
}
double spiralHeight = inclinedSection.EffectiveDepth - (inclinedSection.FullDepth - inclinedSection.EffectiveDepth);
TraceLogger?.AddMessage($"Spiral height = {spiralHeight}(m)");
double spiralSpacing = source.Spacing;
TraceLogger?.AddMessage($"Spiral spacing = {spiralSpacing}(m)");
double spiralAng = Math.Atan2(spiralHeight, spiralSpacing);
double spriralEffectiveness = Math.Sin(spiralAng);
double spiralAngInDegrees = 57.29578 * spiralAng; // 180/PI
TraceLogger?.AddMessage($"Spiral effectiveness factor = sin({spiralAngInDegrees}(deg)) = {spriralEffectiveness}");
return spriralEffectiveness;
}
}
}

View File

@@ -9,7 +9,7 @@ using System.Threading.Tasks;
namespace StructureHelperLogics.Models.BeamShears
{
internal class StirrupGroupStrengthLogic : IBeamShearStrenghLogic
internal class StirrupGroupStrengthLogic : IBeamShearStrengthLogic
{
private readonly IBeamShearSectionLogicInputData sourceInputData;
private IBeamShearSectionLogicInputData localInputData;
@@ -25,7 +25,7 @@ namespace StructureHelperLogics.Models.BeamShears
public IShiftTraceLogger? TraceLogger { get; set; }
public double GetShearStrength()
public double CalculateShearStrength()
{
Check();
if (!stirrupGroup.Stirrups.Any()) { return 0.0; }
@@ -35,7 +35,7 @@ namespace StructureHelperLogics.Models.BeamShears
{
localInputData.Stirrup = item;
var stirrupSrengthLogic = new StirrupStrengthLogic(localInputData, TraceLogger?.GetSimilarTraceLogger(50));
shearStrength += stirrupSrengthLogic.GetShearStrength();
shearStrength += stirrupSrengthLogic.CalculateShearStrength();
}
TraceLogger?.AddMessage($"Total bearing capacity of group {stirrupGroup.Name} for shear Vtot = {shearStrength}(N)");
return shearStrength;

View File

@@ -4,14 +4,14 @@ using StructureHelperCommon.Models.Shapes;
namespace StructureHelperLogics.Models.BeamShears
{
internal class StirrupStrengthLogic : IBeamShearStrenghLogic
internal class StirrupStrengthLogic : IBeamShearStrengthLogic
{
private readonly IBeamShearSectionLogicInputData inputData;
private IStirrup stirrup => inputData.Stirrup;
private IInclinedSection inclinedSection => inputData.InclinedCrack;
private IBeamShearStrenghLogic stirrupByDensityStrengthLogic;
private IBeamShearStrenghLogic stirrupGroupStrengthLogic;
private IBeamShearStrenghLogic stirrupByInclinedRebarStrengthLogic;
private IBeamShearStrengthLogic stirrupByDensityStrengthLogic;
private IBeamShearStrengthLogic stirrupGroupStrengthLogic;
private IBeamShearStrengthLogic stirrupByInclinedRebarStrengthLogic;
private IStirrupEffectiveness stirrupEffectiveness;
public StirrupStrengthLogic(IBeamShearSectionLogicInputData inputData, IShiftTraceLogger? traceLogger)
@@ -22,32 +22,32 @@ namespace StructureHelperLogics.Models.BeamShears
public IShiftTraceLogger? TraceLogger { get; set; }
public double GetShearStrength()
public double CalculateShearStrength()
{
GetStirrupEffectiveness();
if (stirrup is IStirrupByRebar stirrupByRebar)
{
TraceLogger?.AddMessage($"Stirrups type is stirrup by rebar Name = {stirrupByRebar.Name}");
stirrupByDensityStrengthLogic = new StirrupByRebarStrengthLogic(stirrupEffectiveness, stirrupByRebar, inclinedSection, inputData.ForceTuple, TraceLogger);
return stirrupByDensityStrengthLogic.GetShearStrength();
return stirrupByDensityStrengthLogic.CalculateShearStrength();
}
else if (stirrup is IStirrupGroup stirrupGroup)
{
TraceLogger?.AddMessage($"Stirrups type is stirrup group Name = {stirrupGroup.Name}");
stirrupGroupStrengthLogic ??= new StirrupGroupStrengthLogic(inputData, stirrupGroup, TraceLogger);
return stirrupGroupStrengthLogic.GetShearStrength();
return stirrupGroupStrengthLogic.CalculateShearStrength();
}
else if (stirrup is IStirrupByDensity stirrupByDensity)
{
TraceLogger?.AddMessage($"Stirrups type is stirrup by density Name = {stirrupByDensity.Name}");
stirrupByDensityStrengthLogic = new StirrupByDensityStrengthLogic(stirrupEffectiveness, stirrupByDensity, inclinedSection, TraceLogger);
return stirrupByDensityStrengthLogic.GetShearStrength();
return stirrupByDensityStrengthLogic.CalculateShearStrength();
}
else if (stirrup is IStirrupByInclinedRebar inclinedRebar)
{
TraceLogger?.AddMessage($"Stirrups type is inclined rebar Name = {inclinedRebar.Name}");
stirrupByInclinedRebarStrengthLogic ??= new StirrupByInclinedRebarStrengthLogic(inclinedSection, inclinedRebar, TraceLogger);
return stirrupByInclinedRebarStrengthLogic.GetShearStrength();
return stirrupByInclinedRebarStrengthLogic.CalculateShearStrength();
}
else
{