Files
StructureHelper/StructureHelperCommon/Services/Forces/ForceActionService.cs
2025-11-29 21:43:00 +05:00

90 lines
4.1 KiB
C#

using StructureHelperCommon.Infrastructures.Enums;
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Models.Forces;
using StructureHelperCommon.Models.Shapes;
using System.Collections.Generic;
using System.Linq;
namespace StructureHelperCommon.Services.Forces
{
public static class ForceActionService
{
private static IForceTupleServiceLogic forceTupleServiceLogic;
private static IForceTupleServiceLogic ForceTupleServiceLogic => forceTupleServiceLogic ??= new ForceTupleServiceLogic();
public static List<IDesignForcePair> ConvertCombinationToPairs(IForceCombinationList combinations)
{
var resultList = new List<IDesignForcePair>();
var limitStates = new List<LimitStates>() { LimitStates.ULS, LimitStates.SLS };
var calcTerms = new List<CalcTerms>() { CalcTerms.ShortTerm, CalcTerms.LongTerm };
foreach (var limitState in limitStates)
{
var tuples = new IForceTuple[2];
for (int i = 0; i < calcTerms.Count; i++)
{
var forceTupleList = combinations.DesignForces.Where(x => x.LimitState == limitState && x.CalcTerm == calcTerms[i]).Select(x => x.ForceTuple);
var sumLongTuple = ForceTupleServiceLogic.MergeTupleCollection(forceTupleList);
tuples[i] = sumLongTuple;
}
var pair = new DesignForcePair()
{
Name = combinations.Name,
ForcePoint = (IPoint2D)combinations.ForcePoint.Clone(),
SetInGravityCenter = combinations.SetInGravityCenter,
LimitState = limitState,
FullForceTuple = tuples[0],
LongForceTuple = tuples[1]
};
resultList.Add(pair);
}
return resultList;
}
public static List<IDesignForcePair> ConvertCombinationToPairs(IForceFactoredList combinations)
{
var resultList = new List<IDesignForcePair>();
var limitStates = new List<LimitStates>() { LimitStates.ULS, LimitStates.SLS };
var calcTerms = new List<CalcTerms>() { CalcTerms.ShortTerm, CalcTerms.LongTerm };
foreach (var limitState in limitStates)
{
var tuples = new IForceTuple[2];
for (int i = 0; i < calcTerms.Count; i++)
{
var stateFactor = limitState is LimitStates.SLS ? 1d : combinations.CombinationProperty.ULSFactor;
var termFactor = calcTerms[i] == CalcTerms.ShortTerm ? 1d : combinations.CombinationProperty.LongTermFactor;
var forceTupleList = ForceTupleServiceLogic.MultiplyTupleByFactor(combinations.ForceTuples[0], stateFactor * termFactor);
tuples[i] = forceTupleList;
}
var pair = new DesignForcePair()
{
Name = combinations.Name,
ForcePoint = (IPoint2D)combinations.ForcePoint.Clone(),
SetInGravityCenter = combinations.SetInGravityCenter,
LimitState = limitState,
FullForceTuple = tuples[0],
LongForceTuple = tuples[1]
};
resultList.Add(pair);
}
return resultList;
}
public static List<IDesignForcePair> ConvertCombinationToPairs(IForceAction forceAction)
{
var resultList = new List<IDesignForcePair>();
if (forceAction is IForceCombinationList combinationList)
{
resultList.AddRange(ConvertCombinationToPairs(combinationList));
}
else if (forceAction is IForceFactoredList forceFactoredList)
{
resultList.AddRange(ConvertCombinationToPairs(forceFactoredList));
}
else
{
throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknown + $": expected {typeof(IForceAction)}, but was {forceAction.GetType()}");
}
return resultList;
}
}
}