using netDxf.Entities; using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Infrastructures.Interfaces; using StructureHelperCommon.Models.Shapes; using StructureHelperCommon.Services.Exports; namespace StructureHelperLogics.NdmCalculations.Primitives { public class NdmPrimitivesToDxfEntitiesConvertStrategy : IObjectConvertStrategy, IEnumerable> { private const double metresToMillimeters = 1000.0; private List<(EntityObject, LayerNames)> entities = []; private IShapeConvertStrategy shapeConvertStrategy = new ShapeToDxfEntityConvertStrategy() { Scale = metresToMillimeters }; public List<(EntityObject, LayerNames)> Convert(IEnumerable source) { entities.Clear(); foreach (var ndmPrimitive in source) { shapeConvertStrategy.Dx = ndmPrimitive.Center.X; shapeConvertStrategy.Dy = ndmPrimitive.Center.Y; if (ndmPrimitive is IRectangleNdmPrimitive rectangleNdmPrimitive) { var rectangle = shapeConvertStrategy.Convert(rectangleNdmPrimitive); entities.Add((rectangle, LayerNames.StructiralPrimitives)); } else if (ndmPrimitive is IShapeNdmPrimitive shapeNdmPrimitive) { var polygon = shapeConvertStrategy.Convert(shapeNdmPrimitive.Shape); entities.Add((polygon, LayerNames.StructiralPrimitives)); } else if (ndmPrimitive is IEllipseNdmPrimitive ellipseNdmPrimitive) { CircleShape circleShape = new CircleShape() { Diameter = ellipseNdmPrimitive.Width}; var circle = shapeConvertStrategy.Convert(circleShape); entities.Add((circle, LayerNames.StructiralPrimitives)); } else if (ndmPrimitive is IRebarNdmPrimitive rebar) { LayerNames layerName = LayerNames.StructuralRebars; convertPoint(rebar, layerName); } else if (ndmPrimitive is IPointNdmPrimitive point) { LayerNames layerName = LayerNames.StructiralPrimitives; convertPoint(point, layerName); } else { throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(ndmPrimitive)); } } return entities; } private void convertPoint(IPointNdmPrimitive point, LayerNames layerName) { double diameter = Math.Sqrt(point.Area / Math.PI * 4.0); CircleShape circleShape = new CircleShape() { Diameter = diameter }; var circle = shapeConvertStrategy.Convert(circleShape); entities.Add((circle, layerName)); } } }