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

namespace FeMM.Grasshopper.Components.Design
{
#if NETCOREAPP
    [SupportedOSPlatform("windows")]
#endif
    public class AISC360BeamDesignOverrideComponent : GH_Component
    {
        protected Dictionary<int, string> _standardTypeOptions = new()
        {
            { 1, "AISC360-10" },
            { 2, "AISC360-16" },
        };

        /// <summary>
        /// Initializes a new instance of the MixedSectionComponent class.
        /// </summary>
        public AISC360BeamDesignOverrideComponent()
          : base("AISC360 Beam Design Override", "AISC360", "Define beam overwrite to check the steel elements according to AISC360 with SAP2000",
                CategoryNameConstants.CATEGORY_FEMM, CategoryNameConstants.SUBCATEGORY_DESIGN)
        {
        }

        /// <summary>
        /// Registers all the input parameters for this component.
        /// </summary>
        protected override void RegisterInputParams(GH_InputParamManager pManager)
        {
            pManager.AddGenericParameter("Beam", "B", "The beam where set the overwrite", GH_ParamAccess.item);
            int d = pManager.AddIntegerParameter("Standard", "S", "The standard", GH_ParamAccess.item, 0);
            Param_Integer mtParam = pManager[d] as Param_Integer;
            foreach (KeyValuePair<int, string> v in _standardTypeOptions)
                mtParam.AddNamedValue(v.Value, v.Key);
            int[] idx =
[
                pManager.AddNumberParameter("Unbraced length ratio, Major", "UL,Major", "Unbraced length ratio, Major", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Unbraced length ratio, Minor", "UL,Minor", "Unbraced length ratio, Minor", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Unbraced length ratio, Lateral Torsional Buckling", "UL,LTB", "Unbraced length ratio, Lateral Torsional Buckling", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Effective length factor, K1 Major", "K1,Major", "Effective length factor, K1 Major", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Effective length factor, K1 Minor", "K1,Minor", "Effective length factor, K1 Minor", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Effective length factor, K2 Major", "K2,Major", "Effective length factor, K2 Major", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Effective length factor, K2 Minor", "K2,Minor", "Effective length factor, K2 Minor", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Effective length factor, Lateral Torsional Buckling", "K2,LTB", "Effective length factor, Lateral Torsional Buckling", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Moment coefficient, Cm Major", "Cm Major", "Moment coefficient, Cm Major", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Moment coefficient, Cm Minor", "Cm Minor", "Moment coefficient, Cm Minor", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Bending coefficient, Cb", "Cb", "Bending coefficient, Cb", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Nonsway moment factor, B1 Major", "B1 Major", "Nonsway moment factor, B1 Major", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Nonsway moment factor, B1 Minor", "B1 Minor", "Nonsway moment factor, B1 Minor", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Sway moment factor, B2 Major", "B2 Major", "Nonsway moment factor, B2 Major", GH_ParamAccess.item, 0.0),
                pManager.AddNumberParameter("Sway moment factor, B2 Minor", "B2 Minor", "Nonsway moment factor, B2 Minor", GH_ParamAccess.item, 0.0),
            ];
            foreach (int i in idx)
                pManager[i].Optional = true;
        }

        /// <summary>
        /// Registers all the output parameters for this component.
        /// </summary>
        protected override void RegisterOutputParams(GH_OutputParamManager pManager)
        {
            pManager.AddGenericParameter("Beam", "B", "The modified beam", GH_ParamAccess.item);
        }

        /// <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)
        {
            GH_Beam gH_Beam = null;
            int standard = 0;
            double ulrMajor = 0.0;
            double ulrMinor = 0.0;
            double ulrLTB = 0.0;
            double k1Major = 0.0;
            double k1Minor = 0.0;
            double k2Major = 0.0;
            double k2Minor = 0.0;
            double k2LTB = 0.0;
            double CmMajor = 0.0;
            double CmMinor = 0.0;
            double Cb = 0.0;
            double B1Major = 0.0;
            double B1Minor = 0.0;
            double B2Major = 0.0;
            double B2Minor = 0.0;

            if (!DA.GetData(0, ref gH_Beam))
                return;
            if (!DA.GetData(1, ref standard))
                return;

            DA.GetData(2, ref ulrMajor);
            DA.GetData(3, ref ulrMinor);
            DA.GetData(4, ref ulrLTB);

            DA.GetData(5, ref k1Major);
            DA.GetData(6, ref k1Minor);
            DA.GetData(7, ref k2Major);
            DA.GetData(8, ref k2Minor);
            DA.GetData(9, ref k2LTB);

            DA.GetData(10, ref CmMajor);
            DA.GetData(11, ref CmMinor);
            DA.GetData(12, ref Cb);

            DA.GetData(13, ref B1Major);
            DA.GetData(14, ref B1Minor);
            DA.GetData(15, ref B2Major);
            DA.GetData(16, ref B2Minor);

            var data = new BeamAISC360SteelAttributeModel.AttributeData()
            {
                Standard = (BeamAISC360SteelAttributeModel.Standards)standard,
                UnbracedLengthRatioMajor = ulrMajor,
                UnbracedLengthRatioMinor = ulrMinor,
                UnbracedLengthRatioLTB = ulrLTB,

                EffectiveLengthFactorK1Major = k1Major,
                EffectiveLengthFactorK1Minor = k1Minor,
                EffectiveLengthFactorK2Major = k2Major,
                EffectiveLengthFactorK2Minor = k2Minor,
                EffectiveLengthFactorKLTB = k2LTB,

                MomentCoefficientCmMajor = CmMajor,
                MomentCoefficientCmMinor = CmMinor,
                BendingCoefficientCb = Cb,

                NonswayMomentFactorB1Major = B1Major,
                NonswayMomentFactorB1Minor = B1Minor,
                SwayMomentFactorB2Major = B2Major,
                SwayMomentFactorB2Minor = B2Minor,
            };

            var model = new BeamAISC360SteelAttributeModel(data);
            var newBeam = new GH_Beam(gH_Beam);
            newBeam.Value.Attributes.Add(model);
            DA.SetData(0, newBeam);
        }

        public override GH_Exposure Exposure => GH_Exposure.tertiary;

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

        /// <summary>
        /// Gets the unique ID for this component. Do not change this ID after release.
        /// </summary>
        public override Guid ComponentGuid => new("5f81b3ac-17d7-4f0d-b0fe-c54e53d5f548");
    }
}
303 files24 directories