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

namespace FeMM.Grasshopper.Components.Materials
{
    public class MaterialTableComponent : GH_Component
    {

        public MaterialTableComponent()
          : base("Table Material", "TM", "Table material", CategoryNameConstants.CATEGORY_FEMM, CategoryNameConstants.SUBCATEGORY_MATERIALS)
        {

        }

        protected override void RegisterInputParams(GH_InputParamManager pManager)
        {

            pManager.AddTextParameter("Name", "N", "The name of the material", GH_ParamAccess.item);
            pManager.AddBooleanParameter("Use Poisson", char.ConvertFromUtf32(0x3BD) + "?", "Use Poisson", GH_ParamAccess.item, true);
            pManager.AddNumberParameter("Poisson Ratio", char.ConvertFromUtf32(0x3BD), "Poisson Ratio", GH_ParamAccess.item, 0.3);
            pManager.AddNumberParameter("Shear Modulus", "G", "Shear Modulus", GH_ParamAccess.item, 0);
            pManager.AddNumberParameter("Thermal Expansion", char.ConvertFromUtf32(0x3B1), "Thermal Expansion", GH_ParamAccess.item, 0);
            pManager[pManager.ParamCount - 1].Optional = true;
            pManager.AddNumberParameter("Density", char.ConvertFromUtf32(0x3C1), "Density", GH_ParamAccess.item, 0);
            pManager[pManager.ParamCount - 1].Optional = true;
            pManager.AddNumberParameter("Stresses", char.ConvertFromUtf32(0x03C3), "Stresses", GH_ParamAccess.list);
            pManager.AddNumberParameter("Strains", char.ConvertFromUtf32(0x03B5), "Strains", GH_ParamAccess.list);
        }

        protected override void RegisterOutputParams(GH_OutputParamManager pManager)
        {
            pManager.AddGenericParameter("Material", "M", "The table material", GH_ParamAccess.item);
        }

        protected override void SolveInstance(IGH_DataAccess DA)
        {
            string name = string.Empty;
            double g = 0;
            double ni = 0;
            double alphaTerm = 0;
            double rho = 0;
            bool usePoisson = false;
            var stresses = new List<double>();
            var strains = new List<double>();

            if (!DA.GetData(0, ref name))
                return;
            if (!DA.GetData(1, ref usePoisson))
                return;
            if (!DA.GetData(2, ref ni))
                return;
            if (!DA.GetData(3, ref g))
                return;
            DA.GetData(4, ref alphaTerm);
            DA.GetData(5, ref rho);
            if (!DA.GetDataList("Stresses", stresses))
                return;
            if (!DA.GetDataList("Strains", strains))
                return;

            if(usePoisson && ni > 0.5 && ni < 0.0)
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Poisson Ratio must be < 0.5 and > 0");
                return;
            }

            if (stresses.Count == strains.Count)
            {
                var material = new MaterialModel
                {
                    Name = name,
                    PoissonRatio = ni,
                    ThermalExpansion = alphaTerm,
                    ShearModulus = g,
                    UsePoisson = usePoisson,
                    Density = rho
                };

                var stressStrainTable = new List<(double stress, double strain)>();

                for (int i = 0; i < stresses.Count; i++)                
                    stressStrainTable.Add((stresses[i], strains[i]));                

                material.StressStrainTable = [.. stressStrainTable];
                DA.SetData(0, new GH_Material(material));
            }
            else
            {
                AddRuntimeMessage(GH_RuntimeMessageLevel.Error, "Stress list length != strain list length");
                return;
            }
        }


        protected override System.Drawing.Bitmap Icon => Properties.Resources.MaterialTableIcon;

        public override Guid ComponentGuid => new("81D52CE7-7934-4A6B-ABC5-DDCFF5F165C0");
    }
}
303 files24 directories