Files
StructureHelper/StructureHelperCommon/Services/Forces/ForceTupleService.cs
2023-06-10 22:26:15 +05:00

111 lines
4.9 KiB
C#

using System.Collections.Generic;
using System.Linq;
using StructureHelperCommon.Infrastructures.Exceptions;
using StructureHelperCommon.Infrastructures.Strings;
using StructureHelperCommon.Models.Forces;
using StructureHelperCommon.Models.Shapes;
namespace StructureHelperCommon.Services.Forces
{
public static class ForceTupleService
{
public static void CopyProperties(IForceTuple source, IForceTuple target, double factor = 1d)
{
CheckTuples(source, target);
SumTupleToTarget(source, target, 0);
SumTupleToTarget(source, target, factor);
}
public static IForceTuple MoveTupleIntoPoint(IForceTuple forceTuple, IPoint2D point2D)
{
var newTuple = forceTuple.Clone() as IForceTuple;
newTuple.Mx += newTuple.Nz * point2D.Y;
newTuple.My -= newTuple.Nz * point2D.X;
return newTuple;
}
public static IForceTuple SumTuples(IForceTuple first, IForceTuple second, double factor = 1d)
{
CheckTuples(first, second);
IForceTuple result = GetNewTupleSameType(first);
SumTupleToTarget(first, result, 1d);
SumTupleToTarget(second, result, factor);
return result;
}
public static IForceTuple MergeTupleCollection(IEnumerable<IForceTuple> tupleCollection)
{
CheckTupleCollection(tupleCollection);
var result = GetNewTupleSameType(tupleCollection.First());
foreach (var item in tupleCollection)
{
SumTuples(result, item);
};
return result;
}
public static IForceTuple MultiplyTuples(IForceTuple first, double factor)
{
var result = GetNewTupleSameType(first);
CopyProperties(first, result, factor);
return result;
}
public static IForceTuple InterpolateTuples(IForceTuple endTuple, IForceTuple startTuple = null, double coefficient = 0.5d)
{
if (startTuple is null) startTuple = GetNewTupleSameType(endTuple);
else { CheckTuples(startTuple, endTuple); }
var deltaTuple = SumTuples(endTuple, startTuple, -1d);
return SumTuples(startTuple, deltaTuple, coefficient);
}
public static List<IDesignForceTuple> InterpolateDesignTuple(IDesignForceTuple finishDesignForce, IDesignForceTuple startDesignForce = null, int stepCount = 10)
{
if (startDesignForce.LimitState != finishDesignForce.LimitState) throw new StructureHelperException(ErrorStrings.LimitStatesIsNotValid);
if (startDesignForce.CalcTerm != finishDesignForce.CalcTerm) throw new StructureHelperException(ErrorStrings.LoadTermIsNotValid);
var tuples =new List<IDesignForceTuple>();
double step = 1d / stepCount;
for (int i = 0; i <= stepCount; i++)
{
var currentTuple = InterpolateTuples(finishDesignForce.ForceTuple, startDesignForce.ForceTuple, i * step) as ForceTuple;
var currentDesignTuple = new DesignForceTuple() { LimitState = finishDesignForce.LimitState, CalcTerm = finishDesignForce.CalcTerm, ForceTuple = currentTuple };
tuples.Add(currentDesignTuple);
}
return tuples;
}
private static void SumTupleToTarget(IForceTuple source, IForceTuple target, double factor = 1d)
{
target.Mx += source.Mx * factor;
target.My += source.My * factor;
target.Nz += source.Nz * factor;
target.Qx += source.Qx * factor;
target.Qy += source.Qy * factor;
target.Mz += source.Mz * factor;
}
private static void CheckTuples(IForceTuple first, IForceTuple second)
{
if (first.GetType() != second.GetType())
{
throw new StructureHelperException(ErrorStrings.DataIsInCorrect +
$": Type of first parameter (type = {first.GetType()}) doesn't corespond second parameter type ({second.GetType()})");
}
}
private static void CheckTupleCollection(IEnumerable<IForceTuple> tupleCollection)
{
if (tupleCollection.Count() == 0)
{
throw new StructureHelperException(ErrorStrings.DataIsInCorrect + $": Collection is Empty");
}
foreach (var item in tupleCollection)
{
CheckTuples(tupleCollection.First(), item);
}
}
private static IForceTuple GetNewTupleSameType(IForceTuple first)
{
IForceTuple result;
if (first is ForceTuple) { result = new ForceTuple(); }
else if (first is StrainTuple) { result = new StrainTuple(); }
else
{
throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknown);
}
return result;
}
}
}