using FeMM.Common.Models;
using FeMM.Grasshopper.DataTypes.FeMM;
using FeMM.Grasshopper.Helpers;
using Grasshopper.Kernel;
using Grasshopper.Kernel.Types;
using System;
using System.Collections.Generic;
using System.Runtime.Versioning;

namespace FeMM.Grasshopper.Components.Models
{
#if NETCOREAPP
    [SupportedOSPlatform("windows")]
#endif
    public class MergeModelComponent : GH_Component
    {
        /// <summary>
        /// Initializes a new instance of the BuildModelComponent class.
        /// </summary>
        public MergeModelComponent()
          : base("Merge Model", "BM", "Build the FEM model", CategoryNameConstants.CATEGORY_FEMM, CategoryNameConstants.SUBCATEGORY_MODEL)
        {
        }

        /// <summary>
        /// Registers all the input parameters for this component.
        /// </summary>
        protected override void RegisterInputParams(GH_InputParamManager pManager)
        {
            pManager.AddGeometryParameter("Elements", "E", "The model elements", GH_ParamAccess.list);
            pManager.AddNumberParameter("Tolerance", "T", "The geometric matching tolerance", GH_ParamAccess.item, 0.1);
        }

        /// <summary>
        /// Registers all the output parameters for this component.
        /// </summary>
        protected override void RegisterOutputParams(GH_OutputParamManager pManager)
        {
            pManager.AddGenericParameter("FeMM Nodes", "FN", "", GH_ParamAccess.list);
            pManager.AddGenericParameter("FeMM Beams", "FB", "", GH_ParamAccess.list);
            pManager.AddGenericParameter("FeMM Plates", "FP", "", GH_ParamAccess.list);
            pManager.AddGenericParameter("FeMM Link", "FL", "", GH_ParamAccess.list);
        }

        /// <summary>
        /// This is the method that actually does the work.
        /// </summary>
        /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param>
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            try
            {
                var elements = new List<IGH_GeometricGoo>();
                double tolerance = 0.1;

                if (!DA.GetDataList(0, elements))
                    return;
                DA.GetData(1, ref tolerance);

                var femmnodes = new List<NodeModel>();
                var femmbeams = new List<BeamModel>();
                var femmplates = new List<PlateModel>();
                var femmlinks = new List<LinkModel>();

                for (int i = 0; i < elements.Count; i++)
                {
                    if (elements[i] != null)
                    {
                        switch (elements[i])
                        {
                            case GH_Node fnode:
                                femmnodes.Add(new NodeModel(fnode.Value));
                                break;
                            case GH_Beam fbeam:
                                femmbeams.Add(new BeamModel(fbeam.Value));
                                break;
                            case GH_Plate fplate:
                                femmplates.Add(new PlateModel(fplate.Value));
                                break;
                            case GH_Link flink:
                                femmlinks.Add(new LinkModel(flink.Value));
                                break;
                        }
                    }
                }

                Common.Helpers.CommonModelHelper.MergeModel(ref femmnodes, ref femmbeams, ref femmplates, ref femmlinks, tolerance);

                var gH_Nodes = new List<GH_Node>();
                var gH_Beams = new List<GH_Beam>();
                var gH_Plates = new List<GH_Plate>();
                var gH_Link = new List<GH_Link>();

                for (int i = 0; i < femmnodes.Count; i++)
                    gH_Nodes.Add(new GH_Node(femmnodes[i]));
                for (int i = 0; i < femmbeams.Count; i++)
                    gH_Beams.Add(new GH_Beam(femmbeams[i]));
                for (int i = 0; i < femmplates.Count; i++)
                    gH_Plates.Add(new GH_Plate(femmplates[i]));
                for (int i = 0; i < femmlinks.Count; i++)
                    gH_Link.Add(new GH_Link(femmlinks[i]));

                DA.SetDataList(0, gH_Nodes);
                DA.SetDataList(1, gH_Beams);
                DA.SetDataList(2, gH_Plates);
                DA.SetDataList(3, gH_Link);
            }
            catch (Exception e)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, e.Message);
            }
        }

        public override GH_Exposure Exposure => GH_Exposure.tertiary;

        /// <summary>
        /// Provides an Icon for the component.
        /// </summary>
        protected override System.Drawing.Bitmap Icon => Properties.Resources.MergeModelIcon;

        /// <summary>
        /// Gets the unique ID for this component. Do not change this ID after release.
        /// </summary>
        public override Guid ComponentGuid => new("965a6404-f62f-4fdc-b139-8f7b6a159b97");
    }
}
303 files24 directories