using StructureHelper.Models.Materials; using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Models; using StructureHelperLogics.NdmCalculations.Primitives; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Shapes; namespace DataAccess.DTOs { public class NdmPrimitiveFromDTOConvertStrategy : ConvertStrategy { private const string PrimitiveIs = "Primtive is"; private IConvertStrategy rebarConvertStrategy; private IConvertStrategy pointConvertStrategy; private IConvertStrategy ellipseConvertStrategy; private IConvertStrategy rectangleConvertStrategy; private IHeadMaterial headMaterial; public NdmPrimitiveFromDTOConvertStrategy( IConvertStrategy rebarConvertStrategy, IConvertStrategy pointConvertStrategy, IConvertStrategy ellipseConvertStrategy, IConvertStrategy rectangleConvertStrategy) { this.rebarConvertStrategy = rebarConvertStrategy; this.pointConvertStrategy = pointConvertStrategy; this.ellipseConvertStrategy = ellipseConvertStrategy; this.rectangleConvertStrategy = rectangleConvertStrategy; } public NdmPrimitiveFromDTOConvertStrategy() : this( new RebarNdmPrimitiveFromDTOConvertStrategy(), new PointNdmPrimitiveFromDTOConvertStrategy(), new EllipseNdmPrimitiveFromDTOConvertStrategy(), new RectanglePrimitiveFromDTOConvertStrategy()) { } public override INdmPrimitive GetNewItem(INdmPrimitive source) { GetMaterial(source.NdmElement.HeadMaterial); INdmPrimitive newItem = GetNewPrimitive(source); newItem.NdmElement.HeadMaterial = headMaterial; return newItem; } private INdmPrimitive GetNewPrimitive(INdmPrimitive source) { if (source is RebarNdmPrimitiveDTO rebar) { return GetRebar(rebar); } if (source is PointNdmPrimitiveDTO point) { return GetPoint(point); } if (source is EllipseNdmPrimitiveDTO ellipse) { return GetEllipse(ellipse); } if (source is RectangleNdmPrimitiveDTO rectangle) { return GetRectangle(rectangle); } string errorString = ErrorStrings.ObjectTypeIsUnknownObj(source); TraceLogger.AddMessage(errorString, TraceLogStatuses.Error); throw new StructureHelperException(errorString); } private void GetMaterial(IHeadMaterial source) { HeadMaterialFromDTOConvertStrategy convertStrategy = new() { ReferenceDictionary = ReferenceDictionary, TraceLogger = TraceLogger }; DictionaryConvertStrategy convertLogic = new(this, convertStrategy); headMaterial = convertLogic.Convert(source); } private INdmPrimitive GetRebar(RebarNdmPrimitiveDTO rebar) { TraceLogger?.AddMessage($"{PrimitiveIs} rebar ndm primitive"); rebarConvertStrategy.ReferenceDictionary = ReferenceDictionary; rebarConvertStrategy.TraceLogger = TraceLogger; RebarNdmPrimitive newItem = rebarConvertStrategy.Convert(rebar); TraceLogger?.AddMessage($"Primtive has been obtained successfully, Name = {newItem.Name}"); if (rebar.HostPrimitive != null) { newItem.HostPrimitive = GetHostPrimitive(rebar); } return newItem; } private INdmPrimitive GetHostPrimitive(RebarNdmPrimitiveDTO rebar) { NdmPrimitiveFromDTOConvertStrategy convertStrategy = new() { ReferenceDictionary = ReferenceDictionary, TraceLogger = TraceLogger }; DictionaryConvertStrategy convertLogic = new(this, convertStrategy); INdmPrimitive hostPrimitive = convertLogic.Convert(rebar.HostPrimitive); TraceLogger?.AddMessage($"Host primitive Id = {hostPrimitive.Id}, Name = {hostPrimitive.Name}"); return hostPrimitive; } private INdmPrimitive GetPoint(PointNdmPrimitiveDTO point) { TraceLogger?.AddMessage($"{PrimitiveIs} point ndm primitive"); pointConvertStrategy.ReferenceDictionary = ReferenceDictionary; pointConvertStrategy.TraceLogger = TraceLogger; PointNdmPrimitive newItem = pointConvertStrategy.Convert(point); TraceLogger?.AddMessage($"Primtive has been obtained successfully, Name = {newItem.Name}"); return newItem; } private INdmPrimitive GetEllipse(EllipseNdmPrimitiveDTO ellipse) { TraceLogger?.AddMessage($"{PrimitiveIs} ellipse ndm primitive"); ellipseConvertStrategy.ReferenceDictionary = ReferenceDictionary; ellipseConvertStrategy.TraceLogger = TraceLogger; EllipseNdmPrimitive newItem = ellipseConvertStrategy.Convert(ellipse); TraceLogger?.AddMessage($"Primtive has been obtained successfully, Name = {newItem.Name}"); return newItem; } private INdmPrimitive GetRectangle(RectangleNdmPrimitiveDTO rectangle) { TraceLogger?.AddMessage($"{PrimitiveIs} rectangle ndm primitive"); rectangleConvertStrategy.ReferenceDictionary = ReferenceDictionary; rectangleConvertStrategy.TraceLogger = TraceLogger; RectangleNdmPrimitive newItem = rectangleConvertStrategy.Convert(rectangle); TraceLogger?.AddMessage($"Primtive has been obtained successfully, Name = {newItem.Name}"); return newItem; } } }