7eb1de4709
* HostAppVersion v21 and v22 following SDK updates * Working POC for material and section proxies * Refactoring section unpacking Refactoring in accordance with PropertiesExtractor example * Material unpackers * Notes and documentation * More explanations * materialId - Interim solution for viewer filtering is appending the materialId to assignments for each object - For FRAME this was easy - For SHELL not so easy. No GetMaterial method avaiable given a AreaObj sectionName. Implemented lightweight materialCache based on cDatabaseTable. Marked as temporary based on previous discussions * Explicit dictionary entries * Repeated property strings as consts - Fair point for repeated strings in the CsiMaterialPropertyExtractor.cs - Even more reason to include this across all repeated strings. Categories of properties screaming out for this. Added additionally * PR review comments - Dictionary lookups for material and section proxies - Only create proxies for assigned sections and materials (not pretty) * refactor(etabs): adds singleton converter cache for material and section relationships (#514) * This is a workaround for Revit's order of operations when initializing (#511) * This is a workaround for Revit's order of operations when initializing * Fix event listening * adds a singleton cache for material and section relationships to csishared * updating extraction results and simplifying classes * Only allow methods on classes as opposed to anonymous lambdas for Event Subscription (#512) * This is a workaround for Revit's order of operations when initializing * Fix event listening * Only allow methods on classes as opposed to anonymous lambdas * formatting * fix tests * weakreference found should remove subscription * doument model store fix (#516) * testing commit --------- Co-authored-by: Adam Hathcock <adamhathcock@users.noreply.github.com> Co-authored-by: Björn <steinhagen.bjoern@gmail.com> * resolving conflicts, testing and small tweaks - merged dev into branch - added "type" parameter to group proxies for sections in order to distinguish between frame sections and shell sections --------- Co-authored-by: Claire Kuang <kuang.claire@gmail.com> Co-authored-by: Adam Hathcock <adamhathcock@users.noreply.github.com>
111 lines
3.7 KiB
C#
111 lines
3.7 KiB
C#
using Speckle.Connectors.CSiShared.HostApp.Helpers;
|
|
using Speckle.Connectors.ETABSShared.HostApp.Helpers;
|
|
using Speckle.Converters.CSiShared.ToSpeckle.Helpers;
|
|
using Speckle.Sdk.Models.Proxies;
|
|
|
|
namespace Speckle.Connectors.ETABSShared.HostApp;
|
|
|
|
/// <summary>
|
|
/// Unpacks and creates proxies for frame and shell sections from the model.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// Provides a unified approach to section extraction across different section types.
|
|
/// Leverages specialized extractors to handle complex property retrieval. Centralizes
|
|
/// section proxy creation with robust error handling and logging mechanisms.
|
|
/// </remarks>
|
|
public class EtabsSectionUnpacker : ISectionUnpacker
|
|
{
|
|
private readonly EtabsSectionPropertyExtractor _propertyExtractor;
|
|
private readonly CsiToSpeckleCacheSingleton _csiToSpeckleCacheSingleton;
|
|
|
|
public EtabsSectionUnpacker(
|
|
EtabsSectionPropertyExtractor propertyExtractor,
|
|
CsiToSpeckleCacheSingleton csiToSpeckleCacheSingleton
|
|
)
|
|
{
|
|
_propertyExtractor = propertyExtractor;
|
|
_csiToSpeckleCacheSingleton = csiToSpeckleCacheSingleton;
|
|
}
|
|
|
|
public IEnumerable<GroupProxy> UnpackSections()
|
|
{
|
|
foreach (GroupProxy frameSectionProxy in UnpackFrameSections())
|
|
{
|
|
yield return frameSectionProxy;
|
|
}
|
|
|
|
foreach (GroupProxy shellSectionProxy in UnpackShellSections())
|
|
{
|
|
yield return shellSectionProxy;
|
|
}
|
|
}
|
|
|
|
private IEnumerable<GroupProxy> UnpackFrameSections()
|
|
{
|
|
foreach (var entry in _csiToSpeckleCacheSingleton.FrameSectionCache)
|
|
{
|
|
string sectionName = entry.Key;
|
|
List<string> frameIds = entry.Value;
|
|
|
|
// Initialize properties outside the if statement
|
|
Dictionary<string, object?> properties = new Dictionary<string, object?>();
|
|
|
|
// get the properties of the section
|
|
// openings will have objects assigned to them, but won't have properties
|
|
// sectionName is initialized with string.Empty, but api ref returns string "None"
|
|
if (sectionName != "None")
|
|
{
|
|
properties = _propertyExtractor.ExtractFrameSectionProperties(sectionName);
|
|
}
|
|
|
|
// create the section proxy
|
|
GroupProxy sectionProxy =
|
|
new()
|
|
{
|
|
id = sectionName,
|
|
name = sectionName,
|
|
applicationId = sectionName,
|
|
objects = frameIds,
|
|
["type"] = "Frame Section", // since sectionProxies are a flat list, need some way to distinguish from shell
|
|
["properties"] = properties // openings will just have an empty dict here
|
|
};
|
|
|
|
yield return sectionProxy;
|
|
}
|
|
}
|
|
|
|
private IEnumerable<GroupProxy> UnpackShellSections()
|
|
{
|
|
foreach (var entry in _csiToSpeckleCacheSingleton.ShellSectionCache)
|
|
{
|
|
string sectionName = entry.Key;
|
|
List<string> frameIds = entry.Value;
|
|
|
|
// Initialize properties outside the if statement
|
|
Dictionary<string, object?> properties = new Dictionary<string, object?>();
|
|
|
|
// get the properties of the section
|
|
// openings will have objects assigned to them, but won't have properties
|
|
// sectionName is initialized with string.Empty, but api ref returns string "None"
|
|
if (sectionName != "None")
|
|
{
|
|
properties = _propertyExtractor.ExtractShellSectionProperties(sectionName);
|
|
}
|
|
|
|
// create the section proxy
|
|
GroupProxy sectionProxy =
|
|
new()
|
|
{
|
|
id = sectionName,
|
|
name = sectionName,
|
|
applicationId = sectionName,
|
|
objects = frameIds,
|
|
["type"] = "Shell Section", // since sectionProxies are a flat list, need some way to distinguish from frame
|
|
["properties"] = properties // openings will just have an empty dict here
|
|
};
|
|
|
|
yield return sectionProxy;
|
|
}
|
|
}
|
|
}
|