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 St7GetAllNodesXYZComponent : GH_Component
{
private bool _run = false;
public St7GetAllNodesXYZComponent()
: base("Get Nodes Positions", "GetNodesPositions",
"Returns nodes positions",
CategoryNameConstants.CATEGORY_F2R, CategoryNameConstants.SUBCATEGORY_ST2R_BAKE)
{ }
public override void CreateAttributes()
{
// Add a button to trigger the operation
var buttonAttributes = new ComponentAttributes.ComponentOneButtonAttributes(this, "Get Nodes");
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("NodeNumbers", "Nodes", "Node numbers", GH_ParamAccess.tree);
p.AddNumberParameter("Coordinates", "C", "Coordinates of nodes as [X,Y,Z]", 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> nodeNumbersTree = new();
GH_Structure<GH_Number> xyzTree = new();
if (!_run)
{
DA.SetDataTree(0, nodeNumbersTree);
DA.SetDataTree(1, xyzTree);
DA.SetDataList(2, log);
return;
}
int nodeNum = 1;
while (true)
{
double[] xyz = new double[3];
long err = St7.St7GetNodeXYZ(uid, nodeNum, xyz);
if (err != 0)
{
log.Add($"Stopped at Node {nodeNum}, error code {err}");
break;
}
// Node number branch
GH_Path nodePath = new(nodeNum - 1);
nodeNumbersTree.Append(new GH_Integer(nodeNum), nodePath);
// XYZ branch
GH_Path xyzPath = new(nodeNum - 1);
xyzTree.Append(new GH_Number(xyz[0]), xyzPath);
xyzTree.Append(new GH_Number(xyz[1]), xyzPath);
xyzTree.Append(new GH_Number(xyz[2]), xyzPath);
log.Add($"Node {nodeNum}: X={xyz[0]}, Y={xyz[1]}, Z={xyz[2]}");
nodeNum++;
}
DA.SetDataTree(0, nodeNumbersTree);
DA.SetDataTree(1, xyzTree);
DA.SetDataList(2, log);
_run = false; // reset button state
}
protected override System.Drawing.Bitmap Icon => Properties.Resources.St7GetAllNodesXYZIcon;
public override Guid ComponentGuid => new("b1c2d3e4-5678-4abc-9d12-abcdef123463");
}
}