using DataAccess.DTOs.Converters; using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Models; using StructureHelperCommon.Models.Loggers; using StructureHelperCommon.Models.Shapes; using StructureHelperLogics.NdmCalculations.Primitives; namespace DataAccess.DTOs { public class RebarNdmPrimitiveToDTOConvertStrategy : IConvertStrategy { private IUpdateStrategy updateStrategy; private IConvertStrategy ndmElementConvertStrategy; private IConvertStrategy pointConvertStrategy; private IConvertStrategy visualPropsConvertStrategy; private IConvertStrategy hostPrimitiveConvertStrategy; public RebarNdmPrimitiveToDTOConvertStrategy( IUpdateStrategy updateStrategy, IConvertStrategy ndmElementConvertStrategy, IConvertStrategy pointConvertStrategy, IConvertStrategy visualPropsConvertStrategy) { this.updateStrategy = updateStrategy; this.ndmElementConvertStrategy = ndmElementConvertStrategy; this.pointConvertStrategy = pointConvertStrategy; this.visualPropsConvertStrategy = visualPropsConvertStrategy; } public RebarNdmPrimitiveToDTOConvertStrategy() : this( new RebarNdmPrimitiveUpdateStrategy(), new NdmElementDTOConvertStrategy(), new Point2DToDTOConvertStrategy(), new VisualPropertyToDTOConvertStrategy() ) { } public Dictionary<(Guid id, Type type), ISaveable> ReferenceDictionary { get; set; } public IShiftTraceLogger TraceLogger { get; set; } public RebarNdmPrimitiveDTO Convert(IRebarNdmPrimitive source) { try { Check(); PrepareStrategies(); return GetNewPrimitive(source); } catch (Exception ex) { TraceLogger?.AddMessage(LoggerStrings.LogicType(this), TraceLogStatuses.Error); TraceLogger?.AddMessage(ex.Message, TraceLogStatuses.Error); throw; } } private RebarNdmPrimitiveDTO GetNewPrimitive(IRebarNdmPrimitive source) { RebarNdmPrimitiveDTO newItem = new() { Id = source.Id }; updateStrategy.Update(newItem, source); newItem.NdmElement = ndmElementConvertStrategy.Convert(source.NdmElement); newItem.Center = pointConvertStrategy.Convert(source.Center); newItem.VisualProperty = visualPropsConvertStrategy.Convert(source.VisualProperty); if (source.HostPrimitive is not null) { hostPrimitiveConvertStrategy = new NdmPrimitiveToDTOConvertStrategy(null, null, new EllipseNdmPrimitiveToDTOConvertStrategy(), new RectangleNdmPrimitiveToDTOConvertStrategy()); hostPrimitiveConvertStrategy.ReferenceDictionary = ReferenceDictionary; hostPrimitiveConvertStrategy.TraceLogger = TraceLogger; newItem.HostPrimitive = hostPrimitiveConvertStrategy.Convert(source.HostPrimitive); } return newItem; } private void PrepareStrategies() { ndmElementConvertStrategy.ReferenceDictionary = pointConvertStrategy.ReferenceDictionary = visualPropsConvertStrategy.ReferenceDictionary = ReferenceDictionary; ndmElementConvertStrategy.TraceLogger = pointConvertStrategy.TraceLogger = visualPropsConvertStrategy.TraceLogger = TraceLogger; } private void Check() { var checkLogic = new CheckConvertLogic(this); checkLogic.Check(); } } }