using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Models; using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Loggers; using StructureHelperLogics.Models.BeamShears.Logics; namespace StructureHelperLogics.Models.BeamShears { public class BeamShearSectionLogic : IBeamShearSectionLogic { private BeamShearSectionLogicResult result; private ISectionEffectiveness sectionEffectiveness; private ConcreteStrengthLogic concreteLogic; private StirrupStrengthLogic stirrupLogic; private IGetLongitudinalForceFactorLogic getLongitudinalForceFactorLogic; private string sectionMessage; private ICheckInputDataLogic checkInputDataLogic; private ShiftTraceLogger? localTraceLogger { get; set; } public IBeamShearSectionLogicInputData InputData { get; set; } public IShiftTraceLogger? TraceLogger { get; set; } public BeamShearSectionLogic(IShiftTraceLogger? traceLogger) { TraceLogger = traceLogger; } public IResult Result => result; public void Run() { TraceLogger?.AddMessage(LoggerStrings.LogicType(this), TraceLogStatuses.Service); sectionMessage = $"Inclined section: start xstart = {InputData.InclinedSection.StartCoord}(m), end xend = {InputData.InclinedSection.EndCoord}(m). "; PrepareNewResult(); if (Check() == false) { return; } localTraceLogger?.AddMessage(sectionMessage); InitializeStrategies(); try { CalculateResult(); } catch (Exception ex) { result.IsValid = false; result.Description += ex.Message; } } private bool Check() { bool checkResult = true; checkInputDataLogic ??= new CheckSectionLogicInputDataLogic(TraceLogger); checkInputDataLogic.InputData = InputData; if (checkInputDataLogic.Check() == false) { checkResult = false; result.IsValid = false; string errorMessage = checkInputDataLogic.CheckResult; result.Description += errorMessage; localTraceLogger?.AddMessage(errorMessage, TraceLogStatuses.Error); } return checkResult; } private void CalculateResult() { SetLongitudinalForce(); double factorOfLongitudinalForce = getLongitudinalForceFactorLogic.GetFactor(); localTraceLogger?.AddMessage($"Factor of longitudinal force = {factorOfLongitudinalForce}, (dimensionless)"); double concreteStrength = concreteLogic.GetShearStrength(); double stirrupStrength = stirrupLogic.GetShearStrength(); if (stirrupStrength > concreteStrength) { stirrupStrength = GetStirrupStrengthBySearch(); } concreteStrength *= factorOfLongitudinalForce; localTraceLogger?.AddMessage($"Concrete strength Qb = {concreteStrength}(N)"); result.ConcreteStrength = concreteStrength; stirrupStrength *= factorOfLongitudinalForce; localTraceLogger?.AddMessage($"Stirrup strength Qsw = {stirrupStrength}(N)"); result.StirrupStrength = stirrupStrength; double totalStrength = concreteStrength + stirrupStrength; localTraceLogger?.AddMessage($"Total strength = {concreteStrength} + {stirrupStrength} = {totalStrength}(N)"); result.TotalStrength = totalStrength; double actualShearForce = InputData.ForceTuple.Qy; if (actualShearForce > totalStrength) { result.IsValid = false; string message = $"Actual shear force Qa = {actualShearForce}(N), greater than bearing capacity Olim = {totalStrength}(N)"; result.Description += message; localTraceLogger?.AddMessage(message, TraceLogStatuses.Error); TraceLogger?.AddMessage(sectionMessage + message, TraceLogStatuses.Error); } else { string message = $"Actual shear force Qa = {actualShearForce}(N), not greater than bearing capacity Olim = {totalStrength}(N)"; localTraceLogger?.AddMessage(message); TraceLogger?.AddMessage(sectionMessage + message); } } private double GetStirrupStrengthBySearch() { var logic = new StirrupBySearchLogic(TraceLogger) { InputData = InputData, SectionEffectiveness = sectionEffectiveness }; double stirrupStrength = logic.GetShearStrength(); localTraceLogger?.AddMessage($"Stirrup strength was restricted as Qsw,restricted = {stirrupStrength}(N)"); return stirrupStrength; } private void InitializeStrategies() { sectionEffectiveness = SectionEffectivenessFactory.GetSheaEffectiveness(BeamShearSectionType.Rectangle); concreteLogic = new(sectionEffectiveness, InputData.InclinedSection, localTraceLogger); stirrupLogic = new(InputData, localTraceLogger); getLongitudinalForceFactorLogic = new GetLongitudinalForceFactorLogic(localTraceLogger?.GetSimilarTraceLogger(100)); } private void SetLongitudinalForce() { getLongitudinalForceFactorLogic.LongitudinalForce = InputData.ForceTuple.Nz; getLongitudinalForceFactorLogic.InclinedSection = InputData.InclinedSection; } private void PrepareNewResult() { localTraceLogger = new(); result = new(localTraceLogger) { IsValid = true, Description = string.Empty, InputData = InputData, }; } } }