using FeMM.Grasshopper.Helpers;
using Grasshopper.Kernel;
using Grasshopper.Kernel.Data;
using Grasshopper.Kernel.Types;
using St7API;
using System;
using System.Collections.Generic;

namespace FeMM.Grasshopper.Components.ST2R
{
    public class St7GetAllBeamConnectivityComponent : GH_Component
    {
        private bool _run = false;

        public St7GetAllBeamConnectivityComponent()
            : base("Get Beams Connectivity", "GetBeamConnectivity",
                  "Returns beams connectivity",
                  CategoryNameConstants.CATEGORY_F2R, CategoryNameConstants.SUBCATEGORY_ST2R_BAKE)
        { }

        public override void CreateAttributes()
        {
            var buttonAttributes = new ComponentAttributes.ComponentOneButtonAttributes(this, "Get Beam Connectivity");
            buttonAttributes.ButtonPressed += () =>
            {
                _run = true;
                ExpireSolution(true); // triggers SolveInstance
            };
            m_attributes = buttonAttributes;
        }

        protected override void RegisterInputParams(GH_InputParamManager p)
        {
            p.AddIntegerParameter("uID", "ID", "Straus7 model file ID", GH_ParamAccess.item);
        }

        protected override void RegisterOutputParams(GH_OutputParamManager p)
        {
            p.AddIntegerParameter("BeamNumbers", "Beams", "Beam numbers", GH_ParamAccess.tree);
            p.AddIntegerParameter("NumNodes", "NumNodes", "Number of nodes in each beam", GH_ParamAccess.tree);
            p.AddIntegerParameter("NodeNumbers", "Nodes", "Node numbers for each beam", GH_ParamAccess.tree);
            p.AddTextParameter("Log", "Log", "Debug messages", GH_ParamAccess.list);
        }

        protected override void SolveInstance(IGH_DataAccess DA)
        {
            int uid = 0;
            if (!DA.GetData(0, ref uid)) return;

            List<string> log = [];
            GH_Structure<GH_Integer> beamNumbersTree = new();
            GH_Structure<GH_Integer> numNodesTree = new();
            GH_Structure<GH_Integer> nodeNumbersTree = new();

            if (!_run)
            {
                DA.SetDataTree(0, beamNumbersTree);
                DA.SetDataTree(1, numNodesTree);
                DA.SetDataTree(2, nodeNumbersTree);
                DA.SetDataList(3, log);
                return;
            }

            int beamNum = 1;
            while (true)
            {
                int[] connection = new int[20]; // max nodes per element
                long err = St7.St7GetElementConnection(uid, St7.tyBEAM, beamNum, connection);

                if (err != 0 || connection[0] == 0)
                {
                    log.Add($"Stopped at Beam {beamNum}, error code {err}");
                    break;
                }

                int numNodes = connection[0]; // first number = number of nodes
                GH_Path beamPath = new(beamNum - 1);

                // Output the beam number
                beamNumbersTree.Append(new GH_Integer(beamNum), beamPath);

                // Output the number of nodes
                numNodesTree.Append(new GH_Integer(numNodes), beamPath);

                // Output the node numbers (excluding the first number)
                for (int i = 1; i <= numNodes; i++)
                {
                    nodeNumbersTree.Append(new GH_Integer(connection[i]), beamPath);
                }

                log.Add($"Beam {beamNum}: NumNodes={numNodes}, Nodes={string.Join(",", connection, 1, numNodes)}");

                beamNum++;
            }

            DA.SetDataTree(0, beamNumbersTree);
            DA.SetDataTree(1, numNodesTree);
            DA.SetDataTree(2, nodeNumbersTree);
            DA.SetDataList(3, log);

            _run = false;
        }

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

        public override Guid ComponentGuid => new("f3a4b5c6-7890-4abc-9d12-abcdef123467");
    }
}
303 files24 directories