using FeMM.Grasshopper.Helpers;
using Grasshopper.Kernel;
using St7API;
using System;
using System.Collections.Generic;
using System.Text;
namespace FeMM.Grasshopper.Components.ST2R
{
public class St7ReadResultCasesComponent : GH_Component
{
private bool _run = false;
public St7ReadResultCasesComponent()
: base("Read Load Cases Names", "ReadLoadCasesNames",
"Reads the names of load cases from the result file",
CategoryNameConstants.CATEGORY_F2R, CategoryNameConstants.SUBCATEGORY_ST2R_BAKE)
{
}
public override void CreateAttributes()
{
var buttonAttributes = new ComponentAttributes.ComponentOneButtonAttributes(this, "Read");
buttonAttributes.ButtonPressed += () =>
{
_run = true;
ExpireSolution(true);
};
m_attributes = buttonAttributes;
}
protected override void RegisterInputParams(GH_InputParamManager p)
{
p.AddIntegerParameter("uID", "ID", "uID of the already opened Straus7 model", GH_ParamAccess.item);
p.AddTextParameter("Result File", "Res", "Full path to the .RST / .NLA / .NLF result file", GH_ParamAccess.item);
}
protected override void RegisterOutputParams(GH_OutputParamManager p)
{
p.AddTextParameter("Case Names", "Names", "Result case names", GH_ParamAccess.list);
p.AddTextParameter("Log", "Log", "Debug log messages", GH_ParamAccess.list);
}
protected override void SolveInstance(IGH_DataAccess DA)
{
int uID = 0;
string resultFile = "";
if (!DA.GetData(0, ref uID)) return;
if (!DA.GetData(1, ref resultFile)) return;
List<string> caseNames = [];
List<string> log = [];
if (!_run)
{
DA.SetDataList(0, caseNames);
DA.SetDataList(1, log);
return;
}
log.Add($"Reading result cases from model uID = {uID}");
log.Add($"Opening result file: {resultFile}");
// --------------------------
// Open result file
// --------------------------
int numPrimary = 0, numSecondary = 0;
int err = St7.St7OpenResultFile(uID, resultFile, null, St7.kNoCombinations, ref numPrimary, ref numSecondary);
if (err != St7.ERR7_NoError)
{
log.Add($"Error opening result file (code {err})");
DA.SetDataList(0, caseNames);
DA.SetDataList(1, log);
_run = false;
return;
}
log.Add($"Result file opened. Primary={numPrimary}, Secondary={numSecondary}");
// --------------------------
// Read result cases
// --------------------------
int caseNum = 1;
while (true)
{
StringBuilder name = new(256);
err = St7.St7GetResultCaseName(uID, caseNum, name, name.Capacity);
if (err != St7.ERR7_NoError)
{
log.Add($"Stopped reading cases at index {caseNum} (API returned code {err})");
break;
}
caseNames.Add(name.ToString().TrimEnd('\0'));
log.Add($"Found case {caseNum}: {name}");
caseNum++;
}
if (caseNames.Count == 0)
log.Add("No result cases found.");
DA.SetDataList(0, caseNames);
DA.SetDataList(1, log);
_run = false;
}
protected override System.Drawing.Bitmap Icon => Properties.Resources.St7ReadResultCasesIcon;
public override Guid ComponentGuid => new("5f7d1c2b-4e8b-4cbb-b2a0-123456789abc");
}
}