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.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 IUpdateStrategy forceCalculatorUpdateStrategy; private IUpdateStrategy crackCalculatorUpdateStrategy; private IUpdateStrategy limitCurvesCalculatorUpdateStrategy; public HasCalculatorsUpdateCloningStrategy( ICloningStrategy cloningStrategy, IUpdateStrategy forceCalculatorUpdateStrategy, IUpdateStrategy crackCalculatorUpdateStrategy, IUpdateStrategy limitCurvesCalculatorUpdateStrategy) { this.cloningStrategy = cloningStrategy; this.forceCalculatorUpdateStrategy = forceCalculatorUpdateStrategy; this.crackCalculatorUpdateStrategy = crackCalculatorUpdateStrategy; this.limitCurvesCalculatorUpdateStrategy = limitCurvesCalculatorUpdateStrategy; } public HasCalculatorsUpdateCloningStrategy(ICloningStrategy cloningStrategy) : this( cloningStrategy, new ForceCalculatorUpdateCloningStrategy(cloningStrategy), new CrackCalculatorUpdateCloningStrategy(cloningStrategy), new LimitCurvesCalculatorUpdateCloningStrategy(cloningStrategy) ) { } public void Update(IHasCalculators targetObject, IHasCalculators sourceObject) { var project = ProgramSetting.CurrentProject; 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) { forceCalculatorUpdateStrategy.Update(newCalculator as IForceCalculator, forceCalculator); } else if (calculator is ICrackCalculator crackCalculator) { crackCalculatorUpdateStrategy.Update(newCalculator as ICrackCalculator, crackCalculator); } else if (calculator is ILimitCurvesCalculator limitCalculator) { limitCurvesCalculatorUpdateStrategy.Update(newCalculator as ILimitCurvesCalculator, limitCalculator); } else { throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(calculator)); } targetObject.Calculators.Add(newCalculator); } } } }