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 St7SetNodeXYZComponent : GH_Component
{
private bool _run = false;
public St7SetNodeXYZComponent()
: base("Set Node Positions", "SetNodePositions",
"Sets the coordinates of nodes",
CategoryNameConstants.CATEGORY_F2R, CategoryNameConstants.SUBCATEGORY_ST2R_BAKE)
{ }
public override void CreateAttributes()
{
var buttonAttributes = new ComponentAttributes.ComponentOneButtonAttributes(this, "Set");
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);
p.AddIntegerParameter("Node Number", "Num", "Node number in Straus7", GH_ParamAccess.item);
p.AddNumberParameter("Coordinates", "C", "Coordinates as [X,Y,Z] per node branch", GH_ParamAccess.tree);
}
protected override void RegisterOutputParams(GH_OutputParamManager p)
{
p.AddBooleanParameter("Success", "OK", "True if node coordinates were set successfully", GH_ParamAccess.item);
p.AddTextParameter("Log", "Log", "Debug messages", GH_ParamAccess.list);
}
protected override void SolveInstance(IGH_DataAccess DA)
{
int uid = 0;
int nodeNum = 0;
if (!DA.GetData(0, ref uid)) return;
if (!DA.GetData(1, ref nodeNum)) return;
if (!DA.GetDataTree(2, out GH_Structure<GH_Number> xyzTree)) return;
List<string> log = [];
bool success = false;
if (!_run)
{
DA.SetData(0, success);
DA.SetDataList(1, log);
return;
}
// Check if branch for node exists
GH_Path path = new(nodeNum - 1);
if (!xyzTree.Paths.Contains(path))
{
log.Add($"No coordinate data found for Node {nodeNum}");
DA.SetData(0, success);
DA.SetDataList(1, log);
_run = false;
return;
}
var branch = xyzTree.Branches[nodeNum - 1]; // branch is List<GH_Number>
if (branch.Count != 3)
{
log.Add($"Node {nodeNum} must have exactly 3 numbers (X,Y,Z)");
DA.SetData(0, success);
DA.SetDataList(1, log);
_run = false;
return;
}
double[] xyz =
[
branch[0].Value,
branch[1].Value,
branch[2].Value
];
// Call Straus7 API
long err = St7.St7SetNodeXYZ(uid, nodeNum, xyz);
if (err != 0)
{
log.Add($"Error setting Node {nodeNum} coordinates: {err}");
}
else
{
log.Add($"Node {nodeNum} coordinates set: X={xyz[0]}, Y={xyz[1]}, Z={xyz[2]}");
success = true;
}
DA.SetData(0, success);
DA.SetDataList(1, log);
_run = false; // reset button
}
protected override System.Drawing.Bitmap Icon => Properties.Resources.St7SetNodeXYZIcon;
public override Guid ComponentGuid => new("c1d2e3f4-5678-4abc-9d12-abcdef123464");
}
}