using LoaderCalculator.Data.Materials; using LoaderCalculator.Data.Ndms; using LoaderCalculator.Infrastructure.Geometry; using StructureHelperCommon.Infrastructures.Exceptions; using StructureHelperCommon.Models.Shapes; using TriangleNet.Geometry; using TriangleNet.Meshing; using static System.Windows.Forms.Design.AxImporter; namespace StructureHelperLogics.NdmCalculations.Triangulations { /// /// Logic for triangulation of line poligon shapr into collection of ndm parts /// public class LinePolygonTriangulationLogic : ITriangulationLogic { private LinePolygonTriangulationLogicOption options; public LinePolygonTriangulationLogic(LinePolygonTriangulationLogicOption triangulationLogicOption) { this.options = triangulationLogicOption; } /// public IEnumerable GetNdmCollection() { IMesh mesh = GetMesh(); var material = options.HeadMaterial.GetLoaderMaterial(options.TriangulationOptions.LimiteState, options.TriangulationOptions.CalcTerm); List ndms = GetNdmsByMesh(mesh, material); return ndms; } private List GetNdmsByMesh(IMesh mesh, IMaterial material) { List ndmCollection = []; foreach (var triangle in mesh.Triangles) { List points = []; for (int i = 0; i < 3; i++) { var vertex1 = triangle.GetVertex(i); points.Add(new PointLd2D() { X = vertex1.X, Y = vertex1.Y }); } var ndm = new TriangleNdm() { Point1 = points[0], Point2 = points[1], Point3 = points[2] }; ndm.Material = material; var ndm2 = new RectangleNdm() { Width = Math.Sqrt(ndm.Area), Height = Math.Sqrt(ndm.Area), CenterX = ndm.CenterX, CenterY = ndm.CenterY, Material = ndm.Material}; ndmCollection.Add(ndm); } TriangulationService.SetPrestrain(ndmCollection, options.Prestrain); return ndmCollection; } private IMesh GetMesh() { if (options.Shape is not ILinePolygonShape polygonShape) { throw new StructureHelperException(ErrorStrings.ObjectTypeIsUnknownObj(options.Shape) + ": Shape is not line polygon shape"); } var polygon = new Polygon(); List vertices = polygonShape.Vertices.ToList(); var contour = new List(); foreach (var vertex in vertices) { contour.Add(new TriangleNet.Geometry.Vertex(vertex.Point.X, vertex.Point.Y)); } // Add contour to polygon — this automatically defines the connecting segments polygon.Add(new Contour(contour)); var quality = new QualityOptions() { MinimumAngle = 25.0, MaximumArea = options.DivisionSize.NdmMaxSize * options.DivisionSize.NdmMaxSize, }; var mesh = polygon.Triangulate(quality); return mesh; } /// public void ValidateOptions(ITriangulationLogicOptions options) { throw new NotImplementedException(); } } }