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");
}
}