111 lines
3.7 KiB
C#
111 lines
3.7 KiB
C#
using LoaderCalculator.Data.Materials;
|
|
using LoaderCalculator.Logics;
|
|
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
|
|
{
|
|
GetCaclculator();
|
|
}
|
|
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 void GetCaclculator()
|
|
{
|
|
if (InputData.ConsiderSofteningFactor == false)
|
|
{
|
|
calculator = new CurvatureTermUncrackedCalculator(TraceLogger) { InputData = InputData };
|
|
return;
|
|
}
|
|
if (IsSectionCracked(InputData.ForcePair.FullForceTuple, CalcTerms.ShortTerm) || IsSectionCracked(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 };
|
|
}
|
|
}
|
|
|
|
private bool IsSectionCracked(IForceTuple forceTuple, CalcTerms calcTerm)
|
|
{
|
|
var triangulateLogic = new TriangulatePrimitiveLogic()
|
|
{
|
|
Primitives = InputData.Primitives,
|
|
LimitState = LimitStates.SLS,
|
|
CalcTerm = calcTerm,
|
|
TraceLogger = TraceLogger
|
|
};
|
|
var ndms = triangulateLogic.GetNdms();
|
|
if (!ndms.Where(x => x.Material is ICrackMaterial).Any())
|
|
{
|
|
return false;
|
|
}
|
|
var logic = new IsSectionCrackedByForceLogic()
|
|
{
|
|
ForceTuple = forceTuple,
|
|
CheckedNdmCollection = ndms,
|
|
SectionNdmCollection = ndms
|
|
};
|
|
return logic.IsSectionCracked();
|
|
}
|
|
|
|
private void PrepareResult()
|
|
{
|
|
result = new()
|
|
{
|
|
InputData = InputData,
|
|
};
|
|
}
|
|
}
|
|
}
|