using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Infrastructures.Settings; using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Parameters; using StructureHelperCommon.Services; using StructureHelperLogics.NdmCalculations.Analyses.ByForces.LimitCurve; using StructureHelperLogics.NdmCalculations.Analyses.ByForces.Logics; using StructureHelperLogics.NdmCalculations.Analyses.ValueDiagrams; using StructureHelperLogics.NdmCalculations.Cracking; using StructureHelperLogics.NdmCalculations.Primitives; using StructureHelperLogics.NdmCalculations.Primitives.Logics; namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces { /// /// Creates deep copy of internal elements of object which has calculators /// public class HasCalculatorsUpdateCloningStrategy : IUpdateStrategy { private ICloningStrategy cloningStrategy; private ICalculatorCloningStrategyContainer cloningStrategyContainer; public HasCalculatorsUpdateCloningStrategy( ICloningStrategy cloningStrategy, ICalculatorCloningStrategyContainer cloningStrategyContainer) { this.cloningStrategy = cloningStrategy; this.cloningStrategyContainer = cloningStrategyContainer; } public HasCalculatorsUpdateCloningStrategy(ICloningStrategy cloningStrategy) : this( cloningStrategy, new CalculatorCloningStrategyContainer(cloningStrategy) ) { } public void Update(IHasCalculators targetObject, IHasCalculators sourceObject) { CheckObject.IsNull(cloningStrategy); CheckObject.IsNull(sourceObject); CheckObject.IsNull(targetObject); if (ReferenceEquals(targetObject, sourceObject)) { return; } targetObject.Calculators.Clear(); foreach (var calculator in sourceObject.Calculators) { //to do Change to cloning strategy var newCalculator = cloningStrategy.Clone(calculator); //var newCalculator = calculator.Clone() as ICalculator; if (calculator is IForceCalculator forceCalculator) { cloningStrategyContainer.ForceCalculatorStrategy.Update(newCalculator as IForceCalculator, forceCalculator); } else if (calculator is ICrackCalculator crackCalculator) { cloningStrategyContainer.CrackCalculatorStrategy.Update(newCalculator as ICrackCalculator, crackCalculator); } else if (calculator is ILimitCurvesCalculator limitCalculator) { cloningStrategyContainer.LimitCurvesCalculatorStrategy.Update(newCalculator as ILimitCurvesCalculator, limitCalculator); } else if (calculator is IValueDiagramCalculator valueDiagramCalculator) { cloningStrategyContainer.ValueDiagramCalculatorStrategy.Update(newCalculator as IValueDiagramCalculator, valueDiagramCalculator); } else { throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(calculator)); } targetObject.Calculators.Add(newCalculator); } } } }