using Database;
using FeMM.Common.Helpers;
using FeMM.Common.Models;
using FeMM.Grasshopper.Helpers;
using Grasshopper;
using Grasshopper.Kernel;
using Grasshopper.Kernel.Types;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Runtime.Versioning;
using System.Windows.Forms;
namespace FeMM.Grasshopper.Components.Parameters
{
#if NETCOREAPP
[SupportedOSPlatform("windows")]
#endif
public class MaterialParam : GH_PersistentParam<DataTypes.FeMM.GH_Material>
{
public MaterialParam()
: base("Material", "M", "Material", CategoryNameConstants.CATEGORY_FEMM, CategoryNameConstants.SUBCATEGORY_PARAMETERS)
{
}
protected override GH_GetterResult Prompt_Singular(ref DataTypes.FeMM.GH_Material value)
{
Database.Database db = GhFeMMInfo.FeMMDatabase;
MainWindow.ShowSelectionDatabase(MainWindow.ItemCodes.Aluminium | MainWindow.ItemCodes.Concrete | MainWindow.ItemCodes.Precast |
MainWindow.ItemCodes.Steel | MainWindow.ItemCodes.Rebar, ref db, out Item item, Instances.DocumentEditor.Handle);
if (item != null)
{
value = new DataTypes.FeMM.GH_Material(NamingConventionHelper.GetMaterial((Material)item, ModelModel.ModelUnits.Nmm));
GhFeMMInfo.FeMMDatabase = db;
return GH_GetterResult.success;
}
return GH_GetterResult.cancel;
}
private static DataTypes.FeMM.GH_Material GetMaterial(Material item)
{
var mat = new MaterialModel
{
Name = item.Name,
Modulus = item.ElasticModulusE_MPa,
PoissonRatio = item.Nu,
ThermalExpansion = item.AlfaThermalExpansion,
ShearModulus = item.ShearModulusG_MPa,
UsePoisson = true,
Density = item.Density_TSuMm3
};
if (item.GetType() == typeof(Aluminium))
{
Aluminium alu = (Aluminium)item;
mat.Kind = MaterialModel.MaterialKind.Aluminium;
mat.AlumiumType = MaterialModel.AlumiumTypes.Wrought;
mat.Alloy = alu.Name;
mat.CompressiveYieldStrength = alu.Fo_MPa;
mat.TensileYieldStrength = alu.Fo_MPa;
mat.TensileUltimateStrength = alu.Fu_MPa;
mat.ShearUltimateStrength = alu.ShearFy_MPa;
}
else if (item.GetType() == typeof(Steel))
{
Steel st = (Steel)item;
mat.Kind = MaterialModel.MaterialKind.Steel;
mat.MinimumYieldStress = st.Fy_MPa;
mat.MinimumTensileStress = st.Fu_MPa;
mat.ExpectedYieldStress = st.ExpectedFy_MPa;
mat.ExpectedTensileStress = st.ExpectedFu_MPa;
}
else if (item.GetType() == typeof(Concrete))
{
Concrete conc = (Concrete)item;
if(conc.IsPrecast)
mat.Kind = MaterialModel.MaterialKind.Precast;
else
mat.Kind = MaterialModel.MaterialKind.Concrete;
mat.SpecificCompressiveStrength = conc.Fck_MPa;
mat.ExpectedCompressiveStrength = conc.ExpFck_MPa;
}
else if (item.GetType() == typeof(Rebar))
{
Rebar rebar = (Rebar)item;
mat.Kind = MaterialModel.MaterialKind.Rebar;
mat.MinimumYieldStress = rebar.Fyk_MPa;
mat.MinimumTensileStress = rebar.Ftk_MPa;
mat.ExpectedYieldStress = rebar.ExpectedFyk_MPa;
mat.ExpectedTensileStress = rebar.ExpectedFtk_MPa;
}
else
{
throw new NotSupportedException();
}
return new DataTypes.FeMM.GH_Material(mat);
}
protected override GH_GetterResult Prompt_Plural(ref List<DataTypes.FeMM.GH_Material> values)
{
return GH_GetterResult.cancel;
}
public override bool AppendMenuItems(ToolStripDropDown menu)
{
Menu_AppendObjectNameEx(menu);
Menu_AppendWireDisplay(menu);
Menu_AppendDisconnectWires(menu);
Menu_AppendSeparator(menu);
//section menu
Menu_AppendPromptOne(menu);
Menu_AppendSeparator(menu);
Menu_AppendDestroyPersistent(menu);
Menu_AppendInternaliseData(menu);
return true;
}
protected override DataTypes.FeMM.GH_Material PreferredCast(object data)
{
if (GhFeMMInfo.FeMMDatabase != null && data is GH_String str)
{
Database.Database db = GhFeMMInfo.FeMMDatabase;
string name = str.Value;
return new DataTypes.FeMM.GH_Material(NamingConventionHelper.GetMaterial(db, name, ModelModel.ModelUnits.Nmm));
}
return base.PreferredCast(data);
}
protected override void OnVolatileDataCollected()
{
base.OnVolatileDataCollected();
}
public override GH_Exposure Exposure => GH_Exposure.secondary;
protected override Bitmap Icon => Properties.Resources.MaterialParamIcon;
public override Guid ComponentGuid => new("5B81CF74-EDF8-483E-A4DC-CF5FA5DFD3E8");
}
}