BIM Example Define Loads Provider - idea-statica/ideastatica-public GitHub Wiki
Below is the code for the LoadsProvider
class. The LoadsProvider
implements the ILoadsProvider
interface, which is specific to the Rstab plugin.
using Dlubal.RSTAB8;
using System;
using System.Collections.Generic;
namespace IdeaRstabPlugin.Providers
{
internal class LoadsProvider : ILoadsProvider, IDataCache
{
private enum DataType
{
LoadCase,
LoadCombination,
ResultCombination
}
private readonly Dictionary<(DataType, int), object> _data = new Dictionary<(DataType, int), object>();
private readonly ILoads _loads;
public LoadsProvider(IModel model)
{
_loads = model.GetLoads();
}
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();
Set(no, dataType, data);
return (T)data;
}
private void Set(int no, DataType dataType, object data)
{
_data[(dataType, no)] = data;
}
public IEnumerable<LoadCase> GetLoadCases()
{
foreach (LoadCase loadCase in _loads.GetLoadCases())
{
if (!_loads.HasLoadingResults(loadCase.Loading))
{
continue;
}
Set(loadCase.Loading.No, DataType.LoadCase, loadCase);
yield return loadCase;
}
}
public IEnumerable<LoadCombination> GetLoadCombinations()
{
LoadCombination[] combis = _loads.GetLoadCombinations();
foreach (LoadCombination loadCombination in combis)
{
if (!_loads.HasLoadingResults(loadCombination.Loading))
{
continue;
}
Set(loadCombination.Loading.No, DataType.LoadCombination, loadCombination);
yield return loadCombination;
}
}
public IEnumerable<ResultCombination> GetResultCombinations()
{
for (int i = 0; i < _loads.GetResultCombinations().Length; i++)
{
ResultCombination resultCombination = _loads.GetResultCombinations()[i];
if (!_loads.HasLoadingResults(resultCombination.Loading))
{
continue;
}
CombinationLoading[] rfCombiItems = _loads.GetResultCombination(i, ItemAt.AtIndex).GetLoadings();
int numCombiItems = rfCombiItems.Length;
bool ex = false;
for (int j = 0; j < numCombiItems; j++)
{
if (rfCombiItems[j].Loading.Type == Dlubal.RSTAB8.LoadingType.LoadCaseType || (rfCombiItems[j].Loading.Type == LoadingType.LoadCombinationType))
{
ex = true;
}
}
if (ex)
{
Set(resultCombination.Loading.No, DataType.ResultCombination, resultCombination);
yield return resultCombination;
}
}
}
public LoadCase GetLoadCase(int no)
{
return GetOrCreate(no, DataType.LoadCase, () => _loads.GetLoadCase(no, ItemAt.AtNo).GetData());
}
public LoadCombination GetLoadCombination(int no)
{
return GetOrCreate(no, DataType.LoadCombination, () => _loads.GetLoadCombination(no, ItemAt.AtNo).GetData());
}
public ResultCombination GetResultCombination(int no)
{
return GetOrCreate(no, DataType.ResultCombination, () => _loads.GetResultCombination(no, ItemAt.AtNo).GetData());
}
}
}