Files
StructureHelper/StructureHelperLogics/NdmCalculations/Primitives/Logics/HasPrimitivesUpdateCloningStrategy.cs
2024-12-29 20:32:48 +05:00

53 lines
2.0 KiB
C#

using StructureHelperCommon.Infrastructures.Interfaces;
using StructureHelperCommon.Infrastructures.Settings;
using StructureHelperCommon.Services;
namespace StructureHelperLogics.NdmCalculations.Primitives.Logics
{
/// <summary>
/// Creates deep copy of internal elements of object which has primitives
/// </summary>
public class HasPrimitivesUpdateCloningStrategy : IUpdateStrategy<IHasPrimitives>
{
private ICloningStrategy cloningStrategy;
public HasPrimitivesUpdateCloningStrategy(ICloningStrategy cloningStrategy)
{
this.cloningStrategy = cloningStrategy;
}
public void Update(IHasPrimitives targetObject, IHasPrimitives sourceObject)
{
CheckObject.IsNull(cloningStrategy);
CheckObject.IsNull(sourceObject);
CheckObject.IsNull(targetObject);
if (ReferenceEquals(targetObject, sourceObject)) { return; }
targetObject.Primitives.Clear();
foreach (var primitive in sourceObject.Primitives)
{
ProcessPrimitive(targetObject, primitive);
}
}
private void ProcessPrimitive(IHasPrimitives targetObject, INdmPrimitive primitive)
{
var project = ProgramSetting.CurrentProject;
var newPrimitive = cloningStrategy.Clone(primitive);
if (primitive.NdmElement.HeadMaterial is not null)
{
var material = cloningStrategy.Clone(primitive.NdmElement.HeadMaterial);
newPrimitive.NdmElement.HeadMaterial = material;
}
targetObject.Primitives.Add(newPrimitive);
if (primitive is IHasHostPrimitive hasHost)
{
if (hasHost.HostPrimitive is not null)
{
INdmPrimitive hostPrimitive = cloningStrategy.Clone(hasHost.HostPrimitive);
(newPrimitive as IHasHostPrimitive).HostPrimitive = hostPrimitive;
}
}
}
}
}