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