BIM Example Define Model Data Provider - idea-statica/ideastatica-public GitHub Wiki
Below is the code for the ModelDataProvider
class. The ModelDataProvider
implements the IModelDataProvider
interface as well as the IDataCache
interface.
- There is a DataType enum that is used in the GetOrCreate methods
using Dlubal.RSTAB8;
using System;
using System.Collections.Generic;
namespace IdeaRstabPlugin.Providers
{
internal class ModelDataProvider : IModelDataProvider, IDataCache
{
private enum DataType
{
Node,
Member,
Line,
CrossSection,
Material
}
private readonly IModelData _modelData;
private readonly Dictionary<(DataType, int), object> _data = new Dictionary<(DataType, int), object>();
public ModelDataProvider(IModel model)
{
using (new LicenceLock(model))
{
_modelData = model.GetModelData();
}
}
public void Clear()
{
_data.Clear();
}
private T GetOrCreate<T>(int no, DataType dataType, Func<T> factory)
{
if (_data.TryGetValue((dataType, no), out object data))
{
return (T)data;
}
data = factory();
_data[(dataType, no)] = data;
return (T)data;
}
public Member GetMember(int no)
{
return GetOrCreate(no, DataType.Member, () => GetIMember(no).GetData());
}
public IMember GetIMember(int no)
{
return _modelData.GetMember(no, ItemAt.AtNo);
}
public IEnumerable<Member> GetMembers()
{
foreach (Member member in _modelData.GetMembers())
{
_data[(DataType.Member, member.No)] = member;
yield return member;
}
}
public Node GetNode(int no)
{
return GetOrCreate(no, DataType.Node, () => _modelData.GetNode(no, ItemAt.AtNo).GetData());
}
}
}