Add beam shear calculator view
This commit is contained in:
@@ -11,8 +11,8 @@ namespace StructureHelperLogics.Models.BeamShears
|
||||
CheckObject.IsNull(sourceObject, ErrorStrings.SourceObject);
|
||||
CheckObject.IsNull(targetObject, ErrorStrings.TargetObject);
|
||||
if (ReferenceEquals(targetObject, sourceObject)) { return; };
|
||||
targetObject.BeamShearActions.AddRange(sourceObject.BeamShearActions);
|
||||
targetObject.ShearSections.AddRange(sourceObject.ShearSections);
|
||||
targetObject.Actions.AddRange(sourceObject.Actions);
|
||||
targetObject.Sections.AddRange(sourceObject.Sections);
|
||||
targetObject.Stirrups.AddRange(sourceObject.Stirrups);
|
||||
targetObject.Calculators.AddRange(sourceObject.Calculators);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
using StructureHelperCommon.Models.Forces;
|
||||
using StructureHelperCommon.Models.Forces.BeamShearActions;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.Models.BeamShears
|
||||
{
|
||||
public static class BeamShearRepositoryService
|
||||
{
|
||||
public static void DeleteAction(IBeamShearRepository repository, IBeamShearAction action)
|
||||
{
|
||||
foreach (var calculator in repository.Calculators)
|
||||
{
|
||||
if (calculator is IBeamShearCalculator beamShearCalculator)
|
||||
{
|
||||
var inputData = beamShearCalculator.InputData;
|
||||
inputData.Actions.Remove(action);
|
||||
}
|
||||
}
|
||||
repository.Actions.Remove(action);
|
||||
}
|
||||
public static void DeleteSection(IBeamShearRepository repository, IBeamShearSection section)
|
||||
{
|
||||
foreach (var calculator in repository.Calculators)
|
||||
{
|
||||
if (calculator is IBeamShearCalculator beamShearCalculator)
|
||||
{
|
||||
if (beamShearCalculator.InputData.Sections.Contains(section))
|
||||
{
|
||||
beamShearCalculator.InputData.Sections.Remove(section);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
public static void DeleteStirrup(IBeamShearRepository repository, IStirrup stirrup)
|
||||
{
|
||||
foreach (var calculator in repository.Calculators)
|
||||
{
|
||||
if (calculator is IBeamShearCalculator beamShearCalculator)
|
||||
{
|
||||
if (beamShearCalculator.InputData.Stirrups.Contains(stirrup))
|
||||
{
|
||||
beamShearCalculator.InputData.Stirrups.Remove(stirrup);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
using StructureHelperCommon.Infrastructures.Interfaces;
|
||||
using StructureHelperCommon.Models.Shapes;
|
||||
using StructureHelperCommon.Models.Shapes.Logics;
|
||||
using StructureHelperCommon.Services;
|
||||
using StructureHelperLogics.Models.Materials;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.Models.BeamShears
|
||||
{
|
||||
public class BeamShearSectionUpdateStrategy : IUpdateStrategy<IBeamShearSection>
|
||||
{
|
||||
private IUpdateStrategy<IShape> shapeUpdateStrategy;
|
||||
private IUpdateStrategy<IConcreteLibMaterial> concreteUpdateStrategy;
|
||||
public void Update(IBeamShearSection targetObject, IBeamShearSection sourceObject)
|
||||
{
|
||||
CheckObject.IsNull(targetObject);
|
||||
CheckObject.IsNull(sourceObject);
|
||||
if (ReferenceEquals(targetObject, sourceObject)) { return; }
|
||||
InitializeStrategies();
|
||||
targetObject.Name = sourceObject.Name;
|
||||
shapeUpdateStrategy.Update(targetObject.Shape, sourceObject.Shape);
|
||||
targetObject.Material ??= new ConcreteLibMaterial();
|
||||
concreteUpdateStrategy.Update(targetObject.Material, sourceObject.Material);
|
||||
targetObject.CenterCover = sourceObject.CenterCover;
|
||||
}
|
||||
|
||||
private void InitializeStrategies()
|
||||
{
|
||||
shapeUpdateStrategy ??= new ShapeUpdateStrategy();
|
||||
concreteUpdateStrategy ??= new ConcreteLibUpdateStrategy();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
using StructureHelperCommon.Models;
|
||||
using StructureHelperCommon.Models.Loggers;
|
||||
using StructureHelperCommon.Services;
|
||||
|
||||
//Copyright (c) 2025 Redikultsev Evgeny, Ekaterinburg, Russia
|
||||
//All rights reserved.
|
||||
|
||||
namespace StructureHelperLogics.Models.BeamShears
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public class BeamShearStrengthByStirrupDensityLogic : IBeamShearStrenghLogic
|
||||
{
|
||||
private readonly IStirrupEffectiveness stirrupEffectiveness;
|
||||
private readonly IStirrupByDensity stirrupByDensity;
|
||||
private readonly IInclinedSection inclinedSection;
|
||||
|
||||
|
||||
public BeamShearStrengthByStirrupDensityLogic(
|
||||
IStirrupEffectiveness stirrupEffectiveness,
|
||||
IStirrupByDensity stirrupByDensity,
|
||||
IInclinedSection inclinedSection,
|
||||
IShiftTraceLogger? traceLogger)
|
||||
{
|
||||
this.stirrupEffectiveness = stirrupEffectiveness;
|
||||
this.stirrupByDensity = stirrupByDensity;
|
||||
this.inclinedSection = inclinedSection;
|
||||
TraceLogger = traceLogger;
|
||||
}
|
||||
|
||||
public IShiftTraceLogger? TraceLogger { get; set; }
|
||||
/// <inheritdoc/>
|
||||
public double GetShearStrength()
|
||||
{
|
||||
Check();
|
||||
TraceLogger?.AddMessage(LoggerStrings.LogicType(this), TraceLogStatuses.Service);
|
||||
TraceLogger?.AddMessage("Calculation has been started", TraceLogStatuses.Debug);
|
||||
double crackLength = inclinedSection.EndCoord - inclinedSection.StartCoord;
|
||||
TraceLogger?.AddMessage($"Length of crack = {inclinedSection.EndCoord} - {inclinedSection.StartCoord} = {crackLength}(m)");
|
||||
double maxCrackLength = stirrupEffectiveness.MaxCrackLengthRatio * inclinedSection.EffectiveDepth;
|
||||
TraceLogger?.AddMessage($"Max length of crack = {stirrupEffectiveness.MaxCrackLengthRatio} * {inclinedSection.EffectiveDepth} = {maxCrackLength}(m)");
|
||||
double finalCrackLength = Math.Min(crackLength, maxCrackLength);
|
||||
TraceLogger?.AddMessage($"Length of crack = Min({crackLength}, {maxCrackLength}) = {finalCrackLength}(m)");
|
||||
double strength = stirrupEffectiveness.StirrupShapeFactor * stirrupEffectiveness.StirrupPlacementFactor * finalCrackLength * stirrupByDensity.StirrupDensity;
|
||||
TraceLogger?.AddMessage($"Bearing capacity of stirrups V = {stirrupEffectiveness.StirrupShapeFactor} * {stirrupEffectiveness.StirrupPlacementFactor} * {finalCrackLength} * {stirrupByDensity.StirrupDensity} = {strength}(N)");
|
||||
TraceLogger?.AddMessage("Calculation has been finished successfully", TraceLogStatuses.Debug);
|
||||
return strength;
|
||||
}
|
||||
|
||||
private void Check()
|
||||
{
|
||||
CheckObject.IsNull(stirrupByDensity);
|
||||
CheckObject.IsNull(inclinedSection);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -34,13 +34,13 @@ namespace StructureHelperLogics.Models.BeamShears
|
||||
string errorString = ErrorStrings.ParameterIsNull + ": Input data";
|
||||
throw new StructureHelperException(errorString);
|
||||
}
|
||||
if (InputData.BeamShearActions is null || ! InputData.BeamShearActions.Any())
|
||||
if (InputData.Actions is null || ! InputData.Actions.Any())
|
||||
{
|
||||
result = false;
|
||||
string errorString = "Collection of actions does not contain any action";
|
||||
TraceMessage(errorString);
|
||||
}
|
||||
if (InputData.ShearSections is null || ! InputData.ShearSections.Any())
|
||||
if (InputData.Sections is null || ! InputData.Sections.Any())
|
||||
{
|
||||
result = false;
|
||||
string errorString = "Collection of sections does not contain any section";
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
using StructureHelperCommon.Infrastructures.Interfaces;
|
||||
using StructureHelperCommon.Services;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.Models.BeamShears.Logics
|
||||
namespace StructureHelperLogics.Models.BeamShears
|
||||
{
|
||||
public class StirrupBaseUpdateStrategy : IUpdateStrategy<IStirrup>
|
||||
{
|
||||
|
||||
@@ -4,7 +4,7 @@ using StructureHelperCommon.Services;
|
||||
//Copyright (c) 2026 Redikultsev Evgeny, Ekaterinburg, Russia
|
||||
//All rights reserved.
|
||||
|
||||
namespace StructureHelperLogics.Models.BeamShears.Logics
|
||||
namespace StructureHelperLogics.Models.BeamShears
|
||||
{
|
||||
public class StirrupByDensityUpdateStrategy : IUpdateStrategy<IStirrupByDensity>
|
||||
{
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
using StructureHelperCommon.Infrastructures.Enums;
|
||||
using StructureHelperCommon.Infrastructures.Interfaces;
|
||||
using StructureHelperCommon.Models;
|
||||
|
||||
namespace StructureHelperLogics.Models.BeamShears
|
||||
{
|
||||
public class StirrupByRebarToDensityConvertStrategy : IConvertStrategy<IStirrupByDensity, IStirrupByRebar>
|
||||
{
|
||||
private const double stirrupStrengthFactor = 1d;
|
||||
private const double maxStirrupStrength = 3e8;
|
||||
|
||||
private IUpdateStrategy<IStirrup> updateStrategy;
|
||||
public Dictionary<(Guid id, Type type), ISaveable> ReferenceDictionary { get; set; }
|
||||
public IShiftTraceLogger TraceLogger { get; set; }
|
||||
|
||||
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);
|
||||
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 strength = stirrupStrengthFactor * source.Material.GetStrength(LimitStates.ULS, CalcTerms.ShortTerm).Tensile;
|
||||
TraceLogger?.AddMessage($"Strength of rebar = {strength}, Pa");
|
||||
strength = Math.Min(strength, maxStirrupStrength);
|
||||
double density = strength * area * source.LegCount / source.Spacing;
|
||||
TraceLogger?.AddMessage($"Density of stirrups = {strength} * {area} * {source.LegCount} / {source.Spacing} = {density}, N/m");
|
||||
return density;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,12 +7,12 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace StructureHelperLogics.Models.BeamShears.Logics
|
||||
namespace StructureHelperLogics.Models.BeamShears
|
||||
{
|
||||
public class StirrupByUniformRebarUpdateStrategy : IUpdateStrategy<IStirrupByUniformRebar>
|
||||
public class StirrupByRebarUpdateStrategy : IUpdateStrategy<IStirrupByRebar>
|
||||
{
|
||||
private IUpdateStrategy<IStirrup>? baseUpdateStrategy;
|
||||
public void Update(IStirrupByUniformRebar targetObject, IStirrupByUniformRebar sourceObject)
|
||||
public void Update(IStirrupByRebar targetObject, IStirrupByRebar sourceObject)
|
||||
{
|
||||
CheckObject.IsNull(targetObject);
|
||||
CheckObject.IsNull(sourceObject);
|
||||
@@ -23,7 +23,7 @@ namespace StructureHelperLogics.Models.BeamShears.Logics
|
||||
targetObject.Material = sourceObject.Material.Clone() as IReinforcementLibMaterial;
|
||||
targetObject.Diameter = sourceObject.Diameter;
|
||||
targetObject.LegCount = sourceObject.LegCount;
|
||||
targetObject.Step = sourceObject.Step;
|
||||
targetObject.Spacing = sourceObject.Spacing;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ namespace StructureHelperLogics.Models.BeamShears.Logics
|
||||
public class StirrupUpdateStrategy : IUpdateStrategy<IStirrup>
|
||||
{
|
||||
private IUpdateStrategy<IStirrupByDensity> densityUpdateStrategy;
|
||||
private IUpdateStrategy<IStirrupByUniformRebar> uniformUpdateStrategy;
|
||||
private IUpdateStrategy<IStirrupByRebar> uniformUpdateStrategy;
|
||||
public void Update(IStirrup targetObject, IStirrup sourceObject)
|
||||
{
|
||||
CheckObject.IsNull(targetObject);
|
||||
@@ -22,7 +22,7 @@ namespace StructureHelperLogics.Models.BeamShears.Logics
|
||||
{
|
||||
UpdateByDensity(targetObject, density);
|
||||
}
|
||||
else if (sourceObject is IStirrupByUniformRebar stirrupByUniformRebar)
|
||||
else if (sourceObject is IStirrupByRebar stirrupByUniformRebar)
|
||||
{
|
||||
UpdateByUniformRebar(targetObject, stirrupByUniformRebar);
|
||||
}
|
||||
@@ -32,10 +32,10 @@ namespace StructureHelperLogics.Models.BeamShears.Logics
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateByUniformRebar(IStirrup targetObject, IStirrupByUniformRebar stirrupByUniformRebar)
|
||||
private void UpdateByUniformRebar(IStirrup targetObject, IStirrupByRebar stirrupByUniformRebar)
|
||||
{
|
||||
uniformUpdateStrategy ??= new StirrupByUniformRebarUpdateStrategy();
|
||||
if (targetObject is IStirrupByUniformRebar targetUniformRebar)
|
||||
uniformUpdateStrategy ??= new StirrupByRebarUpdateStrategy();
|
||||
if (targetObject is IStirrupByRebar targetUniformRebar)
|
||||
{
|
||||
uniformUpdateStrategy.Update(targetUniformRebar, stirrupByUniformRebar);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user