BIM Link Example Defining Geometry Class - idea-statica/ideastatica-public GitHub Wiki
For the RSTAB BimLink, the following files relate to the management and conversion of Model Geometry:
These files are stored in a new folder, 'Geometry' (or 'Graph' as shown in Github).
Looking at the RstabGeometry
class which implements the IGeometry
Interface from IdeaStatiCa.BimImporter:
using IdeaRstabPlugin.BimApi;
using IdeaRstabPlugin.Factories;
using IdeaStatiCa.BimApi;
using IdeaStatiCa.BimImporter;
using System;
using System.Collections.Generic;
using System.Linq;
namespace IdeaRstabPlugin.Geometry
{
internal class RstabGeometry : IGeometry
{
private readonly ILinesAndNodes _linesAndNodes;
private readonly IObjectFactory _objectFactory;
public RstabGeometry(ILinesAndNodes linesAndNodes, IObjectFactory objectFactory)
{
_linesAndNodes = linesAndNodes;
_objectFactory = objectFactory;
}
public IEnumerable<IIdeaMember1D> GetConnectedMembers(IIdeaNode node)
{
if (!(node is RstabNode rstabNode))
{
throw new ArgumentException();
}
return _linesAndNodes
.GetConnectedMembers(rstabNode.No)
.Select(x => _objectFactory.GetMember(x));
}
public IEnumerable<IIdeaNode> GetNodesOnMember(IIdeaMember1D member)
{
if (!(member is RstabMember rstabMember))
{
throw new ArgumentException();
}
return _linesAndNodes
.GetNodesOnMember(rstabMember.No)
.Select(x => _objectFactory.GetNode(x));
}
}
}
The RstabGeometry class relies on the LinesAndNodes Class to extract the geometry from the Rstab Model. It also provides methods that allow updating of members based on Node-Line and Member-Line PairStorage.
The pair storage class is defined in the Utility folder.
The Lines and Nodes class implements the ILinesAndNodes interface.
using Dlubal.RSTAB8;
using IdeaRstabPlugin.Providers;
using IdeaRstabPlugin.Utilities;
using System;
using System.Collections.Generic;
using System.Linq;
namespace IdeaRstabPlugin.Geometry
{
internal class LinesAndNodes : ILinesAndNodes
{
private readonly IModelDataProvider _modelDataProvider;
// (node, line)
private readonly PairStorage<int, int> _nodeLine = new PairStorage<int, int>();
// (member, line)
private readonly PairStorage<int, int> _memberLine = new PairStorage<int, int>();
public LinesAndNodes(IModelDataProvider dataProvider)
{
_modelDataProvider = dataProvider;
}
public void UpdateMembers(IEnumerable<int> members)
{
UpdateMembers(members.Select(x => _modelDataProvider.GetMember(x)));
}
public void UpdateAll()
{
_nodeLine.Clear();
_memberLine.Clear();
UpdateMembers(_modelDataProvider.GetMembers());
}
public IEnumerable<int> GetConnectedMembers(int nodeNo)
{
return _nodeLine
.GetRights(nodeNo)
.SelectMany(x => _memberLine.GetLefts(x));
}
public IEnumerable<int> GetNodesOnMember(int memberNo)
{
int lineNo = _memberLine
.GetRights(memberNo)
.First();
return _nodeLine
.GetLefts(lineNo);
}
private void UpdateMembers(IEnumerable<Member> members)
{
HashSet<int> addedNodes = new HashSet<int>();
foreach (Member member in members)
{
_memberLine.RemoveLeft(member.No);
_memberLine.Add(member.No, member.No);
_nodeLine.RemoveRight(member.No);
List<Node> nodes = new List<Node>();
nodes.Add(_modelDataProvider.GetNode(member.StartNodeNo));
nodes.Add(_modelDataProvider.GetNode(member.EndNodeNo));
_nodeLine.Add(nodes.Select(x => x.No), member.No);
foreach (Node node in nodes)
{
addedNodes.Add(node.No);
}
}
}
}
}