Files
StructureHelper/StructureHelperLogics/NdmCalculations/Cracking/TupleRebarsCrackSolver.cs
2024-07-28 22:34:47 +05:00

97 lines
3.2 KiB
C#

using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Models;
using StructureHelperCommon.Models.Calculators;
using StructureHelperLogics.NdmCalculations.Primitives;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace StructureHelperLogics.NdmCalculations.Cracking
{
public class TupleRebarsCrackSolver : ITupleRebarsCrackSolver
{
private IRebarCalulatorsFactory calculatorsFactory;
public IEnumerable<RebarPrimitive> Rebars { get; set; }
public TupleCrackInputData InputData { get; set; }
public double LongLength { get; set; }
public double ShortLength { get; set; }
public IShiftTraceLogger? TraceLogger { get; set; }
public List<RebarCrackResult> Result { get; private set; }
public bool IsResultValid { get; private set; }
public string Description { get; private set; }
public TupleRebarsCrackSolver(IRebarCalulatorsFactory calulatorsFactory)
{
this.calculatorsFactory = calulatorsFactory;
}
public TupleRebarsCrackSolver() : this(new RebarCalulatorsFactory()) { }
public void Run()
{
Result = new List<RebarCrackResult>();
Description = string.Empty;
var rebarCalculators = GetRebarCalculators();
List<Task<RebarCrackResult>> tasks = new();
foreach (var calculator in rebarCalculators)
{
if (TraceLogger != null)
{
calculator.TraceLogger = new ShiftTraceLogger();
}
tasks.Add(new Task<RebarCrackResult>(() => ProcessCalculator(calculator)));
}
var taskArray = tasks.ToArray();
foreach (var task in taskArray)
{
task.Start();
}
Task.WaitAll(taskArray);
if (TraceLogger != null)
{
for (int i = 0; i < rebarCalculators.Count(); i++)
{
TraceLogger.TraceLoggerEntries.AddRange(rebarCalculators[i].TraceLogger.TraceLoggerEntries);
}
}
for (int i = 0; i < taskArray.Length; i++)
{
Result.Add(taskArray[i].Result);
}
if (Result.Any(x => x.IsValid == false))
{
IsResultValid = false;
Description += "\n There not valid results for rebar";
return;
}
IsResultValid = true;
}
private RebarCrackResult ProcessCalculator(IRebarCrackCalculator calculator)
{
calculator.Run();
var rebarResult = calculator.Result as RebarCrackResult;
return rebarResult;
}
private List<IRebarCrackCalculator> GetRebarCalculators()
{
calculatorsFactory.Rebars = Rebars;
calculatorsFactory.InputData = InputData;
calculatorsFactory.LongLength = LongLength;
calculatorsFactory.ShortLength = ShortLength;
calculatorsFactory.TraceLogger = TraceLogger?.GetSimilarTraceLogger(0);
return calculatorsFactory.GetCalculators();
}
}
}