Files
StructureHelper/StructureHelperLogics/NdmCalculations/Analyses/Curvatures/CurvatureForceCalculator.cs
2025-11-29 21:43:00 +05:00

95 lines
3.2 KiB
C#

using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Calculators;
using StructureHelperCommon.Models.Forces;
using StructureHelperLogics.NdmCalculations.Cracking;
using StructureHelperLogics.Services.NdmPrimitives;
namespace StructureHelperLogics.NdmCalculations.Analyses.Curvatures
{
public class CurvatureForceCalculator : ICurvatureForceCalculator
{
private CurvatureForceCalculatorResult result;
private ICurvatureTermCalculator calculator;
public CurvatureForceCalculator(IShiftTraceLogger? traceLogger)
{
TraceLogger = traceLogger;
}
public ICurvatureForceCalculatorInputData InputData { get; set; }
public IResult Result => result;
public IShiftTraceLogger? TraceLogger { get; set; }
public Guid Id => throw new NotImplementedException();
public object Clone()
{
throw new NotImplementedException();
}
public void Run()
{
TraceLogger?.AddMessage($"Calculator type: {GetType()}", TraceLogStatuses.Service);
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 };
}
}
catch (Exception ex)
{
result.IsValid = false;
result.Description += ex.Message;
result.Description += $"\n Check bearing capacity for action {InputData.ForcePair.Name}, probably section has been collapsed";
return;
}
calculator.Run();
var calcResult = calculator.Result as ICurvatureSectionResult;
if (calcResult.IsValid == false)
{
result.IsValid = false;
}
result.SectionResult = calcResult;
}
private bool CheckForCracks(IForceTuple forceTuple, CalcTerms calcTerm)
{
var triangulateLogic = new TriangulatePrimitiveLogic()
{
Primitives = InputData.Primitives,
LimitState = LimitStates.SLS,
CalcTerm = calcTerm,
TraceLogger = TraceLogger
};
var ndms = triangulateLogic.GetNdms();
var logic = new IsSectionCrackedByForceLogic()
{
ForceTuple = forceTuple,
CheckedNdmCollection = ndms,
SectionNdmCollection = ndms
};
return logic.IsSectionCracked();
}
private void PrepareResult()
{
result = new()
{
InputData = InputData,
};
}
}
}