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 IGeometryInterface 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);
                }
            }
        }
    }
}
⚠️ **GitHub.com Fallback** ⚠️