From 68fecb5bcd210c2b8cd573f1429f4ff729f456eb Mon Sep 17 00:00:00 2001 From: Martin Ashton Date: Thu, 22 Jan 2026 14:02:13 -0500 Subject: [PATCH 1/5] Added IElementKindInfo and the IsLeaf concept --- .../ElementParameterInfo/ParameterSummary.cs | 10 +++--- .../ObjectModel/IElementKindInfo.cs | 34 +++++++++++++++++++ .../vim/Vim.Format/ObjectModel/ObjectModel.cs | 24 ++++++++++++- 3 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 src/cs/vim/Vim.Format/ObjectModel/IElementKindInfo.cs diff --git a/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterSummary.cs b/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterSummary.cs index 6495d66..62d6ec2 100644 --- a/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterSummary.cs +++ b/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterSummary.cs @@ -6,7 +6,7 @@ namespace Vim.Format.ElementParameterInfo { - public class ParameterSummary + public class ParameterSummary : IElementKindInfo { public string SummaryKey { get; set; } @@ -16,6 +16,8 @@ public class ParameterSummary public string ElementKind { get; set; } + public bool ElementKindIsLeaf { get; set; } + public string CategoryNameFull { get; set; } public string Name { get; set; } // Derived from Descriptor @@ -198,7 +200,7 @@ public static IEnumerable GetParameterSummary( { var parameterSummaryKey = g.Key; var descriptorIndex = parameterSummaryKey.DescriptorIndex; - var elementKind = parameterSummaryKey.ElementKind; + var elementKindValue = parameterSummaryKey.ElementKind; var categoryIndex = parameterSummaryKey.CategoryIndex; var displayValues = g.Select(i => Parameter.SplitValues(parameterTable.GetValue(i)).DisplayValue).ToList(); @@ -211,8 +213,6 @@ public static IEnumerable GetParameterSummary( { SummaryKey = parameterSummaryKey.ToString(), Descriptor = descriptorIndex, - ElementKindEnum = elementKind, - ElementKind = elementKind.ToDisplayString(), CategoryNameFull = categoryTable.GetNameFull(categoryIndex), Name = name, NamePbiCaseSensitive = name.ToPbiCaseSensitiveString(), @@ -226,6 +226,8 @@ public static IEnumerable GetParameterSummary( CountDistinct = countDistinct }; + ps.SetElementKindInfo(elementKindValue); + return ps; }); } diff --git a/src/cs/vim/Vim.Format/ObjectModel/IElementKindInfo.cs b/src/cs/vim/Vim.Format/ObjectModel/IElementKindInfo.cs new file mode 100644 index 0000000..9335b5a --- /dev/null +++ b/src/cs/vim/Vim.Format/ObjectModel/IElementKindInfo.cs @@ -0,0 +1,34 @@ +using Vim.Util; + +namespace Vim.Format.ObjectModel +{ + public interface IElementKindInfo + { + string ElementKind { get; set; } + ElementKind ElementKindEnum { get; set; } + bool ElementKindIsLeaf { get; set; } + } + + public static class IElementKindInfoExtensions + { + public static void SetElementKindInfo( + this IElementKindInfo info, + ElementKind elementKind) + { + if (info == null) return; + info.ElementKind = elementKind.ToDisplayString(); + info.ElementKindEnum = elementKind; + info.ElementKindIsLeaf = elementKind.IsLeaf(); + } + + public static void SetElementKindInfo( + this IElementKindInfo info, + int? elementIndex, + ElementKind[] elementKinds) + { + if (info == null) return; + var elementKind = elementKinds.ElementAtOrDefault(elementIndex ?? -1, ElementKind.Unknown); + info.SetElementKindInfo(elementKind); + } + } +} diff --git a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs index fa19da2..ddcf884 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/ObjectModel.cs @@ -267,7 +267,7 @@ public enum ElementKind public static class ElementKindExtensions { /// - /// Returns a display string representation of the element kind, allowing it to be ranked visually in user interfaces. + /// Returns a display string representation of the element kind. /// public static string ToDisplayString(this ElementKind k) { @@ -310,6 +310,28 @@ public static string ToDisplayString(this ElementKind k) } return str; } + + /// + /// Returns true if the ElementKind is considered to be a terminal leaf in its hierarchy. + /// This is used to facilitate the removal of Family and FamilyType elements in + /// lists which may count elements by category. + /// + /// For example, to accureately count elements with the "Door" category in a building, + /// you wouldn't want to include Family and FamilyType elements which also have the + /// "Door" category; this would lead to over-counting since Family and FamilyType elements + /// should not be considered countable "leaf" nodes (they are conceptual). + /// + public static bool IsLeaf(this ElementKind k) + { + switch (k) + { + case ElementKind.Family: + case ElementKind.FamilyType: + return false; + default: + return true; + } + } } public interface IElementKindTable : IEntityTable From b2e1e4e29168eb1203f9aff9ac09ef9d23936a49 Mon Sep 17 00:00:00 2001 From: Martin Ashton Date: Sun, 25 Jan 2026 15:38:07 -0500 Subject: [PATCH 2/5] Added FamilyDescendants, refactoring --- .../ElementParameterInfoServiceTests.cs | 4 +- .../ElementMeasureInfo.cs | 27 ++++++- .../ElementParameterInfoService.cs | 18 ++--- .../ParameterMeasureInfo.cs | 23 ++++-- .../ElementParameterInfo/ParameterSummary.cs | 2 +- src/cs/vim/Vim.Format/FamilyDescendants.cs | 74 +++++++++++++++++++ .../Vim.Format/ObjectModel/EntityTableSet.cs | 5 +- .../ObjectModel/IElementKindInfo.cs | 4 +- 8 files changed, 131 insertions(+), 26 deletions(-) create mode 100644 src/cs/vim/Vim.Format/FamilyDescendants.cs diff --git a/src/cs/vim/Vim.Format.Tests/ElementParameterInfoServiceTests.cs b/src/cs/vim/Vim.Format.Tests/ElementParameterInfoServiceTests.cs index 1af0a61..fe7b0a1 100644 --- a/src/cs/vim/Vim.Format.Tests/ElementParameterInfoServiceTests.cs +++ b/src/cs/vim/Vim.Format.Tests/ElementParameterInfoServiceTests.cs @@ -34,7 +34,7 @@ public static void TestElementParameterInfoService(string vimFilePath) var elementLevelInfos = infos.ElementLevelInfos; var elementMeasureInfos = infos.ElementMeasureInfos; var elementIfcInfos = infos.ElementIfcInfos; - var parameterMeasureTypes = infos.ParameterMeasureTypes; + var parameterMeasureInfos = infos.ParameterMeasureInfos; var validationTableSet = new EntityTableSet( vimFileInfo, @@ -49,7 +49,7 @@ public static void TestElementParameterInfoService(string vimFilePath) Assert.AreEqual(elementInstanceCount, elementIfcInfos.Length); var parameterCount = validationTableSet.ParameterTable.RowCount; - Assert.AreEqual(parameterCount, parameterMeasureTypes.Length); + Assert.AreEqual(parameterCount, parameterMeasureInfos.Length); var familyInstanceElementMap = validationTableSet.ElementIndexMaps.FamilyInstanceIndexFromElementIndex; diff --git a/src/cs/vim/Vim.Format/ElementParameterInfo/ElementMeasureInfo.cs b/src/cs/vim/Vim.Format/ElementParameterInfo/ElementMeasureInfo.cs index 813f502..1721140 100644 --- a/src/cs/vim/Vim.Format/ElementParameterInfo/ElementMeasureInfo.cs +++ b/src/cs/vim/Vim.Format/ElementParameterInfo/ElementMeasureInfo.cs @@ -21,22 +21,31 @@ public int GetElementIndexOrNone() => Element.IndexOrDefault(); public double? Angle { get; set; } + public bool AngleIsRevitBuiltIn { get; set; } public double? Slope { get; set; } + public bool SlopeIsRevitBuiltIn { get; set; } public double? Length { get; set; } + public bool LengthIsRevitBuiltIn { get; set; } public double? Width { get; set; } + public bool WidthIsRevitBuiltIn { get; set; } public double? Height { get; set; } + public bool HeightIsRevitBuiltIn { get; set; } public double? Area { get; set; } + public bool AreaIsRevitBuiltIn { get; set; } public double? Volume { get; set; } + public bool VolumeIsRevitBuiltIn { get; set; } public double? Depth { get; set; } + public bool DepthIsRevitBuiltIn { get; set; } public double? Diameter { get; set; } + public bool DiameterIsRevitBuiltIn { get; set; } /// /// Constructor @@ -45,7 +54,7 @@ public ElementMeasureInfo( Element element, ElementTable elementTable, ParameterTable parameterTable, - MeasureType[] parameterMeasureInfos) + ParameterMeasureInfo[] parameterMeasureInfos) { Element = element; @@ -68,44 +77,54 @@ public ElementMeasureInfo( private void ReadParameters( ParameterTable parameterTable, - MeasureType[] parameterMeasureInfos, + ParameterMeasureInfo[] parameterMeasureInfos, IReadOnlyList parameterIndices) { foreach (var parameterIndex in parameterIndices) { - var mt = parameterMeasureInfos[parameterIndex]; + var pmi = parameterMeasureInfos[parameterIndex]; + var measureType = pmi.MeasureType; var (nativeValue, _) = Parameter.SplitValues(parameterTable.Column_Value[parameterIndex]); var parsed = Parameter.ParseNativeValueAsDouble(nativeValue); - switch (mt) + switch (measureType) { case MeasureType.Angle: Angle = parsed; + AngleIsRevitBuiltIn = pmi.IsRevitBuiltIn; break; case MeasureType.Slope: Slope = parsed; + SlopeIsRevitBuiltIn = pmi.IsRevitBuiltIn; break; case MeasureType.Length: Length = parsed; + LengthIsRevitBuiltIn = pmi.IsRevitBuiltIn; break; case MeasureType.Width: Width = parsed; + WidthIsRevitBuiltIn = pmi.IsRevitBuiltIn; break; case MeasureType.Height: Height = parsed; + HeightIsRevitBuiltIn = pmi.IsRevitBuiltIn; break; case MeasureType.Area: Area = parsed; + AreaIsRevitBuiltIn = pmi.IsRevitBuiltIn; break; case MeasureType.Volume: Volume = parsed; + VolumeIsRevitBuiltIn = pmi.IsRevitBuiltIn; break; case MeasureType.Depth: Depth = parsed; + DepthIsRevitBuiltIn = pmi.IsRevitBuiltIn; break; case MeasureType.Diameter: Diameter = parsed; + DiameterIsRevitBuiltIn = pmi.IsRevitBuiltIn; break; case MeasureType.Unknown: default: diff --git a/src/cs/vim/Vim.Format/ElementParameterInfo/ElementParameterInfoService.cs b/src/cs/vim/Vim.Format/ElementParameterInfo/ElementParameterInfoService.cs index b6f9a7e..8f8a45b 100644 --- a/src/cs/vim/Vim.Format/ElementParameterInfo/ElementParameterInfoService.cs +++ b/src/cs/vim/Vim.Format/ElementParameterInfo/ElementParameterInfoService.cs @@ -55,10 +55,10 @@ public class ElementParameterInfo public FamilyTypeUniformatInfo[] FamilyTypeUniformatInfos { get; set; } /// - /// An array of MeasureType values representing the measure types of each Parameter. + /// An array of ParameterMeasureInfos representing the measure types of each Parameter. /// Items in this array are aligned to the Parameter table. /// - public MeasureType[] ParameterMeasureTypes { get; set; } + public ParameterMeasureInfo[] ParameterMeasureInfos { get; set; } } public static class ElementParameterInfoService @@ -136,9 +136,9 @@ public static ElementParameterInfo GetElementParameterInfos( levelInfoMap, levelInfoByBimDocumentIndex); - var parameterMeasureTypes = CreateParameterMeasureTypes(parameterTable, descriptorTable); + var parameterMeasureInfos = CreateParameterMeasureInfos(parameterTable, descriptorTable); - var elementMeasureInfos = CreateElementMeasureInfos(elementTable, parameterTable, parameterMeasureTypes); + var elementMeasureInfos = CreateElementMeasureInfos(elementTable, parameterTable, parameterMeasureInfos); var elementOffsetInfos = CreateElementOffsetInfos(elementTable, parameterTable, elementIndexMaps); @@ -154,7 +154,7 @@ public static ElementParameterInfo GetElementParameterInfos( ElementLevelInfos = elementLevelInfos, ElementMeasureInfos = elementMeasureInfos, ElementOffsetInfos = elementOffsetInfos, - ParameterMeasureTypes = parameterMeasureTypes, + ParameterMeasureInfos = parameterMeasureInfos, ElementIfcInfos = elementIfcInfos, FamilyOmniClassInfos = familyOmniClassInfos, FamilyTypeUniformatInfos = familyTypeUniformatInfos, @@ -259,7 +259,7 @@ private static ElementLevelInfo[] CreateElementLevelInfos( .ToArray(); } - public static MeasureType[] CreateParameterMeasureTypes( + public static ParameterMeasureInfo[] CreateParameterMeasureInfos( ParameterTable parameterTable, ParameterDescriptorTable parameterDescriptorTable) => parameterTable.Column_ParameterDescriptorIndex @@ -268,17 +268,17 @@ public static MeasureType[] CreateParameterMeasureTypes( { var parameterDescriptorNameLowerInvariant = parameterDescriptorTable.GetName(pdi).ToLowerInvariant(); var parameterDescriptorGuid = parameterDescriptorTable.GetGuid(pdi); - return ParameterMeasureInfo.ParseMeasureType(parameterDescriptorNameLowerInvariant, parameterDescriptorGuid); + return ParameterMeasureInfo.ParseMeasureInfo(parameterDescriptorNameLowerInvariant, parameterDescriptorGuid); }) .ToArray(); public static ElementMeasureInfo[] CreateElementMeasureInfos( ElementTable elementTable, ParameterTable parameterTable, - MeasureType[] parameterMeasureTypes) + ParameterMeasureInfo[] parameterMeasureInfos) => elementTable .AsParallel() - .Select(e => new ElementMeasureInfo(e, elementTable, parameterTable, parameterMeasureTypes)) + .Select(e => new ElementMeasureInfo(e, elementTable, parameterTable, parameterMeasureInfos)) .ToArray(); public static ElementOffsetInfo[] CreateElementOffsetInfos( diff --git a/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterMeasureInfo.cs b/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterMeasureInfo.cs index 76a5c8c..2fd684f 100644 --- a/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterMeasureInfo.cs +++ b/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterMeasureInfo.cs @@ -34,8 +34,17 @@ public enum MeasureType // - *DO NOT CHANGE THE ACTUAL ENUM VALUES* } - public static class ParameterMeasureInfo + public class ParameterMeasureInfo { + public MeasureType MeasureType { get; } + public bool IsRevitBuiltIn { get; } + + public ParameterMeasureInfo(MeasureType measureType, bool isRevitBuiltIn) + { + MeasureType = measureType; + IsRevitBuiltIn = isRevitBuiltIn; + } + /// /// Maps the lowercase parameter name to the MeasureType. /// @@ -57,15 +66,15 @@ public static class ParameterMeasureInfo // }) // .ToArray(); - public static MeasureType ParseMeasureType(string parameterDescriptorNameLowerInvariant, string parameterDescriptorGuid) + public static ParameterMeasureInfo ParseMeasureInfo(string parameterDescriptorNameLowerInvariant, string parameterDescriptorGuid) { // NOTE: parameterDescriptorGuid is either the Revit built-in ID (if the parameter is built-in), or a guid (if the parameter is shared). - if (BuiltInIdToMeasureTypeMap.TryGetValue(parameterDescriptorGuid, out var measureType)) - return measureType; + if (RevitBuiltInIdToMeasureTypeMap.TryGetValue(parameterDescriptorGuid, out var measureType)) + return new ParameterMeasureInfo(measureType, true); // Compare the input descriptor name to the known mapping if (NameLowerInvariantToMeasureTypeMap.TryGetValue(parameterDescriptorNameLowerInvariant, out measureType)) - return measureType; + return new ParameterMeasureInfo(measureType, false); // Fall back to a string comparison to catch any localized parameter descriptor names which either start or end with the key followed by a space and digits, // for example: "Length of Beam" or "Pipe Length 1" @@ -82,7 +91,7 @@ public static MeasureType ParseMeasureType(string parameterDescriptorNameLowerIn // return candidateMeasureType; //} - return MeasureType.Unknown; + return new ParameterMeasureInfo(MeasureType.Unknown, false); } public static void GetQuantityOrDisplayValue( @@ -154,7 +163,7 @@ public static void GetQuantityOrDisplayValue( /// /// Maps the built-in parameter Revit ID to the MeasureType /// - public static readonly Dictionary BuiltInIdToMeasureTypeMap = new Dictionary() + public static readonly Dictionary RevitBuiltInIdToMeasureTypeMap = new Dictionary() { { "-1001817", MeasureType.Angle }, // PROFILE_ANGLE, "Angle" { "-1001826", MeasureType.Angle }, // PROFILE1_ANGLE, "Angle" diff --git a/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterSummary.cs b/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterSummary.cs index 62d6ec2..c7f5615 100644 --- a/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterSummary.cs +++ b/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterSummary.cs @@ -12,7 +12,7 @@ public class ParameterSummary : IElementKindInfo public int Descriptor { get; set; } - public ElementKind ElementKindEnum { get; set; } + public int ElementKindEnum { get; set; } public string ElementKind { get; set; } diff --git a/src/cs/vim/Vim.Format/FamilyDescendants.cs b/src/cs/vim/Vim.Format/FamilyDescendants.cs new file mode 100644 index 0000000..bce8994 --- /dev/null +++ b/src/cs/vim/Vim.Format/FamilyDescendants.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Vim.Format.ObjectModel; +using Vim.Util; + +namespace Vim.Format +{ + public class FamilyDescendants + { + public DictionaryOfLists FamilyElementsToFamilyInstanceElements { get; } = new DictionaryOfLists(); + public DictionaryOfLists FamilyTypeElementsToFamilyInstanceElements { get; } = new DictionaryOfLists(); + + /// + /// Constructor + /// + public FamilyDescendants(EntityTableSet tableSet) + { + var familyInstanceTable = tableSet.FamilyInstanceTable; + var familyTypeTable = tableSet.FamilyTypeTable; + var familyTable = tableSet.FamilyTable; + + // Build a mapping of FamilyTypeElement -> FamilyInstanceElement by traversing the FamilyInstance table. + + for (var i = 0; i < familyInstanceTable.RowCount; ++i) + { + var familyInstanceElementIndex = familyInstanceTable.GetElementIndex(i); + if (familyInstanceElementIndex == EntityRelation.None) + continue; + + var familyTypeIndex = familyInstanceTable.GetFamilyTypeIndex(i); + if (familyTypeIndex == EntityRelation.None) + continue; + + var familyTypeElementIndex = familyTypeTable.GetElementIndex(familyTypeIndex); + if (familyTypeElementIndex == EntityRelation.None) + continue; + + FamilyTypeElementsToFamilyInstanceElements.Add(familyTypeElementIndex, familyInstanceElementIndex); + } + + // Build a mapping of FamilyElement -> FamilyInstanceElement by traversing the FamilyType table. + + for (var i = 0; i < familyTypeTable.RowCount; ++i) + { + var familyTypeElementIndex = familyTypeTable.GetElementIndex(i); + if (familyTypeElementIndex == EntityRelation.None) + continue; + + var familyIndex = familyTypeTable.GetFamilyIndex(i); + if (familyIndex == EntityRelation.None) + continue; + + var familyElementIndex = familyTable.GetElementIndex(familyIndex); + if (familyElementIndex == EntityRelation.None) + continue; + + if (!FamilyTypeElementsToFamilyInstanceElements.TryGetValue(familyTypeElementIndex, out var familyInstanceElementIndices)) + continue; + + foreach (var familyInstanceElementIndex in familyInstanceElementIndices) + { + FamilyElementsToFamilyInstanceElements.Add(familyElementIndex, familyInstanceElementIndex); + } + } + } + + public bool TryGetFamilyInstanceElementsFromFamilyElement(int familyElementIndex, out List familyInstanceElementIndices) + => FamilyElementsToFamilyInstanceElements.TryGetValue(familyElementIndex, out familyInstanceElementIndices); + + public bool TryGetFamilyInstanceElementsFromFamilyTypeElement(int familyTypeElementIndex, out List familyInstanceElementIndices) + => FamilyTypeElementsToFamilyInstanceElements.TryGetValue(familyTypeElementIndex, out familyInstanceElementIndices); + } +} diff --git a/src/cs/vim/Vim.Format/ObjectModel/EntityTableSet.cs b/src/cs/vim/Vim.Format/ObjectModel/EntityTableSet.cs index 280c784..e774f7b 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/EntityTableSet.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/EntityTableSet.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; - +using Vim.Util; using static Vim.Format.Serializer; using ReadOnlyIndexMap = System.Collections.Generic.IReadOnlyDictionary; @@ -77,6 +77,9 @@ public static ElementKind[] GetElementKinds(FileInfo vimFileInfo) return ets.GetElementKinds(); } + + public FamilyDescendants GetFamilyDescendants() + => new FamilyDescendants(this); } public partial class CategoryTable diff --git a/src/cs/vim/Vim.Format/ObjectModel/IElementKindInfo.cs b/src/cs/vim/Vim.Format/ObjectModel/IElementKindInfo.cs index 9335b5a..c0272c2 100644 --- a/src/cs/vim/Vim.Format/ObjectModel/IElementKindInfo.cs +++ b/src/cs/vim/Vim.Format/ObjectModel/IElementKindInfo.cs @@ -5,7 +5,7 @@ namespace Vim.Format.ObjectModel public interface IElementKindInfo { string ElementKind { get; set; } - ElementKind ElementKindEnum { get; set; } + int ElementKindEnum { get; set; } bool ElementKindIsLeaf { get; set; } } @@ -17,7 +17,7 @@ public static void SetElementKindInfo( { if (info == null) return; info.ElementKind = elementKind.ToDisplayString(); - info.ElementKindEnum = elementKind; + info.ElementKindEnum = (int) elementKind; info.ElementKindIsLeaf = elementKind.IsLeaf(); } From 3de5fd8e4f2169092d72b1c7cd1b78e3b1d84471 Mon Sep 17 00:00:00 2001 From: Martin Ashton Date: Wed, 28 Jan 2026 16:03:21 -0500 Subject: [PATCH 3/5] Added CategoryDomain and ElementDomain --- src/cs/vim/Vim.Format/CategoryDomain.cs | 1209 +++++++++++++++++++++++ src/cs/vim/Vim.Format/ElementDomain.cs | 117 +++ 2 files changed, 1326 insertions(+) create mode 100644 src/cs/vim/Vim.Format/CategoryDomain.cs create mode 100644 src/cs/vim/Vim.Format/ElementDomain.cs diff --git a/src/cs/vim/Vim.Format/CategoryDomain.cs b/src/cs/vim/Vim.Format/CategoryDomain.cs new file mode 100644 index 0000000..5b91a3f --- /dev/null +++ b/src/cs/vim/Vim.Format/CategoryDomain.cs @@ -0,0 +1,1209 @@ +using System.Collections.Generic; + +namespace Vim.Format +{ + public enum CategoryDomainEnum + { + Conceptual = 0, + Physical = 10, + Topography = 20, + Group = 30, + Rooms = 40, + System = 50, + Link = 60, + Annotation = 70, + Symbol = 80, + } + + public static class CategoryDomainEnumExtensions + { + public static CategoryDomainEnum GetCategoryDomain( + this Dictionary categoryDomainMap, + string builtInCategory) + => categoryDomainMap.TryGetValue(builtInCategory, out var result) + ? result + : CategoryDomainEnum.Conceptual; // fall back to conceptual. + + public static string ToDisplayString(this CategoryDomainEnum c) + => c.ToString("G"); + } + + /// + /// The CategoryDomain is a labeling of each Revit Built-in category to help filter + /// whether elements belong to more conceptual domains or whether they + /// have a physical presence in buildings. + /// + public static class CategoryDomain + { + /// + /// Returns a mapping of Revit built-in categories to domains + /// + public static Dictionary GetCategoryDomainMap() + { + return new Dictionary + { + { "INVALID", CategoryDomainEnum.Conceptual }, + { "OST_AbutmentFoundations", CategoryDomainEnum.Physical }, + { "OST_AbutmentFoundationTags", CategoryDomainEnum.Annotation }, + { "OST_AbutmentPiles", CategoryDomainEnum.Physical }, + { "OST_AbutmentPileTags", CategoryDomainEnum.Annotation }, + { "OST_AbutmentWalls", CategoryDomainEnum.Physical }, + { "OST_AbutmentWallTags", CategoryDomainEnum.Annotation }, + { "OST_AdaptivePoints", CategoryDomainEnum.Conceptual }, + { "OST_AdaptivePoints_HiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_AdaptivePoints_Lines", CategoryDomainEnum.Conceptual }, + { "OST_AdaptivePoints_Planes", CategoryDomainEnum.Conceptual }, + { "OST_AdaptivePoints_Points", CategoryDomainEnum.Conceptual }, + { "OST_Alignments", CategoryDomainEnum.Conceptual }, + { "OST_AlignmentsTags", CategoryDomainEnum.Annotation }, + { "OST_AlignmentStationLabels", CategoryDomainEnum.Conceptual }, + { "OST_AlignmentStationLabelSets", CategoryDomainEnum.Conceptual }, + { "OST_AlwaysExcludedInAllViews", CategoryDomainEnum.Conceptual }, + { "OST_Analemma", CategoryDomainEnum.Conceptual }, + { "OST_AnalysisDisplayStyle", CategoryDomainEnum.Conceptual }, + { "OST_AnalysisResults", CategoryDomainEnum.Conceptual }, + { "OST_AnalyticalMember", CategoryDomainEnum.Conceptual }, + { "OST_AnalyticalMemberCrossSection", CategoryDomainEnum.Conceptual }, + { "OST_AnalyticalMemberLocalCoordSys", CategoryDomainEnum.Conceptual }, + { "OST_AnalyticalMemberTags", CategoryDomainEnum.Annotation }, + { "OST_AnalyticalNodes", CategoryDomainEnum.Conceptual }, + { "OST_AnalyticalNodes_Lines", CategoryDomainEnum.Conceptual }, + { "OST_AnalyticalNodes_Planes", CategoryDomainEnum.Conceptual }, + { "OST_AnalyticalNodes_Points", CategoryDomainEnum.Conceptual }, + { "OST_AnalyticalOpening", CategoryDomainEnum.Conceptual }, + { "OST_AnalyticalOpeningTags", CategoryDomainEnum.Annotation }, + { "OST_AnalyticalPanel", CategoryDomainEnum.Physical }, + { "OST_AnalyticalPanelLocalCoordSys", CategoryDomainEnum.Conceptual }, + { "OST_AnalyticalPanelTags", CategoryDomainEnum.Annotation }, + { "OST_AnalyticalPipeConnectionLineSymbol", CategoryDomainEnum.Symbol }, + { "OST_AnalyticalPipeConnections", CategoryDomainEnum.Conceptual }, + { "OST_AnalyticalRigidLinks", CategoryDomainEnum.Conceptual }, + { "OST_AnalyticSpaces", CategoryDomainEnum.Conceptual }, + { "OST_AnalyticSurfaces", CategoryDomainEnum.Conceptual }, + { "OST_AnnotationCrop", CategoryDomainEnum.Conceptual }, + { "OST_AnnotationCropSpecial", CategoryDomainEnum.Conceptual }, + { "OST_AppearanceAsset", CategoryDomainEnum.Conceptual }, + { "OST_ApproachSlabs", CategoryDomainEnum.Physical }, + { "OST_ApproachSlabTags", CategoryDomainEnum.Annotation }, + { "OST_ArcWallRectOpening", CategoryDomainEnum.Conceptual }, + { "OST_AreaColorFill", CategoryDomainEnum.Conceptual }, + { "OST_AreaInteriorFill", CategoryDomainEnum.Conceptual }, + { "OST_AreaInteriorFillVisibility", CategoryDomainEnum.Conceptual }, + { "OST_AreaLoads", CategoryDomainEnum.Conceptual }, + { "OST_AreaLoadTags", CategoryDomainEnum.Annotation }, + { "OST_AreaPolylines", CategoryDomainEnum.Conceptual }, + { "OST_AreaReference", CategoryDomainEnum.Conceptual }, + { "OST_AreaReferenceVisibility", CategoryDomainEnum.Conceptual }, + { "OST_AreaRein", CategoryDomainEnum.Conceptual }, + { "OST_AreaReinBoundary", CategoryDomainEnum.Conceptual }, + { "OST_AreaReinSketchOverride", CategoryDomainEnum.Conceptual }, + { "OST_AreaReinSpanSymbol", CategoryDomainEnum.Symbol }, + { "OST_AreaReinTags", CategoryDomainEnum.Annotation }, + { "OST_AreaReinXVisibility", CategoryDomainEnum.Conceptual }, + { "OST_AreaReport_Arc_Minus", CategoryDomainEnum.Conceptual }, + { "OST_AreaReport_Arc_Plus", CategoryDomainEnum.Conceptual }, + { "OST_AreaReport_Boundary", CategoryDomainEnum.Conceptual }, + { "OST_AreaReport_Triangle", CategoryDomainEnum.Conceptual }, + { "OST_Areas", CategoryDomainEnum.Conceptual }, + { "OST_AreaSchemeLines", CategoryDomainEnum.Conceptual }, + { "OST_AreaSchemes", CategoryDomainEnum.Conceptual }, + { "OST_AreaTags", CategoryDomainEnum.Annotation }, + { "OST_Assemblies", CategoryDomainEnum.Group }, + { "OST_AssemblyOrigin", CategoryDomainEnum.Conceptual }, + { "OST_AssemblyOrigin_Lines", CategoryDomainEnum.Conceptual }, + { "OST_AssemblyOrigin_Planes", CategoryDomainEnum.Conceptual }, + { "OST_AssemblyOrigin_Points", CategoryDomainEnum.Conceptual }, + { "OST_AssemblyTags", CategoryDomainEnum.Annotation }, + { "OST_AudioVisualDevices", CategoryDomainEnum.Physical }, + { "OST_AudioVisualDevicesHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_AudioVisualDeviceTags", CategoryDomainEnum.Annotation }, + { "OST_Automatic", CategoryDomainEnum.Conceptual }, + { "OST_AxisOfRotation", CategoryDomainEnum.Conceptual }, + { "OST_AxisX", CategoryDomainEnum.Conceptual }, + { "OST_AxisY", CategoryDomainEnum.Conceptual }, + { "OST_AxisZ", CategoryDomainEnum.Conceptual }, + { "OST_BasePointAxisX", CategoryDomainEnum.Conceptual }, + { "OST_BasePointAxisY", CategoryDomainEnum.Conceptual }, + { "OST_BasePointAxisZ", CategoryDomainEnum.Conceptual }, + { "OST_BeamAnalytical", CategoryDomainEnum.Conceptual }, + { "OST_BeamAnalyticalTags", CategoryDomainEnum.Annotation }, + { "OST_BeamEndSegment", CategoryDomainEnum.Conceptual }, + { "OST_BeamLocalCoordSys", CategoryDomainEnum.Conceptual }, + { "OST_BeamStartSegment", CategoryDomainEnum.Conceptual }, + { "OST_BeamSystemTags", CategoryDomainEnum.Annotation }, + { "OST_Blocks", CategoryDomainEnum.Conceptual }, + { "OST_BoundaryConditions", CategoryDomainEnum.Conceptual }, + { "OST_BraceAnalytical", CategoryDomainEnum.Conceptual }, + { "OST_BraceAnalyticalTags", CategoryDomainEnum.Annotation }, + { "OST_BraceEndSegment", CategoryDomainEnum.Conceptual }, + { "OST_BraceLocalCoordSys", CategoryDomainEnum.Conceptual }, + { "OST_BraceStartSegment", CategoryDomainEnum.Conceptual }, + { "OST_BranchPanelScheduleTemplates", CategoryDomainEnum.Conceptual }, + { "OST_BridgeAbutmentHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_BridgeAbutments", CategoryDomainEnum.Physical }, + { "OST_BridgeAbutmentTags", CategoryDomainEnum.Annotation }, + { "OST_BridgeArches", CategoryDomainEnum.Physical }, + { "OST_BridgeArchHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_BridgeArchTags", CategoryDomainEnum.Annotation }, + { "OST_BridgeBearingHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_BridgeBearings", CategoryDomainEnum.Physical }, + { "OST_BridgeBearingTags", CategoryDomainEnum.Annotation }, + { "OST_BridgeCableHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_BridgeCables", CategoryDomainEnum.Physical }, + { "OST_BridgeCableTags", CategoryDomainEnum.Annotation }, + { "OST_BridgeDeckHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_BridgeDecks", CategoryDomainEnum.Physical }, + { "OST_BridgeDeckTags", CategoryDomainEnum.Annotation }, + { "OST_BridgeFoundationHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_BridgeFoundations", CategoryDomainEnum.Physical }, + { "OST_BridgeFoundationTags", CategoryDomainEnum.Annotation }, + { "OST_BridgeFraming", CategoryDomainEnum.Physical }, + { "OST_BridgeFramingCrossBracing", CategoryDomainEnum.Physical }, + { "OST_BridgeFramingCrossBracingTags", CategoryDomainEnum.Annotation }, + { "OST_BridgeFramingDiaphragms", CategoryDomainEnum.Physical }, + { "OST_BridgeFramingDiaphragmTags", CategoryDomainEnum.Annotation }, + { "OST_BridgeFramingHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_BridgeFramingTags", CategoryDomainEnum.Annotation }, + { "OST_BridgeFramingTrusses", CategoryDomainEnum.Physical }, + { "OST_BridgeFramingTrussTags", CategoryDomainEnum.Annotation }, + { "OST_BridgeGirderHiddenLines", CategoryDomainEnum.Annotation }, + { "OST_BridgeGirders", CategoryDomainEnum.Physical }, + { "OST_BridgeGirderTags", CategoryDomainEnum.Annotation }, + { "OST_BridgePierHiddenLines", CategoryDomainEnum.Annotation }, + { "OST_BridgePiers", CategoryDomainEnum.Physical }, + { "OST_BridgePierTags", CategoryDomainEnum.Annotation }, + { "OST_BridgeTowerHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_BridgeTowers", CategoryDomainEnum.Physical }, + { "OST_BridgeTowerTags", CategoryDomainEnum.Annotation }, + { "OST_BrokenSectionLine", CategoryDomainEnum.Conceptual }, + { "OST_BuildingPad", CategoryDomainEnum.Physical }, + { "OST_CableTray", CategoryDomainEnum.Physical }, + { "OST_CableTrayCenterLine", CategoryDomainEnum.Conceptual }, + { "OST_CableTrayDrop", CategoryDomainEnum.Physical }, + { "OST_CableTrayFitting", CategoryDomainEnum.Physical }, + { "OST_CableTrayFittingCenterLine", CategoryDomainEnum.Conceptual }, + { "OST_CableTrayFittingTags", CategoryDomainEnum.Annotation }, + { "OST_CableTrayRiseDrop", CategoryDomainEnum.Physical }, + { "OST_CableTrayRun", CategoryDomainEnum.Physical }, + { "OST_CableTrayTags", CategoryDomainEnum.Annotation }, + { "OST_Cage", CategoryDomainEnum.Conceptual }, + { "OST_CalloutBoundary", CategoryDomainEnum.Conceptual }, + { "OST_CalloutHeads", CategoryDomainEnum.Conceptual }, + { "OST_CalloutLeaderLine", CategoryDomainEnum.Conceptual }, + { "OST_Callouts", CategoryDomainEnum.Conceptual }, + { "OST_Camera_Lines", CategoryDomainEnum.Conceptual }, + { "OST_Cameras", CategoryDomainEnum.Conceptual }, + { "OST_Casework", CategoryDomainEnum.Physical }, + { "OST_CaseworkHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_CaseworkTags", CategoryDomainEnum.Annotation }, + { "OST_Catalogs", CategoryDomainEnum.Conceptual }, + { "OST_CeilingOpening", CategoryDomainEnum.Conceptual }, + { "OST_Ceilings", CategoryDomainEnum.Physical }, + { "OST_CeilingsCut", CategoryDomainEnum.Conceptual }, + { "OST_CeilingsCutPattern", CategoryDomainEnum.Conceptual }, + { "OST_CeilingsDefault", CategoryDomainEnum.Conceptual }, + { "OST_CeilingsFinish1", CategoryDomainEnum.Conceptual }, + { "OST_CeilingsFinish2", CategoryDomainEnum.Conceptual }, + { "OST_CeilingsHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_CeilingsInsulation", CategoryDomainEnum.Conceptual }, + { "OST_CeilingsMembrane", CategoryDomainEnum.Conceptual }, + { "OST_CeilingsProjection", CategoryDomainEnum.Conceptual }, + { "OST_CeilingsStructure", CategoryDomainEnum.Conceptual }, + { "OST_CeilingsSubstrate", CategoryDomainEnum.Conceptual }, + { "OST_CeilingsSurfacePattern", CategoryDomainEnum.Conceptual }, + { "OST_CeilingTags", CategoryDomainEnum.Annotation }, + { "OST_CenterLines", CategoryDomainEnum.Conceptual }, + { "OST_CLines", CategoryDomainEnum.Conceptual }, + { "OST_CloudLines", CategoryDomainEnum.Conceptual }, + { "OST_ColorFillLegends", CategoryDomainEnum.Conceptual }, + { "OST_ColorFillSchema", CategoryDomainEnum.Conceptual }, + { "OST_ColumnAnalytical", CategoryDomainEnum.Conceptual }, + { "OST_ColumnAnalyticalGeometry", CategoryDomainEnum.Conceptual }, + { "OST_ColumnAnalyticalRigidLinks", CategoryDomainEnum.Conceptual }, + { "OST_ColumnAnalyticalTags", CategoryDomainEnum.Annotation }, + { "OST_ColumnEndSegment", CategoryDomainEnum.Conceptual }, + { "OST_ColumnLocalCoordSys", CategoryDomainEnum.Conceptual }, + { "OST_ColumnOpening", CategoryDomainEnum.Conceptual }, + { "OST_Columns", CategoryDomainEnum.Physical }, + { "OST_ColumnsHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_ColumnStartSegment", CategoryDomainEnum.Conceptual }, + { "OST_ColumnTags", CategoryDomainEnum.Annotation }, + { "OST_CommunicationDevices", CategoryDomainEnum.Physical }, + { "OST_CommunicationDeviceTags", CategoryDomainEnum.Annotation }, + { "OST_CompassInner", CategoryDomainEnum.Conceptual }, + { "OST_CompassOuter", CategoryDomainEnum.Conceptual }, + { "OST_CompassPrimaryMonth", CategoryDomainEnum.Conceptual }, + { "OST_CompassSecondaryMonth", CategoryDomainEnum.Conceptual }, + { "OST_CompassSection", CategoryDomainEnum.Conceptual }, + { "OST_CompassSectionFilled", CategoryDomainEnum.Conceptual }, + { "OST_ComponentRepeater", CategoryDomainEnum.Conceptual }, + { "OST_ComponentRepeaterSlot", CategoryDomainEnum.Conceptual }, + { "OST_Conduit", CategoryDomainEnum.Physical }, + { "OST_ConduitCenterLine", CategoryDomainEnum.Conceptual }, + { "OST_ConduitDrop", CategoryDomainEnum.Physical }, + { "OST_ConduitFitting", CategoryDomainEnum.Physical }, + { "OST_ConduitFittingCenterLine", CategoryDomainEnum.Conceptual }, + { "OST_ConduitFittingTags", CategoryDomainEnum.Annotation }, + { "OST_ConduitRiseDrop", CategoryDomainEnum.Physical }, + { "OST_ConduitRun", CategoryDomainEnum.System }, + { "OST_ConduitStandards", CategoryDomainEnum.Conceptual }, + { "OST_ConduitTags", CategoryDomainEnum.Annotation }, + { "OST_ConnectorElem", CategoryDomainEnum.Conceptual }, + { "OST_ConnectorElemXAxis", CategoryDomainEnum.Conceptual }, + { "OST_ConnectorElemYAxis", CategoryDomainEnum.Conceptual }, + { "OST_ConnectorElemZAxis", CategoryDomainEnum.Conceptual }, + { "OST_Constraints", CategoryDomainEnum.Conceptual }, + { "OST_ContourLabels", CategoryDomainEnum.Conceptual }, + { "OST_ControlAxisX", CategoryDomainEnum.Conceptual }, + { "OST_ControlAxisY", CategoryDomainEnum.Conceptual }, + { "OST_ControlAxisZ", CategoryDomainEnum.Conceptual }, + { "OST_ControlLocal", CategoryDomainEnum.Conceptual }, + { "OST_CoordinateSystem", CategoryDomainEnum.Conceptual }, + { "OST_Coordination_Model", CategoryDomainEnum.Conceptual }, + { "OST_Cornices", CategoryDomainEnum.Physical }, + { "OST_Coupler", CategoryDomainEnum.Physical }, + { "OST_CouplerHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_CouplerTags", CategoryDomainEnum.Annotation }, + { "OST_CoverType", CategoryDomainEnum.Conceptual }, + { "OST_CropBoundary", CategoryDomainEnum.Conceptual }, + { "OST_CropBoundarySpecial", CategoryDomainEnum.Conceptual }, + { "OST_Curtain_Systems", CategoryDomainEnum.Conceptual }, + { "OST_CurtainGrids", CategoryDomainEnum.Conceptual }, + { "OST_CurtainGridsCurtaSystem", CategoryDomainEnum.Conceptual }, + { "OST_CurtainGridsRoof", CategoryDomainEnum.Conceptual }, + { "OST_CurtainGridsSystem", CategoryDomainEnum.Conceptual }, + { "OST_CurtainGridsWall", CategoryDomainEnum.Conceptual }, + { "OST_CurtainWallMullions", CategoryDomainEnum.Physical }, + { "OST_CurtainWallMullionsCut", CategoryDomainEnum.Conceptual }, + { "OST_CurtainWallMullionsHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_CurtainWallMullionTags", CategoryDomainEnum.Annotation }, + { "OST_CurtainWallPanels", CategoryDomainEnum.Physical }, + { "OST_CurtainWallPanelsHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_CurtainWallPanelTags", CategoryDomainEnum.Annotation }, + { "OST_CurtaSystem", CategoryDomainEnum.Physical }, + { "OST_CurtaSystemFaceManager", CategoryDomainEnum.Conceptual }, + { "OST_CurtaSystemHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_CurtaSystemTags", CategoryDomainEnum.Annotation }, + { "OST_Curves", CategoryDomainEnum.Conceptual }, + { "OST_CurvesMediumLines", CategoryDomainEnum.Conceptual }, + { "OST_CurvesThinLines", CategoryDomainEnum.Conceptual }, + { "OST_CurvesWideLines", CategoryDomainEnum.Conceptual }, + { "OST_CutOutlines", CategoryDomainEnum.Conceptual }, + { "OST_DataDevices", CategoryDomainEnum.Physical }, + { "OST_DataDeviceTags", CategoryDomainEnum.Annotation }, + { "OST_DataPanelScheduleTemplates", CategoryDomainEnum.Conceptual }, + { "OST_DecalElement", CategoryDomainEnum.Physical }, + { "OST_DecalType", CategoryDomainEnum.Conceptual }, + { "OST_DemolishedLines", CategoryDomainEnum.Conceptual }, + { "OST_DesignOptions", CategoryDomainEnum.Conceptual }, + { "OST_DesignOptionSets", CategoryDomainEnum.Conceptual }, + { "OST_DetailComponents", CategoryDomainEnum.Conceptual }, + { "OST_DetailComponentsHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_DetailComponentTags", CategoryDomainEnum.Annotation }, + { "OST_Dimensions", CategoryDomainEnum.Conceptual }, + { "OST_DimLockControlLeader", CategoryDomainEnum.Conceptual }, + { "OST_DirectionEdgeLines", CategoryDomainEnum.Conceptual }, + { "OST_DisplacementElements", CategoryDomainEnum.Conceptual }, + { "OST_DisplacementPath", CategoryDomainEnum.Conceptual }, + { "OST_DividedPath", CategoryDomainEnum.Conceptual }, + { "OST_DividedSurface", CategoryDomainEnum.Conceptual }, + { "OST_DividedSurface_DiscardedDivisionLines", CategoryDomainEnum.Conceptual }, + { "OST_DividedSurface_Gridlines", CategoryDomainEnum.Conceptual }, + { "OST_DividedSurface_Nodes", CategoryDomainEnum.Conceptual }, + { "OST_DividedSurface_PatternFill", CategoryDomainEnum.Conceptual }, + { "OST_DividedSurface_PatternLines", CategoryDomainEnum.Conceptual }, + { "OST_DividedSurface_PreDividedSurface", CategoryDomainEnum.Conceptual }, + { "OST_DividedSurface_TransparentFace", CategoryDomainEnum.Conceptual }, + { "OST_DividedSurfaceBelt", CategoryDomainEnum.Conceptual }, + { "OST_DivisionProfile", CategoryDomainEnum.Conceptual }, + { "OST_DivisionRules", CategoryDomainEnum.Conceptual }, + { "OST_Divisions", CategoryDomainEnum.Conceptual }, + { "OST_Doors", CategoryDomainEnum.Physical }, + { "OST_DoorsFrameMullionCut", CategoryDomainEnum.Conceptual }, + { "OST_DoorsFrameMullionProjection", CategoryDomainEnum.Conceptual }, + { "OST_DoorsGlassCut", CategoryDomainEnum.Conceptual }, + { "OST_DoorsGlassProjection", CategoryDomainEnum.Conceptual }, + { "OST_DoorsHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_DoorsOpeningCut", CategoryDomainEnum.Conceptual }, + { "OST_DoorsOpeningProjection", CategoryDomainEnum.Conceptual }, + { "OST_DoorsPanelCut", CategoryDomainEnum.Conceptual }, + { "OST_DoorsPanelProjection", CategoryDomainEnum.Conceptual }, + { "OST_DoorTags", CategoryDomainEnum.Annotation }, + { "OST_DormerOpeningIncomplete", CategoryDomainEnum.Conceptual }, + { "OST_DSR_ArrowHeadStyleId", CategoryDomainEnum.Conceptual }, + { "OST_DSR_CenterlinePatternCatId", CategoryDomainEnum.Conceptual }, + { "OST_DSR_CenterlineTickMarkStyleId", CategoryDomainEnum.Conceptual }, + { "OST_DSR_DimStyleHeavyEndCategoryId", CategoryDomainEnum.Conceptual }, + { "OST_DSR_DimStyleHeavyEndCatId", CategoryDomainEnum.Conceptual }, + { "OST_DSR_DimStyleTickCategoryId", CategoryDomainEnum.Conceptual }, + { "OST_DSR_InteriorTickMarkStyleId", CategoryDomainEnum.Conceptual }, + { "OST_DSR_LeaderTickMarkStyleId", CategoryDomainEnum.Conceptual }, + { "OST_DSR_LineAndTextAttrCategoryId", CategoryDomainEnum.Conceptual }, + { "OST_DSR_LineAndTextAttrFontId", CategoryDomainEnum.Conceptual }, + { "OST_DuctAccessory", CategoryDomainEnum.Physical }, + { "OST_DuctAccessoryTags", CategoryDomainEnum.Annotation }, + { "OST_DuctAnalyticalSegments", CategoryDomainEnum.Conceptual }, + { "OST_DuctAnalyticalSegmentTags", CategoryDomainEnum.Annotation }, + { "OST_DuctColorFillLegends", CategoryDomainEnum.Conceptual }, + { "OST_DuctColorFills", CategoryDomainEnum.Conceptual }, + { "OST_DuctCurves", CategoryDomainEnum.Physical }, + { "OST_DuctCurvesCenterLine", CategoryDomainEnum.Conceptual }, + { "OST_DuctCurvesContour", CategoryDomainEnum.Conceptual }, + { "OST_DuctCurvesDrop", CategoryDomainEnum.Physical }, + { "OST_DuctCurvesInsulation", CategoryDomainEnum.Physical }, + { "OST_DuctCurvesLining", CategoryDomainEnum.Physical }, + { "OST_DuctCurvesRiseDrop", CategoryDomainEnum.Physical }, + { "OST_DuctFitting", CategoryDomainEnum.Physical }, + { "OST_DuctFittingCenterLine", CategoryDomainEnum.Conceptual }, + { "OST_DuctFittingInsulation", CategoryDomainEnum.Physical }, + { "OST_DuctFittingLining", CategoryDomainEnum.Physical }, + { "OST_DuctFittingTags", CategoryDomainEnum.Annotation }, + { "OST_DuctInsulations", CategoryDomainEnum.Physical }, + { "OST_DuctInsulationsTags", CategoryDomainEnum.Annotation }, + { "OST_DuctLinings", CategoryDomainEnum.Physical }, + { "OST_DuctLiningsTags", CategoryDomainEnum.Annotation }, + { "OST_DuctSystem", CategoryDomainEnum.System }, + { "OST_DuctSystem_Reference", CategoryDomainEnum.Conceptual }, + { "OST_DuctSystem_Reference_Visibility", CategoryDomainEnum.Conceptual }, + { "OST_DuctTags", CategoryDomainEnum.Annotation }, + { "OST_DuctTerminal", CategoryDomainEnum.Physical }, + { "OST_DuctTerminalTags", CategoryDomainEnum.Annotation }, + { "OST_EAConstructions", CategoryDomainEnum.Conceptual }, + { "OST_EdgeSlab", CategoryDomainEnum.Physical }, + { "OST_EditCutProfile", CategoryDomainEnum.Conceptual }, + { "OST_ElecDistributionSys", CategoryDomainEnum.Conceptual }, + { "OST_ELECTRICAL_AreaBasedLoads_Boundary", CategoryDomainEnum.Conceptual }, + { "OST_ELECTRICAL_AreaBasedLoads_InteriorFill", CategoryDomainEnum.Conceptual }, + { "OST_ELECTRICAL_AreaBasedLoads_InteriorFill_Visibility", CategoryDomainEnum.Conceptual }, + { "OST_ELECTRICAL_AreaBasedLoads_Reference", CategoryDomainEnum.Conceptual }, + { "OST_ELECTRICAL_AreaBasedLoads_Reference_Visibility", CategoryDomainEnum.Conceptual }, + { "OST_ELECTRICAL_AreaBasedLoads_Tags", CategoryDomainEnum.Annotation }, + { "OST_ElectricalAnalyticalFeeder", CategoryDomainEnum.Physical }, + { "OST_ElectricalAnalyticalTransformer", CategoryDomainEnum.Physical }, + { "OST_ElectricalCircuit", CategoryDomainEnum.System }, + { "OST_ElectricalCircuitNaming", CategoryDomainEnum.Conceptual }, + { "OST_ElectricalCircuitTags", CategoryDomainEnum.Annotation }, + { "OST_ElectricalDemandFactor", CategoryDomainEnum.Conceptual }, + { "OST_ElectricalDemandFactorDefinitions", CategoryDomainEnum.Conceptual }, + { "OST_ElectricalEquipment", CategoryDomainEnum.Physical }, + { "OST_ElectricalEquipmentHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_ElectricalEquipmentTags", CategoryDomainEnum.Annotation }, + { "OST_ElectricalFixtures", CategoryDomainEnum.Physical }, + { "OST_ElectricalFixturesHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_ElectricalFixtureTags", CategoryDomainEnum.Annotation }, + { "OST_ElectricalInternalCircuits", CategoryDomainEnum.Conceptual }, + { "OST_ElectricalLoadClassifications", CategoryDomainEnum.Conceptual }, + { "OST_ElectricalLoadSet", CategoryDomainEnum.Conceptual }, + { "OST_ElectricalLoadZoneInstance", CategoryDomainEnum.Conceptual }, + { "OST_ElectricalLoadZoneType", CategoryDomainEnum.Conceptual }, + { "OST_ElectricalPowerSource", CategoryDomainEnum.Conceptual }, + { "OST_ElectricalVoltage", CategoryDomainEnum.Annotation }, + { "OST_ElectricalZoneEquipment", CategoryDomainEnum.Conceptual }, + { "OST_Elev", CategoryDomainEnum.Conceptual }, + { "OST_ElevationMarks", CategoryDomainEnum.Annotation }, + { "OST_Entourage", CategoryDomainEnum.Physical }, + { "OST_EntourageHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_EntourageTags", CategoryDomainEnum.Annotation }, + { "OST_EPS_Demolished", CategoryDomainEnum.Conceptual }, + { "OST_EPS_Existing", CategoryDomainEnum.Conceptual }, + { "OST_EPS_Future", CategoryDomainEnum.Conceptual }, + { "OST_EPS_New", CategoryDomainEnum.Conceptual }, + { "OST_EPS_Temporary", CategoryDomainEnum.Conceptual }, + { "OST_ExpansionJointHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_ExpansionJoints", CategoryDomainEnum.Physical }, + { "OST_ExpansionJointTags", CategoryDomainEnum.Annotation }, + { "OST_Extrusions", CategoryDomainEnum.Conceptual }, + { "OST_FabricAreaBoundary", CategoryDomainEnum.Conceptual }, + { "OST_FabricAreas", CategoryDomainEnum.Conceptual }, + { "OST_FabricAreaSketchEnvelopeLines", CategoryDomainEnum.Conceptual }, + { "OST_FabricAreaSketchSheetsLines", CategoryDomainEnum.Conceptual }, + { "OST_FabricAreaTags", CategoryDomainEnum.Annotation }, + { "OST_FabricationContainment", CategoryDomainEnum.Physical }, + { "OST_FabricationContainmentCenterLine", CategoryDomainEnum.Conceptual }, + { "OST_FabricationContainmentDrop", CategoryDomainEnum.Physical }, + { "OST_FabricationContainmentRise", CategoryDomainEnum.Physical }, + { "OST_FabricationContainmentSymbology", CategoryDomainEnum.Symbol }, + { "OST_FabricationContainmentTags", CategoryDomainEnum.Annotation }, + { "OST_FabricationDuctwork", CategoryDomainEnum.Physical }, + { "OST_FabricationDuctworkCenterLine", CategoryDomainEnum.Conceptual }, + { "OST_FabricationDuctworkDrop", CategoryDomainEnum.Physical }, + { "OST_FabricationDuctworkInsulation", CategoryDomainEnum.Physical }, + { "OST_FabricationDuctworkLining", CategoryDomainEnum.Physical }, + { "OST_FabricationDuctworkRise", CategoryDomainEnum.Physical }, + { "OST_FabricationDuctworkStiffeners", CategoryDomainEnum.Physical }, + { "OST_FabricationDuctworkStiffenerTags", CategoryDomainEnum.Annotation }, + { "OST_FabricationDuctworkSymbology", CategoryDomainEnum.Symbol }, + { "OST_FabricationDuctworkTags", CategoryDomainEnum.Annotation }, + { "OST_FabricationHangers", CategoryDomainEnum.Physical }, + { "OST_FabricationHangerTags", CategoryDomainEnum.Annotation }, + { "OST_FabricationPartsTmpGraphicDrag", CategoryDomainEnum.Conceptual }, + { "OST_FabricationPartsTmpGraphicEnd", CategoryDomainEnum.Conceptual }, + { "OST_FabricationPipework", CategoryDomainEnum.Physical }, + { "OST_FabricationPipeworkCenterLine", CategoryDomainEnum.Conceptual }, + { "OST_FabricationPipeworkDrop", CategoryDomainEnum.Physical }, + { "OST_FabricationPipeworkInsulation", CategoryDomainEnum.Physical }, + { "OST_FabricationPipeworkRise", CategoryDomainEnum.Physical }, + { "OST_FabricationPipeworkSymbology", CategoryDomainEnum.Symbol }, + { "OST_FabricationPipeworkTags", CategoryDomainEnum.Annotation }, + { "OST_FabricationServiceElements", CategoryDomainEnum.Physical }, + { "OST_FabricReinforcement", CategoryDomainEnum.Physical }, + { "OST_FabricReinforcementBoundary", CategoryDomainEnum.Conceptual }, + { "OST_FabricReinforcementTags", CategoryDomainEnum.Annotation }, + { "OST_FabricReinforcementWire", CategoryDomainEnum.Physical }, + { "OST_FabricReinSpanSymbol", CategoryDomainEnum.Symbol }, + { "OST_FaceSplitter", CategoryDomainEnum.Conceptual }, + { "OST_Fascia", CategoryDomainEnum.Physical }, + { "OST_FasciaTags", CategoryDomainEnum.Annotation }, + { "OST_FilledRegion", CategoryDomainEnum.Conceptual }, + { "OST_FillPatterns", CategoryDomainEnum.Conceptual }, + { "OST_FireAlarmDevices", CategoryDomainEnum.Physical }, + { "OST_FireAlarmDeviceTags", CategoryDomainEnum.Annotation }, + { "OST_FireProtection", CategoryDomainEnum.Physical }, + { "OST_FireProtectionHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_FireProtectionTags", CategoryDomainEnum.Annotation }, + { "OST_Fixtures", CategoryDomainEnum.Physical }, + { "OST_FlexDuctCurves", CategoryDomainEnum.Physical }, + { "OST_FlexDuctCurvesCenterLine", CategoryDomainEnum.Conceptual }, + { "OST_FlexDuctCurvesContour", CategoryDomainEnum.Conceptual }, + { "OST_FlexDuctCurvesInsulation", CategoryDomainEnum.Physical }, + { "OST_FlexDuctCurvesPattern", CategoryDomainEnum.Conceptual }, + { "OST_FlexDuctTags", CategoryDomainEnum.Annotation }, + { "OST_FlexPipeCurves", CategoryDomainEnum.Physical }, + { "OST_FlexPipeCurvesCenterLine", CategoryDomainEnum.Conceptual }, + { "OST_FlexPipeCurvesContour", CategoryDomainEnum.Conceptual }, + { "OST_FlexPipeCurvesInsulation", CategoryDomainEnum.Conceptual }, + { "OST_FlexPipeCurvesPattern", CategoryDomainEnum.Conceptual }, + { "OST_FlexPipeTags", CategoryDomainEnum.Annotation }, + { "OST_FloorAnalytical", CategoryDomainEnum.Conceptual }, + { "OST_FloorAnalyticalTags", CategoryDomainEnum.Annotation }, + { "OST_FloorLocalCoordSys", CategoryDomainEnum.Conceptual }, + { "OST_FloorOpening", CategoryDomainEnum.Conceptual }, + { "OST_Floors", CategoryDomainEnum.Physical }, + { "OST_FloorsAnalyticalGeometry", CategoryDomainEnum.Conceptual }, + { "OST_FloorsCut", CategoryDomainEnum.Conceptual }, + { "OST_FloorsCutPattern", CategoryDomainEnum.Conceptual }, + { "OST_FloorsDefault", CategoryDomainEnum.Conceptual }, + { "OST_FloorsFinish1", CategoryDomainEnum.Conceptual }, + { "OST_FloorsFinish2", CategoryDomainEnum.Conceptual }, + { "OST_FloorsInsulation", CategoryDomainEnum.Conceptual }, + { "OST_FloorsInteriorEdges", CategoryDomainEnum.Conceptual }, + { "OST_FloorsMembrane", CategoryDomainEnum.Conceptual }, + { "OST_FloorsProjection", CategoryDomainEnum.Conceptual }, + { "OST_FloorsSplitLines", CategoryDomainEnum.Conceptual }, + { "OST_FloorsStructure", CategoryDomainEnum.Conceptual }, + { "OST_FloorsSubstrate", CategoryDomainEnum.Conceptual }, + { "OST_FloorsSurfacePattern", CategoryDomainEnum.Conceptual }, + { "OST_FloorTags", CategoryDomainEnum.Annotation }, + { "OST_Fluids", CategoryDomainEnum.Conceptual }, + { "OST_FndSlabLocalCoordSys", CategoryDomainEnum.Conceptual }, + { "OST_FoodServiceEquipment", CategoryDomainEnum.Physical }, + { "OST_FoodServiceEquipmentHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_FoodServiceEquipmentTags", CategoryDomainEnum.Annotation }, + { "OST_FootingAnalyticalGeometry", CategoryDomainEnum.Conceptual }, + { "OST_FootingSpanDirectionSymbol", CategoryDomainEnum.Symbol }, + { "OST_FoundationSlabAnalytical", CategoryDomainEnum.Conceptual }, + { "OST_FoundationSlabAnalyticalTags", CategoryDomainEnum.Annotation }, + { "OST_FramingAnalyticalGeometry", CategoryDomainEnum.Conceptual }, + { "OST_Furniture", CategoryDomainEnum.Physical }, + { "OST_FurnitureHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_FurnitureSystems", CategoryDomainEnum.Physical }, + { "OST_FurnitureSystemsHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_FurnitureSystemTags", CategoryDomainEnum.Annotation }, + { "OST_FurnitureTags", CategoryDomainEnum.Annotation }, + { "OST_gbXML_Ceiling", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_ExteriorWall", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_FixedSkylight", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_FixedWindow", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_InteriorFloor", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_InteriorWall", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_NonSlidingDoor", CategoryDomainEnum.Conceptual }, + { "OST_GbXML_Opening", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_OpeningAir", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_OperableSkylight", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_OperableWindow", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_RaisedFloor", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_Roof", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_Shade", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_SlabOnGrade", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_SlidingDoor", CategoryDomainEnum.Conceptual }, + { "OST_GbXML_SType_Exterior", CategoryDomainEnum.Conceptual }, + { "OST_GbXML_SType_Interior", CategoryDomainEnum.Conceptual }, + { "OST_GbXML_SType_Shade", CategoryDomainEnum.Conceptual }, + { "OST_GbXML_SType_Underground", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_SurfaceAir", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_UndergroundCeiling", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_UndergroundSlab", CategoryDomainEnum.Conceptual }, + { "OST_gbXML_UndergroundWall", CategoryDomainEnum.Conceptual }, + { "OST_GbXMLFaces", CategoryDomainEnum.Conceptual }, + { "OST_GenericAnnotation", CategoryDomainEnum.Annotation }, + { "OST_GenericLines", CategoryDomainEnum.Conceptual }, + { "OST_GenericModel", CategoryDomainEnum.Physical }, + { "OST_GenericModelHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_GenericModelTags", CategoryDomainEnum.Annotation }, + { "OST_Girder", CategoryDomainEnum.Conceptual }, + { "OST_GraphicalWarning_OpenConnector", CategoryDomainEnum.Conceptual }, + { "OST_GridChains", CategoryDomainEnum.Conceptual }, + { "OST_GridHeads", CategoryDomainEnum.Annotation }, + { "OST_Grids", CategoryDomainEnum.Conceptual }, + { "OST_GuideGrid", CategoryDomainEnum.Conceptual }, + { "OST_Gutter", CategoryDomainEnum.Physical }, + { "OST_GutterTags", CategoryDomainEnum.Annotation }, + { "OST_HandrailTags", CategoryDomainEnum.Annotation }, + { "OST_Hardscape", CategoryDomainEnum.Physical }, + { "OST_HardscapeHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_HardscapeTags", CategoryDomainEnum.Annotation }, + { "OST_HiddenFloorLines", CategoryDomainEnum.Conceptual }, + { "OST_HiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_HiddenStructuralColumnLines", CategoryDomainEnum.Conceptual }, + { "OST_HiddenStructuralFoundationLines", CategoryDomainEnum.Conceptual }, + { "OST_HiddenStructuralFramingLines", CategoryDomainEnum.Conceptual }, + { "OST_HiddenWallLines", CategoryDomainEnum.Conceptual }, + { "OST_HorizontalBracing", CategoryDomainEnum.Conceptual }, + { "OST_HostFin", CategoryDomainEnum.Conceptual }, + { "OST_HostFinCeiling", CategoryDomainEnum.Conceptual }, + { "OST_HostFinFloor", CategoryDomainEnum.Conceptual }, + { "OST_HostFinHF", CategoryDomainEnum.Conceptual }, + { "OST_HostFinRoof", CategoryDomainEnum.Conceptual }, + { "OST_HostFinTags", CategoryDomainEnum.Annotation }, + { "OST_HostFinWall", CategoryDomainEnum.Conceptual }, + { "OST_HostTemplate", CategoryDomainEnum.Conceptual }, + { "OST_HVAC_Load_Building_Types", CategoryDomainEnum.Conceptual }, + { "OST_HVAC_Load_Schedules", CategoryDomainEnum.Conceptual }, + { "OST_HVAC_Load_Space_Types", CategoryDomainEnum.Conceptual }, + { "OST_HVAC_Zones", CategoryDomainEnum.Conceptual }, + { "OST_HVAC_Zones_Boundary", CategoryDomainEnum.Conceptual }, + { "OST_HVAC_Zones_ColorFill", CategoryDomainEnum.Conceptual }, + { "OST_HVAC_Zones_InteriorFill", CategoryDomainEnum.Conceptual }, + { "OST_HVAC_Zones_InteriorFill_Visibility", CategoryDomainEnum.Conceptual }, + { "OST_HVAC_Zones_Reference", CategoryDomainEnum.Conceptual }, + { "OST_HVAC_Zones_Reference_Visibility", CategoryDomainEnum.Conceptual }, + { "OST_ImportObjectStyles", CategoryDomainEnum.Conceptual }, + { "OST_InstanceDrivenLineStyle", CategoryDomainEnum.Conceptual }, + { "OST_InsulationLines", CategoryDomainEnum.Conceptual }, + { "OST_InternalAreaLoads", CategoryDomainEnum.Conceptual }, + { "OST_InternalAreaLoadTags", CategoryDomainEnum.Annotation }, + { "OST_InternalLineLoads", CategoryDomainEnum.Conceptual }, + { "OST_InternalLineLoadTags", CategoryDomainEnum.Annotation }, + { "OST_InternalLoads", CategoryDomainEnum.Conceptual }, + { "OST_InternalPointLoads", CategoryDomainEnum.Conceptual }, + { "OST_InternalPointLoadTags", CategoryDomainEnum.Annotation }, + { "OST_InvisibleLines", CategoryDomainEnum.Conceptual }, + { "OST_IOS", CategoryDomainEnum.Conceptual }, + { "OST_IOS_GeoLocations", CategoryDomainEnum.Conceptual }, + { "OST_IOS_GeoSite", CategoryDomainEnum.Conceptual }, + { "OST_IOSAligningLine", CategoryDomainEnum.Conceptual }, + { "OST_IOSAlignmentGraphics", CategoryDomainEnum.Conceptual }, + { "OST_IOSArrays", CategoryDomainEnum.Group }, + { "OST_IOSAttachedDetailGroups", CategoryDomainEnum.Conceptual }, + { "OST_IOSBackedUpElements", CategoryDomainEnum.Conceptual }, + { "OST_IOSBBoxScreenSize", CategoryDomainEnum.Conceptual }, + { "OST_IOSConstructionLine", CategoryDomainEnum.Conceptual }, + { "OST_IOSCrashGraphics", CategoryDomainEnum.Conceptual }, + { "OST_IOSCuttingGeometry", CategoryDomainEnum.Conceptual }, + { "OST_IOSDatumPlane", CategoryDomainEnum.Conceptual }, + { "OST_IOSDetailGroups", CategoryDomainEnum.Conceptual }, + { "OST_IOSDragBox", CategoryDomainEnum.Conceptual }, + { "OST_IOSDragBoxInverted", CategoryDomainEnum.Conceptual }, + { "OST_IOSFabricReinSpanSymbolCtrl", CategoryDomainEnum.Symbol }, + { "OST_IOSFlipControl", CategoryDomainEnum.Conceptual }, + { "OST_IOSFreeSnapLine", CategoryDomainEnum.Conceptual }, + { "OST_IOSGhost", CategoryDomainEnum.Conceptual }, + { "OST_IOSGroups", CategoryDomainEnum.Conceptual }, + { "OST_IOSMeasureLine", CategoryDomainEnum.Group }, + { "OST_IOSMeasureLineScreenSize", CategoryDomainEnum.Conceptual }, + { "OST_IOSModelGroups", CategoryDomainEnum.Group }, + { "OST_IOSNavWheelPivotBall", CategoryDomainEnum.Conceptual }, + { "OST_IOSNotSilhouette", CategoryDomainEnum.Conceptual }, + { "OST_IOSOpening", CategoryDomainEnum.Conceptual }, + { "OST_IOSRebarSystemSpanSymbolCtrl", CategoryDomainEnum.Symbol }, + { "OST_IOSRegeneratedElements", CategoryDomainEnum.Conceptual }, + { "OST_IOSRegenerationFailure", CategoryDomainEnum.Conceptual }, + { "OST_IOSRoomCalculationPoint", CategoryDomainEnum.Conceptual }, + { "OST_IOSRoomComputationHeight", CategoryDomainEnum.Conceptual }, + { "OST_IOSRoomPerimeterLines", CategoryDomainEnum.Conceptual }, + { "OST_IOSRoomTagToRoomLines", CategoryDomainEnum.Annotation }, + { "OST_IOSRoomUpperLowerLines", CategoryDomainEnum.Conceptual }, + { "OST_IOSSketchGrid", CategoryDomainEnum.Conceptual }, + { "OST_IOSSlabShapeEditorAutoCrease", CategoryDomainEnum.Conceptual }, + { "OST_IOSSlabShapeEditorBoundary", CategoryDomainEnum.Conceptual }, + { "OST_IOSSlabShapeEditorExplitCrease", CategoryDomainEnum.Conceptual }, + { "OST_IOSSlabShapeEditorPointBoundary", CategoryDomainEnum.Conceptual }, + { "OST_IOSSlabShapeEditorPointInterior", CategoryDomainEnum.Conceptual }, + { "OST_IOSSuspendedSketch", CategoryDomainEnum.Conceptual }, + { "OST_IOSThinPixel", CategoryDomainEnum.Conceptual }, + { "OST_IOSThinPixel_Dash", CategoryDomainEnum.Conceptual }, + { "OST_IOSThinPixel_DashDot", CategoryDomainEnum.Conceptual }, + { "OST_IOSThinPixel_Dot", CategoryDomainEnum.Conceptual }, + { "OST_IOSTilePatternGrid", CategoryDomainEnum.Conceptual }, + { "OST_IOSWallCoreBoundary", CategoryDomainEnum.Conceptual }, + { "OST_IsolatedFoundationAnalytical", CategoryDomainEnum.Conceptual }, + { "OST_IsolatedFoundationAnalyticalTags", CategoryDomainEnum.Annotation }, + { "OST_Joist", CategoryDomainEnum.Conceptual }, + { "OST_KeynoteTags", CategoryDomainEnum.Annotation }, + { "OST_KickerBracing", CategoryDomainEnum.Physical }, + { "OST_LayoutNodes", CategoryDomainEnum.Conceptual }, + { "OST_LayoutPath_Bases", CategoryDomainEnum.Conceptual }, + { "OST_LayoutPathBase_Pipings", CategoryDomainEnum.Conceptual }, + { "OST_LegendComponents", CategoryDomainEnum.Conceptual }, + { "OST_LevelHeads", CategoryDomainEnum.Annotation }, + { "OST_Levels", CategoryDomainEnum.Conceptual }, + { "OST_LightingDevices", CategoryDomainEnum.Physical }, + { "OST_LightingDeviceTags", CategoryDomainEnum.Annotation }, + { "OST_LightingFixtures", CategoryDomainEnum.Physical }, + { "OST_LightingFixturesHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_LightingFixtureSource", CategoryDomainEnum.Conceptual }, + { "OST_LightingFixtureTags", CategoryDomainEnum.Annotation }, + { "OST_LightLine", CategoryDomainEnum.Conceptual }, + { "OST_Lights", CategoryDomainEnum.Conceptual }, + { "OST_LineLoads", CategoryDomainEnum.Conceptual }, + { "OST_LineLoadTags", CategoryDomainEnum.Annotation }, + { "OST_Lines", CategoryDomainEnum.Conceptual }, + { "OST_LinesBeyond", CategoryDomainEnum.Conceptual }, + { "OST_LinesHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_LinkAnalyticalTags", CategoryDomainEnum.Annotation }, + { "OST_LinkBasePoint", CategoryDomainEnum.Link }, + { "OST_LinksAnalytical", CategoryDomainEnum.Link }, + { "OST_LoadCases", CategoryDomainEnum.Conceptual }, + { "OST_LoadCasesAccidental", CategoryDomainEnum.Conceptual }, + { "OST_LoadCasesDead", CategoryDomainEnum.Conceptual }, + { "OST_LoadCasesLive", CategoryDomainEnum.Conceptual }, + { "OST_LoadCasesRoofLive", CategoryDomainEnum.Conceptual }, + { "OST_LoadCasesSeismic", CategoryDomainEnum.Conceptual }, + { "OST_LoadCasesSnow", CategoryDomainEnum.Conceptual }, + { "OST_LoadCasesTemperature", CategoryDomainEnum.Conceptual }, + { "OST_LoadCasesWind", CategoryDomainEnum.Conceptual }, + { "OST_Loads", CategoryDomainEnum.Conceptual }, + { "OST_MaskingRegion", CategoryDomainEnum.Conceptual }, + { "OST_Mass", CategoryDomainEnum.Conceptual }, + { "OST_MassAreaFaceTags", CategoryDomainEnum.Annotation }, + { "OST_MassCutter", CategoryDomainEnum.Conceptual }, + { "OST_MassExteriorWall", CategoryDomainEnum.Conceptual }, + { "OST_MassExteriorWallUnderground", CategoryDomainEnum.Conceptual }, + { "OST_MassFaceSplitter", CategoryDomainEnum.Conceptual }, + { "OST_MassFloor", CategoryDomainEnum.Conceptual }, + { "OST_MassFloorsAll", CategoryDomainEnum.Conceptual }, + { "OST_MassForm", CategoryDomainEnum.Conceptual }, + { "OST_MassGlazing", CategoryDomainEnum.Conceptual }, + { "OST_MassGlazingAll", CategoryDomainEnum.Conceptual }, + { "OST_MassHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_Massing", CategoryDomainEnum.Conceptual }, + { "OST_MassingCutOutlines", CategoryDomainEnum.Conceptual }, + { "OST_MassingProjectionOutlines", CategoryDomainEnum.Conceptual }, + { "OST_MassInteriorWall", CategoryDomainEnum.Conceptual }, + { "OST_MassOpening", CategoryDomainEnum.Conceptual }, + { "OST_MassRoof", CategoryDomainEnum.Conceptual }, + { "OST_MassShade", CategoryDomainEnum.Conceptual }, + { "OST_MassSkylights", CategoryDomainEnum.Conceptual }, + { "OST_MassSlab", CategoryDomainEnum.Conceptual }, + { "OST_MassTags", CategoryDomainEnum.Annotation }, + { "OST_MassWallsAll", CategoryDomainEnum.Conceptual }, + { "OST_MassZone", CategoryDomainEnum.Conceptual }, + { "OST_MatchAll", CategoryDomainEnum.Conceptual }, + { "OST_MatchAnnotation", CategoryDomainEnum.Conceptual }, + { "OST_MatchDetail", CategoryDomainEnum.Conceptual }, + { "OST_Matchline", CategoryDomainEnum.Conceptual }, + { "OST_MatchModel", CategoryDomainEnum.Conceptual }, + { "OST_MatchProfile", CategoryDomainEnum.Conceptual }, + { "OST_MatchSiteComponent", CategoryDomainEnum.Conceptual }, + { "OST_Materials", CategoryDomainEnum.Conceptual }, + { "OST_MaterialTags", CategoryDomainEnum.Annotation }, + { "OST_MechanicalControlDevices", CategoryDomainEnum.Physical }, + { "OST_MechanicalControlDevicesHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_MechanicalControlDeviceTags", CategoryDomainEnum.Annotation }, + { "OST_MechanicalEquipment", CategoryDomainEnum.Physical }, + { "OST_MechanicalEquipmentHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_MechanicalEquipmentSet", CategoryDomainEnum.Conceptual }, + { "OST_MechanicalEquipmentSetBoundaryLines", CategoryDomainEnum.Conceptual }, + { "OST_MechanicalEquipmentSetTags", CategoryDomainEnum.Annotation }, + { "OST_MechanicalEquipmentTags", CategoryDomainEnum.Annotation }, + { "OST_MedicalEquipment", CategoryDomainEnum.Physical }, + { "OST_MedicalEquipmentHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_MedicalEquipmentTags", CategoryDomainEnum.Annotation }, + { "OST_MEPAnalyticalAirLoop", CategoryDomainEnum.Conceptual }, + { "OST_MEPAnalyticalBus", CategoryDomainEnum.Conceptual }, + { "OST_MEPAnalyticalTransferSwitch", CategoryDomainEnum.Conceptual }, + { "OST_MEPAnalyticalWaterLoop", CategoryDomainEnum.Conceptual }, + { "OST_MEPAncillaryFraming", CategoryDomainEnum.Physical }, + { "OST_MEPAncillaryFramingTags", CategoryDomainEnum.Annotation }, + { "OST_MEPLoadAreaColorFill", CategoryDomainEnum.Conceptual }, + { "OST_MEPLoadAreaInteriorFill", CategoryDomainEnum.Conceptual }, + { "OST_MEPLoadAreaInteriorFillVisibility", CategoryDomainEnum.Conceptual }, + { "OST_MEPLoadAreaReference", CategoryDomainEnum.Conceptual }, + { "OST_MEPLoadAreaReferenceVisibility", CategoryDomainEnum.Conceptual }, + { "OST_MEPLoadAreas", CategoryDomainEnum.Conceptual }, + { "OST_MEPLoadAreaSeparationLines", CategoryDomainEnum.Conceptual }, + { "OST_MEPLoadAreaTags", CategoryDomainEnum.Annotation }, + { "OST_MEPSpaceColorFill", CategoryDomainEnum.Conceptual }, + { "OST_MEPSpaceInteriorFill", CategoryDomainEnum.Conceptual }, + { "OST_MEPSpaceInteriorFillVisibility", CategoryDomainEnum.Conceptual }, + { "OST_MEPSpaceReference", CategoryDomainEnum.Conceptual }, + { "OST_MEPSpaceReferenceVisibility", CategoryDomainEnum.Conceptual }, + { "OST_MEPSpaces", CategoryDomainEnum.Conceptual }, + { "OST_MEPSpaceSeparationLines", CategoryDomainEnum.Conceptual }, + { "OST_MEPSpaceTags", CategoryDomainEnum.Annotation }, + { "OST_MEPSystemZone", CategoryDomainEnum.Conceptual }, + { "OST_MEPSystemZoneBoundary", CategoryDomainEnum.Conceptual }, + { "OST_MEPSystemZoneInteriorFill", CategoryDomainEnum.Conceptual }, + { "OST_MEPSystemZoneInteriorFillVisibility", CategoryDomainEnum.Conceptual }, + { "OST_MEPSystemZoneReferenceLines", CategoryDomainEnum.Conceptual }, + { "OST_MEPSystemZoneReferenceLinesVisibility", CategoryDomainEnum.Conceptual }, + { "OST_MEPSystemZoneTags", CategoryDomainEnum.Annotation }, + { "OST_ModelGroupTags", CategoryDomainEnum.Annotation }, + { "OST_ModelText", CategoryDomainEnum.Physical }, + { "OST_MultiCategoryTags", CategoryDomainEnum.Annotation }, + { "OST_MultiLeaderTag", CategoryDomainEnum.Annotation }, + { "OST_MultiReferenceAnnotations", CategoryDomainEnum.Conceptual }, + { "OST_MultistoryStairs", CategoryDomainEnum.Physical }, + { "OST_MultiSurface", CategoryDomainEnum.Conceptual }, + { "OST_NodeAnalyticalTags", CategoryDomainEnum.Annotation }, + { "OST_NumberingSchemas", CategoryDomainEnum.Conceptual }, + { "OST_NurseCallDevices", CategoryDomainEnum.Physical }, + { "OST_NurseCallDeviceTags", CategoryDomainEnum.Annotation }, + { "OST_OverheadLines", CategoryDomainEnum.Conceptual }, + { "OST_PadTags", CategoryDomainEnum.Annotation }, + { "OST_PanelScheduleGraphics", CategoryDomainEnum.Conceptual }, + { "OST_ParamElemElectricalLoadClassification", CategoryDomainEnum.Conceptual }, + { "OST_Parking", CategoryDomainEnum.Physical }, + { "OST_ParkingHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_ParkingTags", CategoryDomainEnum.Annotation }, + { "OST_PartHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_Parts", CategoryDomainEnum.Conceptual }, + { "OST_PartTags", CategoryDomainEnum.Annotation }, + { "OST_PathOfTravelLines", CategoryDomainEnum.Conceptual }, + { "OST_PathOfTravelTags", CategoryDomainEnum.Annotation }, + { "OST_PathRein", CategoryDomainEnum.Conceptual }, + { "OST_PathReinBoundary", CategoryDomainEnum.Conceptual }, + { "OST_PathReinSpanSymbol", CategoryDomainEnum.Symbol }, + { "OST_PathReinTags", CategoryDomainEnum.Annotation }, + { "OST_Phases", CategoryDomainEnum.Conceptual }, + { "OST_PierCaps", CategoryDomainEnum.Physical }, + { "OST_PierCapTags", CategoryDomainEnum.Annotation }, + { "OST_PierColumns", CategoryDomainEnum.Physical }, + { "OST_PierColumnTags", CategoryDomainEnum.Annotation }, + { "OST_PierPiles", CategoryDomainEnum.Physical }, + { "OST_PierPileTags", CategoryDomainEnum.Annotation }, + { "OST_PierWalls", CategoryDomainEnum.Physical }, + { "OST_PierWallTags", CategoryDomainEnum.Annotation }, + { "OST_PipeAccessory", CategoryDomainEnum.Physical }, + { "OST_PipeAccessoryTags", CategoryDomainEnum.Annotation }, + { "OST_PipeAnalyticalSegments", CategoryDomainEnum.Conceptual }, + { "OST_PipeAnalyticalSegmentTags", CategoryDomainEnum.Annotation }, + { "OST_PipeColorFillLegends", CategoryDomainEnum.Conceptual }, + { "OST_PipeColorFills", CategoryDomainEnum.Conceptual }, + { "OST_PipeConnections", CategoryDomainEnum.Conceptual }, + { "OST_PipeCurves", CategoryDomainEnum.Physical }, + { "OST_PipeCurvesCenterLine", CategoryDomainEnum.Conceptual }, + { "OST_PipeCurvesContour", CategoryDomainEnum.Conceptual }, + { "OST_PipeCurvesDrop", CategoryDomainEnum.Physical }, + { "OST_PipeCurvesInsulation", CategoryDomainEnum.Physical }, + { "OST_PipeCurvesRiseDrop", CategoryDomainEnum.Physical }, + { "OST_PipeFitting", CategoryDomainEnum.Physical }, + { "OST_PipeFittingCenterLine", CategoryDomainEnum.Conceptual }, + { "OST_PipeFittingInsulation", CategoryDomainEnum.Physical }, + { "OST_PipeFittingTags", CategoryDomainEnum.Annotation }, + { "OST_PipeHydronicSeparationSymbols", CategoryDomainEnum.Symbol }, + { "OST_PipeInsulations", CategoryDomainEnum.Physical }, + { "OST_PipeInsulationsTags", CategoryDomainEnum.Annotation }, + { "OST_PipeMaterials", CategoryDomainEnum.Conceptual }, + { "OST_PipeSchedules", CategoryDomainEnum.Conceptual }, + { "OST_PipeSegments", CategoryDomainEnum.Physical }, + { "OST_PipeTags", CategoryDomainEnum.Annotation }, + { "OST_PipingSystem", CategoryDomainEnum.System }, + { "OST_PipingSystem_Reference", CategoryDomainEnum.Conceptual }, + { "OST_PipingSystem_Reference_Visibility", CategoryDomainEnum.Conceptual }, + { "OST_PlaceHolderDucts", CategoryDomainEnum.Conceptual }, + { "OST_PlaceHolderPipes", CategoryDomainEnum.Conceptual }, + { "OST_PlanRegion", CategoryDomainEnum.Conceptual }, + { "OST_Planting", CategoryDomainEnum.Physical }, + { "OST_PlantingHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_PlantingTags", CategoryDomainEnum.Annotation }, + { "OST_PlumbingEquipment", CategoryDomainEnum.Physical }, + { "OST_PlumbingEquipmentHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_PlumbingEquipmentTags", CategoryDomainEnum.Annotation }, + { "OST_PlumbingFixtures", CategoryDomainEnum.Physical }, + { "OST_PlumbingFixturesHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_PlumbingFixtureTags", CategoryDomainEnum.Annotation }, + { "OST_PointClouds", CategoryDomainEnum.Link }, + { "OST_PointLoads", CategoryDomainEnum.Conceptual }, + { "OST_PointLoadTags", CategoryDomainEnum.Annotation }, + { "OST_PreviewLegendComponents", CategoryDomainEnum.Conceptual }, + { "OST_ProfileFamilies", CategoryDomainEnum.Conceptual }, + { "OST_ProjectBasePoint", CategoryDomainEnum.Conceptual }, + { "OST_ProjectInformation", CategoryDomainEnum.Conceptual }, + { "OST_Property", CategoryDomainEnum.Physical }, + { "OST_PropertySet", CategoryDomainEnum.Conceptual }, + { "OST_Purlin", CategoryDomainEnum.Conceptual }, + { "OST_RailingBalusterRail", CategoryDomainEnum.Physical }, + { "OST_RailingBalusterRailCut", CategoryDomainEnum.Conceptual }, + { "OST_RailingHandRail", CategoryDomainEnum.Physical }, + { "OST_RailingHandRailAboveCut", CategoryDomainEnum.Conceptual }, + { "OST_RailingRailPathExtensionLines", CategoryDomainEnum.Conceptual }, + { "OST_RailingRailPathLines", CategoryDomainEnum.Conceptual }, + { "OST_Railings", CategoryDomainEnum.Physical }, + { "OST_RailingSupport", CategoryDomainEnum.Physical }, + { "OST_RailingSystem", CategoryDomainEnum.Conceptual }, + { "OST_RailingSystemBaluster", CategoryDomainEnum.Physical }, + { "OST_RailingSystemHandRail", CategoryDomainEnum.Physical }, + { "OST_RailingSystemHandRailBracket", CategoryDomainEnum.Physical }, + { "OST_RailingSystemHardware", CategoryDomainEnum.Physical }, + { "OST_RailingSystemPanel", CategoryDomainEnum.Physical }, + { "OST_RailingSystemPost", CategoryDomainEnum.Physical }, + { "OST_RailingSystemRail", CategoryDomainEnum.Physical }, + { "OST_RailingSystemSegment", CategoryDomainEnum.Physical }, + { "OST_RailingSystemTags", CategoryDomainEnum.Annotation }, + { "OST_RailingSystemTermination", CategoryDomainEnum.Physical }, + { "OST_RailingSystemTopRail", CategoryDomainEnum.Physical }, + { "OST_RailingSystemTransition", CategoryDomainEnum.Physical }, + { "OST_RailingTermination", CategoryDomainEnum.Physical }, + { "OST_RailingTopRail", CategoryDomainEnum.Physical }, + { "OST_RailingTopRailAboveCut", CategoryDomainEnum.Conceptual }, + { "OST_Ramps", CategoryDomainEnum.Physical }, + { "OST_RampsAboveCut", CategoryDomainEnum.Annotation }, + { "OST_RampsDownArrow", CategoryDomainEnum.Symbol }, + { "OST_RampsDownText", CategoryDomainEnum.Symbol }, + { "OST_RampsHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_RampsIncomplete", CategoryDomainEnum.Conceptual }, + { "OST_RampsStringer", CategoryDomainEnum.Physical }, + { "OST_RampsStringerAboveCut", CategoryDomainEnum.Symbol }, + { "OST_RampsUpArrow", CategoryDomainEnum.Symbol }, + { "OST_RampsUpText", CategoryDomainEnum.Symbol }, + { "OST_RampTags", CategoryDomainEnum.Annotation }, + { "OST_RasterImages", CategoryDomainEnum.Conceptual }, + { "OST_Rebar", CategoryDomainEnum.Physical }, + { "OST_RebarBendingDetails", CategoryDomainEnum.Annotation }, + { "OST_RebarCover", CategoryDomainEnum.Conceptual }, + { "OST_RebarHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_RebarLines", CategoryDomainEnum.Conceptual }, + { "OST_RebarSetToggle", CategoryDomainEnum.Conceptual }, + { "OST_RebarShape", CategoryDomainEnum.Conceptual }, + { "OST_RebarSketchLines", CategoryDomainEnum.Conceptual }, + { "OST_RebarSpliceLines", CategoryDomainEnum.Conceptual }, + { "OST_RebarTags", CategoryDomainEnum.Annotation }, + { "OST_ReferenceLines", CategoryDomainEnum.Conceptual }, + { "OST_ReferencePoints", CategoryDomainEnum.Conceptual }, + { "OST_ReferencePoints_HiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_ReferencePoints_Lines", CategoryDomainEnum.Conceptual }, + { "OST_ReferencePoints_Planes", CategoryDomainEnum.Conceptual }, + { "OST_ReferencePoints_Points", CategoryDomainEnum.Conceptual }, + { "OST_ReferenceViewer", CategoryDomainEnum.Conceptual }, + { "OST_ReferenceViewerSymbol", CategoryDomainEnum.Symbol }, + { "OST_RemovedGridSeg", CategoryDomainEnum.Conceptual }, + { "OST_RenderRegions", CategoryDomainEnum.Conceptual }, + { "OST_RepeatingDetailLines", CategoryDomainEnum.Conceptual }, + { "OST_Reveals", CategoryDomainEnum.Physical }, + { "OST_RevisionClouds", CategoryDomainEnum.Conceptual }, + { "OST_RevisionCloudTags", CategoryDomainEnum.Annotation }, + { "OST_RevisionNumberingSequences", CategoryDomainEnum.Conceptual }, + { "OST_Revisions", CategoryDomainEnum.Conceptual }, + { "OST_RigidLinksAnalytical", CategoryDomainEnum.Conceptual }, + { "OST_RiseDropSymbols", CategoryDomainEnum.Symbol }, + { "OST_Roads", CategoryDomainEnum.Physical }, + { "OST_RoadsHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_RoadTags", CategoryDomainEnum.Annotation }, + { "OST_RoofOpening", CategoryDomainEnum.Conceptual }, + { "OST_Roofs", CategoryDomainEnum.Physical }, + { "OST_RoofsCut", CategoryDomainEnum.Conceptual }, + { "OST_RoofsCutPattern", CategoryDomainEnum.Conceptual }, + { "OST_RoofsDefault", CategoryDomainEnum.Conceptual }, + { "OST_RoofsFinish1", CategoryDomainEnum.Conceptual }, + { "OST_RoofsFinish2", CategoryDomainEnum.Conceptual }, + { "OST_RoofsHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_RoofsInsulation", CategoryDomainEnum.Conceptual }, + { "OST_RoofsInteriorEdges", CategoryDomainEnum.Conceptual }, + { "OST_RoofsMembrane", CategoryDomainEnum.Conceptual }, + { "OST_RoofSoffit", CategoryDomainEnum.Physical }, + { "OST_RoofSoffitTags", CategoryDomainEnum.Annotation }, + { "OST_RoofsProjection", CategoryDomainEnum.Conceptual }, + { "OST_RoofsStructure", CategoryDomainEnum.Conceptual }, + { "OST_RoofsSubstrate", CategoryDomainEnum.Conceptual }, + { "OST_RoofsSurfacePattern", CategoryDomainEnum.Conceptual }, + { "OST_RoofTags", CategoryDomainEnum.Annotation }, + { "OST_RoomColorFill", CategoryDomainEnum.Conceptual }, + { "OST_RoomInteriorFill", CategoryDomainEnum.Conceptual }, + { "OST_RoomInteriorFillVisibility", CategoryDomainEnum.Conceptual }, + { "OST_RoomPolylines", CategoryDomainEnum.Conceptual }, + { "OST_RoomReference", CategoryDomainEnum.Conceptual }, + { "OST_RoomReferenceVisibility", CategoryDomainEnum.Conceptual }, + { "OST_Rooms", CategoryDomainEnum.Rooms }, + { "OST_RoomSeparationLines", CategoryDomainEnum.Conceptual }, + { "OST_RoomTags", CategoryDomainEnum.Annotation }, + { "OST_RouteCurve", CategoryDomainEnum.Conceptual }, + { "OST_RouteCurveBranch", CategoryDomainEnum.Conceptual }, + { "OST_RouteCurveMain", CategoryDomainEnum.Conceptual }, + { "OST_RoutingPreferences", CategoryDomainEnum.Conceptual }, + { "OST_RvtLinks", CategoryDomainEnum.Link }, + { "OST_RvtLinksTags", CategoryDomainEnum.Annotation }, + { "OST_ScheduleGraphics", CategoryDomainEnum.Conceptual }, + { "OST_Schedules", CategoryDomainEnum.Conceptual }, + { "OST_ScheduleViewParamGroup", CategoryDomainEnum.Conceptual }, + { "OST_SecondaryTopographyContours", CategoryDomainEnum.Conceptual }, + { "OST_SectionBox", CategoryDomainEnum.Conceptual }, + { "OST_SectionHeadMediumLines", CategoryDomainEnum.Conceptual }, + { "OST_SectionHeads", CategoryDomainEnum.Conceptual }, + { "OST_SectionHeadThinLines", CategoryDomainEnum.Conceptual }, + { "OST_SectionHeadWideLines", CategoryDomainEnum.Conceptual }, + { "OST_SectionLine", CategoryDomainEnum.Conceptual }, + { "OST_Sections", CategoryDomainEnum.Conceptual }, + { "OST_SecurityDevices", CategoryDomainEnum.Physical }, + { "OST_SecurityDeviceTags", CategoryDomainEnum.Annotation }, + { "OST_Sewer", CategoryDomainEnum.Physical }, + { "OST_ShaftOpening", CategoryDomainEnum.Conceptual }, + { "OST_ShaftOpeningHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_SharedBasePoint", CategoryDomainEnum.Conceptual }, + { "OST_SheetCollections", CategoryDomainEnum.Conceptual }, + { "OST_Sheets", CategoryDomainEnum.Conceptual }, + { "OST_Signage", CategoryDomainEnum.Physical }, + { "OST_SignageHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_SignageTags", CategoryDomainEnum.Annotation }, + { "OST_Site", CategoryDomainEnum.Physical }, + { "OST_SiteHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_SitePoint", CategoryDomainEnum.Conceptual }, + { "OST_SitePointBoundary", CategoryDomainEnum.Conceptual }, + { "OST_SiteProperty", CategoryDomainEnum.Conceptual }, + { "OST_SitePropertyLineSegment", CategoryDomainEnum.Conceptual }, + { "OST_SitePropertyLineSegmentTags", CategoryDomainEnum.Annotation }, + { "OST_SitePropertyTags", CategoryDomainEnum.Annotation }, + { "OST_SiteRegion", CategoryDomainEnum.Conceptual }, + { "OST_SiteSurface", CategoryDomainEnum.Conceptual }, + { "OST_SiteTags", CategoryDomainEnum.Annotation }, + { "OST_SketchLines", CategoryDomainEnum.Conceptual }, + { "OST_SlabEdgeTags", CategoryDomainEnum.Annotation }, + { "OST_SpanDirectionSymbol", CategoryDomainEnum.Symbol }, + { "OST_SpecialityEquipment", CategoryDomainEnum.Physical }, + { "OST_SpecialityEquipmentHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_SpecialityEquipmentTags", CategoryDomainEnum.Annotation }, + { "OST_SplitterProfile", CategoryDomainEnum.Conceptual }, + { "OST_SpotCoordinates", CategoryDomainEnum.Conceptual }, + { "OST_SpotCoordinateSymbols", CategoryDomainEnum.Symbol }, + { "OST_SpotElevations", CategoryDomainEnum.Conceptual }, + { "OST_SpotElevSymbols", CategoryDomainEnum.Symbol }, + { "OST_SpotSlopes", CategoryDomainEnum.Conceptual }, + { "OST_SpotSlopesSymbols", CategoryDomainEnum.Symbol }, + { "OST_Sprinklers", CategoryDomainEnum.Physical }, + { "OST_SprinklerTags", CategoryDomainEnum.Annotation }, + { "OST_StackedWalls", CategoryDomainEnum.Physical }, + { "OST_Stairs", CategoryDomainEnum.Physical }, + { "OST_StairsCutMarks", CategoryDomainEnum.Conceptual }, + { "OST_StairsCutMarksAboveCut", CategoryDomainEnum.Conceptual }, + { "OST_StairsDownArrows", CategoryDomainEnum.Symbol }, + { "OST_StairsDownText", CategoryDomainEnum.Symbol }, + { "OST_StairsHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_StairsLandings", CategoryDomainEnum.Physical }, + { "OST_StairsLandingTags", CategoryDomainEnum.Annotation }, + { "OST_StairsNosingLines", CategoryDomainEnum.Conceptual }, + { "OST_StairsNosingLinesAboveCut", CategoryDomainEnum.Conceptual }, + { "OST_StairsOutlines", CategoryDomainEnum.Conceptual }, + { "OST_StairsOutlinesAboveCut", CategoryDomainEnum.Conceptual }, + { "OST_StairsPaths", CategoryDomainEnum.Conceptual }, + { "OST_StairsPathsAboveCut", CategoryDomainEnum.Conceptual }, + { "OST_StairsRailing", CategoryDomainEnum.Physical }, + { "OST_StairsRailingAboveCut", CategoryDomainEnum.Symbol }, + { "OST_StairsRailingBaluster", CategoryDomainEnum.Physical }, + { "OST_StairsRailingHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_StairsRailingRail", CategoryDomainEnum.Physical }, + { "OST_StairsRailingTags", CategoryDomainEnum.Annotation }, + { "OST_StairsRiserLines", CategoryDomainEnum.Conceptual }, + { "OST_StairsRiserLinesAboveCut", CategoryDomainEnum.Conceptual }, + { "OST_StairsRuns", CategoryDomainEnum.Physical }, + { "OST_StairsRunTags", CategoryDomainEnum.Annotation }, + { "OST_StairsSketchBoundaryLines", CategoryDomainEnum.Conceptual }, + { "OST_StairsSketchLandingCenterLines", CategoryDomainEnum.Conceptual }, + { "OST_StairsSketchPathLines", CategoryDomainEnum.Conceptual }, + { "OST_StairsSketchRiserLines", CategoryDomainEnum.Conceptual }, + { "OST_StairsSketchRunLines", CategoryDomainEnum.Conceptual }, + { "OST_StairsStringerCarriage", CategoryDomainEnum.Physical }, + { "OST_StairsSupports", CategoryDomainEnum.Physical }, + { "OST_StairsSupportsAboveCut", CategoryDomainEnum.Symbol }, + { "OST_StairsSupportTags", CategoryDomainEnum.Annotation }, + { "OST_StairsTags", CategoryDomainEnum.Annotation }, + { "OST_StairsTriserNumbers", CategoryDomainEnum.Conceptual }, + { "OST_StairsTrisers", CategoryDomainEnum.Physical }, + { "OST_StairsTriserTags", CategoryDomainEnum.Annotation }, + { "OST_StairsUpArrows", CategoryDomainEnum.Symbol }, + { "OST_StairsUpText", CategoryDomainEnum.Symbol }, + { "OST_SteelElementStale", CategoryDomainEnum.Conceptual }, + { "OST_StructConnectionAnchors", CategoryDomainEnum.Physical }, + { "OST_StructConnectionAnchorTags", CategoryDomainEnum.Annotation }, + { "OST_StructConnectionBolts", CategoryDomainEnum.Physical }, + { "OST_StructConnectionBoltTags", CategoryDomainEnum.Annotation }, + { "OST_StructConnectionFailed", CategoryDomainEnum.Conceptual }, + { "OST_StructConnectionHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_StructConnectionHoles", CategoryDomainEnum.Conceptual }, + { "OST_StructConnectionHoleTags", CategoryDomainEnum.Annotation }, + { "OST_StructConnectionModifiers", CategoryDomainEnum.Conceptual }, + { "OST_StructConnectionNobleWarning", CategoryDomainEnum.Conceptual }, + { "OST_StructConnectionOthers", CategoryDomainEnum.Physical }, + { "OST_StructConnectionPlates", CategoryDomainEnum.Physical }, + { "OST_StructConnectionPlateTags", CategoryDomainEnum.Annotation }, + { "OST_StructConnectionProfiles", CategoryDomainEnum.Conceptual }, + { "OST_StructConnectionProfilesTags", CategoryDomainEnum.Annotation }, + { "OST_StructConnectionReference", CategoryDomainEnum.Conceptual }, + { "OST_StructConnections", CategoryDomainEnum.Physical }, + { "OST_StructConnectionShearStuds", CategoryDomainEnum.Physical }, + { "OST_StructConnectionShearStudTags", CategoryDomainEnum.Annotation }, + { "OST_StructConnectionStale", CategoryDomainEnum.Conceptual }, + { "OST_StructConnectionSymbol", CategoryDomainEnum.Symbol }, + { "OST_StructConnectionSymbols", CategoryDomainEnum.Symbol }, + { "OST_StructConnectionTags", CategoryDomainEnum.Annotation }, + { "OST_StructConnectionWelds", CategoryDomainEnum.Physical }, + { "OST_StructConnectionWeldTags", CategoryDomainEnum.Annotation }, + { "OST_StructLocationLineControl", CategoryDomainEnum.Conceptual }, + { "OST_StructSubConnections", CategoryDomainEnum.Physical }, + { "OST_StructuralAnnotations", CategoryDomainEnum.Annotation }, + { "OST_StructuralBracePlanReps", CategoryDomainEnum.Annotation }, + { "OST_StructuralColumnLocationLine", CategoryDomainEnum.Conceptual }, + { "OST_StructuralColumns", CategoryDomainEnum.Physical }, + { "OST_StructuralColumnStickSymbols", CategoryDomainEnum.Symbol }, + { "OST_StructuralColumnTags", CategoryDomainEnum.Annotation }, + { "OST_StructuralFoundation", CategoryDomainEnum.Physical }, + { "OST_StructuralFoundationTags", CategoryDomainEnum.Annotation }, + { "OST_StructuralFraming", CategoryDomainEnum.Physical }, + { "OST_StructuralFramingLocationLine", CategoryDomainEnum.Conceptual }, + { "OST_StructuralFramingOpening", CategoryDomainEnum.Conceptual }, + { "OST_StructuralFramingOther", CategoryDomainEnum.Conceptual }, + { "OST_StructuralFramingSystem", CategoryDomainEnum.Conceptual }, + { "OST_StructuralFramingTags", CategoryDomainEnum.Annotation }, + { "OST_StructuralStiffener", CategoryDomainEnum.Physical }, + { "OST_StructuralStiffenerHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_StructuralStiffenerTags", CategoryDomainEnum.Annotation }, + { "OST_StructuralTendonHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_StructuralTendons", CategoryDomainEnum.Physical }, + { "OST_StructuralTendonTags", CategoryDomainEnum.Annotation }, + { "OST_StructuralTruss", CategoryDomainEnum.Physical }, + { "OST_StructuralTrussHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_StructuralTrussStickSymbols", CategoryDomainEnum.Symbol }, + { "OST_StructWeldLines", CategoryDomainEnum.Conceptual }, + { "OST_Sun", CategoryDomainEnum.Conceptual }, + { "OST_SunPath1", CategoryDomainEnum.Conceptual }, + { "OST_SunPath2", CategoryDomainEnum.Conceptual }, + { "OST_SunriseText", CategoryDomainEnum.Conceptual }, + { "OST_SunsetText", CategoryDomainEnum.Conceptual }, + { "OST_SunStudy", CategoryDomainEnum.Conceptual }, + { "OST_SunSurface", CategoryDomainEnum.Conceptual }, + { "OST_SWallRectOpening", CategoryDomainEnum.Conceptual }, + { "OST_SwitchboardScheduleTemplates", CategoryDomainEnum.Conceptual }, + { "OST_SwitchSystem", CategoryDomainEnum.System }, + { "OST_Tags", CategoryDomainEnum.Annotation }, + { "OST_TelephoneDevices", CategoryDomainEnum.Physical }, + { "OST_TelephoneDeviceTags", CategoryDomainEnum.Annotation }, + { "OST_TemporaryStructure", CategoryDomainEnum.Physical }, + { "OST_TemporaryStructureHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_TemporaryStructureTags", CategoryDomainEnum.Annotation }, + { "OST_TextNotes", CategoryDomainEnum.Conceptual }, + { "OST_TilePatterns", CategoryDomainEnum.Conceptual }, + { "OST_TitleBlockMediumLines", CategoryDomainEnum.Conceptual }, + { "OST_TitleBlocks", CategoryDomainEnum.Conceptual }, + { "OST_TitleBlockThinLines", CategoryDomainEnum.Conceptual }, + { "OST_TitleBlockWideLines", CategoryDomainEnum.Conceptual }, + { "OST_Topography", CategoryDomainEnum.Topography }, + { "OST_TopographyContours", CategoryDomainEnum.Conceptual }, + { "OST_TopographyHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_TopographyLink", CategoryDomainEnum.Link }, + { "OST_TopographySurface", CategoryDomainEnum.Conceptual }, + { "OST_Toposolid", CategoryDomainEnum.Physical }, + { "OST_ToposolidContours", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidCutPattern", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidDefault", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidFinish1", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidFinish2", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidFoldingLines", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidInsulation", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidLink", CategoryDomainEnum.Link }, + { "OST_ToposolidLinkTags", CategoryDomainEnum.Annotation }, + { "OST_ToposolidMembrane", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidOpening", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidSecondaryContours", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidSplitLines", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidStructure", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidSubstrate", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidSurfacePattern", CategoryDomainEnum.Conceptual }, + { "OST_ToposolidTags", CategoryDomainEnum.Annotation }, + { "OST_TopRailTags", CategoryDomainEnum.Annotation }, + { "OST_Truss", CategoryDomainEnum.Physical }, + { "OST_TrussBottomChordCurve", CategoryDomainEnum.Conceptual }, + { "OST_TrussChord", CategoryDomainEnum.Physical }, + { "OST_TrussDiagWebCurve", CategoryDomainEnum.Conceptual }, + { "OST_TrussDummy", CategoryDomainEnum.Conceptual }, + { "OST_TrussTags", CategoryDomainEnum.Annotation }, + { "OST_TrussTopChordCurve", CategoryDomainEnum.Conceptual }, + { "OST_TrussVertWebCurve", CategoryDomainEnum.Conceptual }, + { "OST_TrussWeb", CategoryDomainEnum.Physical }, + { "OST_VerticalBracing", CategoryDomainEnum.Conceptual }, + { "OST_VerticalCirculation", CategoryDomainEnum.Physical }, + { "OST_VerticalCirculationHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_VerticalCirculationTags", CategoryDomainEnum.Annotation }, + { "OST_VibrationDampers", CategoryDomainEnum.Physical }, + { "OST_VibrationDamperTags", CategoryDomainEnum.Annotation }, + { "OST_VibrationIsolators", CategoryDomainEnum.Physical }, + { "OST_VibrationIsolatorTags", CategoryDomainEnum.Annotation }, + { "OST_VibrationManagement", CategoryDomainEnum.Conceptual }, + { "OST_VibrationManagementHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_VibrationManagementTags", CategoryDomainEnum.Annotation }, + { "OST_Viewers", CategoryDomainEnum.Conceptual }, + { "OST_ViewportLabel", CategoryDomainEnum.Conceptual }, + { "OST_Viewports", CategoryDomainEnum.Conceptual }, + { "OST_Views", CategoryDomainEnum.Conceptual }, + { "OST_VolumeOfInterest", CategoryDomainEnum.Conceptual }, + { "OST_WallAnalytical", CategoryDomainEnum.Conceptual }, + { "OST_WallAnalyticalTags", CategoryDomainEnum.Annotation }, + { "OST_WallCoreLayer", CategoryDomainEnum.Conceptual }, + { "OST_WallFoundationAnalytical", CategoryDomainEnum.Conceptual }, + { "OST_WallFoundationAnalyticalTags", CategoryDomainEnum.Annotation }, + { "OST_WallLocalCoordSys", CategoryDomainEnum.Conceptual }, + { "OST_WallNonCoreLayer", CategoryDomainEnum.Conceptual }, + { "OST_WallRefPlanes", CategoryDomainEnum.Conceptual }, + { "OST_Walls", CategoryDomainEnum.Physical }, + { "OST_WallsAnalyticalGeometry", CategoryDomainEnum.Conceptual }, + { "OST_WallsCutOutlines", CategoryDomainEnum.Conceptual }, + { "OST_WallsCutPattern", CategoryDomainEnum.Conceptual }, + { "OST_WallsDefault", CategoryDomainEnum.Conceptual }, + { "OST_WallsFinish1", CategoryDomainEnum.Conceptual }, + { "OST_WallsFinish2", CategoryDomainEnum.Conceptual }, + { "OST_WallsInsulation", CategoryDomainEnum.Conceptual }, + { "OST_WallsMembrane", CategoryDomainEnum.Conceptual }, + { "OST_WallsProjectionOutlines", CategoryDomainEnum.Conceptual }, + { "OST_WallsStructure", CategoryDomainEnum.Conceptual }, + { "OST_WallsSubstrate", CategoryDomainEnum.Conceptual }, + { "OST_WallsSurfacePattern", CategoryDomainEnum.Conceptual }, + { "OST_WallSweepTags", CategoryDomainEnum.Annotation }, + { "OST_WallTags", CategoryDomainEnum.Annotation }, + { "OST_WeakDims", CategoryDomainEnum.Conceptual }, + { "OST_Windows", CategoryDomainEnum.Physical }, + { "OST_WindowsFrameMullionCut", CategoryDomainEnum.Conceptual }, + { "OST_WindowsFrameMullionProjection", CategoryDomainEnum.Conceptual }, + { "OST_WindowsGlassCut", CategoryDomainEnum.Conceptual }, + { "OST_WindowsGlassProjection", CategoryDomainEnum.Conceptual }, + { "OST_WindowsHiddenLines", CategoryDomainEnum.Conceptual }, + { "OST_WindowsOpeningCut", CategoryDomainEnum.Conceptual }, + { "OST_WindowsOpeningProjection", CategoryDomainEnum.Conceptual }, + { "OST_WindowsSillHeadCut", CategoryDomainEnum.Conceptual }, + { "OST_WindowsSillHeadProjection", CategoryDomainEnum.Conceptual }, + { "OST_WindowTags", CategoryDomainEnum.Annotation }, + { "OST_Wire", CategoryDomainEnum.Physical }, + { "OST_WireHomeRunArrows", CategoryDomainEnum.Conceptual }, + { "OST_WireInsulations", CategoryDomainEnum.Conceptual }, + { "OST_WireMaterials", CategoryDomainEnum.Conceptual }, + { "OST_WireTags", CategoryDomainEnum.Annotation }, + { "OST_WireTemperatureRatings", CategoryDomainEnum.Conceptual }, + { "OST_WireTickMarks", CategoryDomainEnum.Conceptual }, + { "OST_XRayConstrainedProfileEdge", CategoryDomainEnum.Conceptual }, + { "OST_XRayImplicitPathCurve", CategoryDomainEnum.Conceptual }, + { "OST_XRayPathCurve", CategoryDomainEnum.Conceptual }, + { "OST_XRayPathPoint", CategoryDomainEnum.Conceptual }, + { "OST_XRayProfileEdge", CategoryDomainEnum.Conceptual }, + { "OST_XRaySideEdge", CategoryDomainEnum.Conceptual }, + { "OST_ZoneEquipment", CategoryDomainEnum.Conceptual }, + { "OST_ZoneSchemes", CategoryDomainEnum.Conceptual }, + { "OST_ZoneTags", CategoryDomainEnum.Annotation }, + { "OST_DataExchanges", CategoryDomainEnum.Conceptual }, + { "OST_FloorLayers", CategoryDomainEnum.Physical }, + { "OST_WallLayers", CategoryDomainEnum.Physical }, + { "OST_ElectricalConnectorTags", CategoryDomainEnum.Annotation }, + { "OST_ElectricalConnector", CategoryDomainEnum.Conceptual }, + { "OST_ElectricalLoadCase", CategoryDomainEnum.Conceptual }, + { "OST_ZoningEnvelope", CategoryDomainEnum.Conceptual } + }; + } + } +} diff --git a/src/cs/vim/Vim.Format/ElementDomain.cs b/src/cs/vim/Vim.Format/ElementDomain.cs new file mode 100644 index 0000000..648341d --- /dev/null +++ b/src/cs/vim/Vim.Format/ElementDomain.cs @@ -0,0 +1,117 @@ +using System.Collections.Generic; +using System.Diagnostics; +using Vim.Format.ObjectModel; + +namespace Vim.Format +{ + public enum ElementDomainEnum + { + Conceptual = 0, + PhysicalVisible = 10, + PhysicalHidden = 11, + PhysicalNotInstanced = 12, + Topography = 20, + Group = 30, + Rooms = 40, + System = 50, + LinkVisible = 60, + LinkHidden = 61, + Annotation = 70, + Symbol = 80 + } + + public static class ElementDomainEnumExtensions + { + public static string ToDisplayString(this ElementDomainEnum e) + { + switch (e) + { + case ElementDomainEnum.PhysicalVisible: return "Physical-Visible"; + case ElementDomainEnum.PhysicalHidden: return "Physical-Hidden"; + case ElementDomainEnum.PhysicalNotInstanced: return "Physical-NotInstanced"; + case ElementDomainEnum.LinkVisible: return "Link-Visible"; + case ElementDomainEnum.LinkHidden: return "Link-Hidden"; + default: return e.ToString("G"); + } + } + } + + /// + /// The ElementDomain is a labeling of each element which facilitates the filtering of large lists of elements. + /// + public static class ElementDomain + { + /// + /// Returns an array aligned 1:1 with the element table to identify the ElementDomain. + /// + public static ElementDomainEnum[] GetElementDomains( + ElementTable elementTable, + CategoryTable categoryTable, + ElementKind[] elementKinds, + bool[] elementIsVisibleIn3dView) + { + var categoryDomains = CategoryDomain.GetCategoryDomainMap(); + var elementDomains = new ElementDomainEnum[elementTable.RowCount]; + + for (var i = 0; i < elementDomains.Length; ++i) + { + elementDomains[i] = GetElementDomain(i, elementTable, categoryTable, elementKinds, elementIsVisibleIn3dView, categoryDomains); + } + + return elementDomains; + } + + public static ElementDomainEnum GetElementDomain( + int elementIndex, + ElementTable elementTable, + CategoryTable categoryTable, + ElementKind[] elementKinds, + bool[] elementIsVisibleIn3dView, + Dictionary categoryDomains) + { + var elementKind = elementKinds[elementIndex]; + + // Family and FamilyType elements are relegated to the conceptual element domain. + if (elementKind == ElementKind.Family || elementKind == ElementKind.FamilyType) + return ElementDomainEnum.Conceptual; + + // Elements which are neither Family or FamilyType are labeled based on the category domain. + var categoryIndex = elementTable.GetCategoryIndex(elementIndex); + var builtInCategory = categoryTable.GetBuiltInCategory(categoryIndex); + var categoryDomain = categoryDomains.GetCategoryDomain(builtInCategory); + + switch (categoryDomain) + { + case CategoryDomainEnum.Conceptual: return ElementDomainEnum.Conceptual; + case CategoryDomainEnum.Physical: + { + var isInstance = elementKind == ElementKind.FamilyInstance; + if (isInstance) + { + var isVisibleIn3dView = elementIsVisibleIn3dView[elementIndex]; + return isVisibleIn3dView + ? ElementDomainEnum.PhysicalVisible + : ElementDomainEnum.PhysicalHidden; + } + return ElementDomainEnum.PhysicalNotInstanced; + } + case CategoryDomainEnum.Topography: return ElementDomainEnum.Topography; + case CategoryDomainEnum.Group: return ElementDomainEnum.Group; + case CategoryDomainEnum.Rooms: return ElementDomainEnum.Rooms; + case CategoryDomainEnum.System: return ElementDomainEnum.System; + case CategoryDomainEnum.Link: + { + var isVisibleIn3dView = elementIsVisibleIn3dView[elementIndex]; + return isVisibleIn3dView + ? ElementDomainEnum.LinkVisible + : ElementDomainEnum.LinkHidden; + } + case CategoryDomainEnum.Annotation: return ElementDomainEnum.Annotation; + case CategoryDomainEnum.Symbol: return ElementDomainEnum.Symbol; + default: + Debug.Fail($"Unknown CategoryDomainEnum {categoryDomain:G}"); + return ElementDomainEnum.Conceptual; + } + } + } +} From c06761c3fdb434a5c4e6414f8491e45447dccedf Mon Sep 17 00:00:00 2001 From: Martin Ashton Date: Wed, 28 Jan 2026 16:03:34 -0500 Subject: [PATCH 4/5] Added DescriptorKindKey --- .../ElementParameterInfo/ParameterSummary.cs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterSummary.cs b/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterSummary.cs index c7f5615..f366db8 100644 --- a/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterSummary.cs +++ b/src/cs/vim/Vim.Format/ElementParameterInfo/ParameterSummary.cs @@ -10,6 +10,8 @@ public class ParameterSummary : IElementKindInfo { public string SummaryKey { get; set; } + public string DescriptorKindKey { get; set; } + public int Descriptor { get; set; } public int ElementKindEnum { get; set; } @@ -194,7 +196,7 @@ public static IEnumerable GetParameterSummary( CategoryTable categoryTable) { return Enumerable.Range(0, parameterTable.RowCount) - .GroupBy(i => new ParameterSummaryKey(i, parameterTable, elementTable, elementKindArray, categoryTable)) + .GroupBy(i => new ParameterSummaryKey(i, parameterTable, elementTable, elementKindArray)) .AsParallel() .Select(g => { @@ -212,6 +214,7 @@ public static IEnumerable GetParameterSummary( var ps = new ParameterSummary() { SummaryKey = parameterSummaryKey.ToString(), + DescriptorKindKey = parameterSummaryKey.ToDescriptorKindKey(), Descriptor = descriptorIndex, CategoryNameFull = categoryTable.GetNameFull(categoryIndex), Name = name, @@ -298,8 +301,7 @@ public ParameterSummaryKey( int parameterIndex, ParameterTable parameterTable, ElementTable elementTable, - ElementKind[] elementKindArray, - CategoryTable categoryTable) + ElementKind[] elementKindArray) { DescriptorIndex = parameterTable.GetParameterDescriptorIndex(parameterIndex); var elementIndex = parameterTable.GetElementIndex(parameterIndex); @@ -323,5 +325,11 @@ public override string ToString() public static string GetStringKey(int descriptorIndex, ElementKind elementKind, int categoryIndex) => $"{descriptorIndex}|{(int)elementKind}|{categoryIndex}"; + + public string ToDescriptorKindKey() + => GetDescriptorKindKey(DescriptorIndex, ElementKind); + + public static string GetDescriptorKindKey(int descriptorIndex, ElementKind elementKind) + => $"{descriptorIndex}|{(int)elementKind}"; } } From b97f6347672763044a2400cd6d24d905d7b625ba Mon Sep 17 00:00:00 2001 From: Martin Ashton Date: Wed, 28 Jan 2026 17:22:14 -0500 Subject: [PATCH 5/5] Refactoring and added special case when category domain is absent --- src/cs/vim/Vim.Format/CategoryDomain.cs | 7 ---- src/cs/vim/Vim.Format/ElementDomain.cs | 47 ++++++++++++++----------- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/src/cs/vim/Vim.Format/CategoryDomain.cs b/src/cs/vim/Vim.Format/CategoryDomain.cs index 5b91a3f..806a657 100644 --- a/src/cs/vim/Vim.Format/CategoryDomain.cs +++ b/src/cs/vim/Vim.Format/CategoryDomain.cs @@ -17,13 +17,6 @@ public enum CategoryDomainEnum public static class CategoryDomainEnumExtensions { - public static CategoryDomainEnum GetCategoryDomain( - this Dictionary categoryDomainMap, - string builtInCategory) - => categoryDomainMap.TryGetValue(builtInCategory, out var result) - ? result - : CategoryDomainEnum.Conceptual; // fall back to conceptual. - public static string ToDisplayString(this CategoryDomainEnum c) => c.ToString("G"); } diff --git a/src/cs/vim/Vim.Format/ElementDomain.cs b/src/cs/vim/Vim.Format/ElementDomain.cs index 648341d..17ab510 100644 --- a/src/cs/vim/Vim.Format/ElementDomain.cs +++ b/src/cs/vim/Vim.Format/ElementDomain.cs @@ -51,12 +51,11 @@ public static ElementDomainEnum[] GetElementDomains( bool[] elementIsVisibleIn3dView) { var categoryDomains = CategoryDomain.GetCategoryDomainMap(); + var elementDomains = new ElementDomainEnum[elementTable.RowCount]; for (var i = 0; i < elementDomains.Length; ++i) - { elementDomains[i] = GetElementDomain(i, elementTable, categoryTable, elementKinds, elementIsVisibleIn3dView, categoryDomains); - } return elementDomains; } @@ -78,34 +77,30 @@ public static ElementDomainEnum GetElementDomain( // Elements which are neither Family or FamilyType are labeled based on the category domain. var categoryIndex = elementTable.GetCategoryIndex(elementIndex); var builtInCategory = categoryTable.GetBuiltInCategory(categoryIndex); - var categoryDomain = categoryDomains.GetCategoryDomain(builtInCategory); + + var hasCategoryDomain = categoryDomains.TryGetValue(builtInCategory, out var categoryDomain); + if (!hasCategoryDomain) + { + // Special case: if the VIM file was sourced from IFC (or some source other than Revit), + // it probably won't have category domain. In this case, we use the ElementKind.FamilyInstance + // to determine whether the element domain is actually conceptual. + return elementKind is ElementKind.FamilyInstance + ? GetPhysicalDomain(elementIndex, elementIsVisibleIn3dView) + : ElementDomainEnum.Conceptual; + } switch (categoryDomain) { case CategoryDomainEnum.Conceptual: return ElementDomainEnum.Conceptual; case CategoryDomainEnum.Physical: - { - var isInstance = elementKind == ElementKind.FamilyInstance; - if (isInstance) - { - var isVisibleIn3dView = elementIsVisibleIn3dView[elementIndex]; - return isVisibleIn3dView - ? ElementDomainEnum.PhysicalVisible - : ElementDomainEnum.PhysicalHidden; - } - return ElementDomainEnum.PhysicalNotInstanced; - } + return elementKind is ElementKind.FamilyInstance + ? GetPhysicalDomain(elementIndex, elementIsVisibleIn3dView) + : ElementDomainEnum.PhysicalNotInstanced; case CategoryDomainEnum.Topography: return ElementDomainEnum.Topography; case CategoryDomainEnum.Group: return ElementDomainEnum.Group; case CategoryDomainEnum.Rooms: return ElementDomainEnum.Rooms; case CategoryDomainEnum.System: return ElementDomainEnum.System; - case CategoryDomainEnum.Link: - { - var isVisibleIn3dView = elementIsVisibleIn3dView[elementIndex]; - return isVisibleIn3dView - ? ElementDomainEnum.LinkVisible - : ElementDomainEnum.LinkHidden; - } + case CategoryDomainEnum.Link: return GetLinkDomain(elementIndex, elementIsVisibleIn3dView); case CategoryDomainEnum.Annotation: return ElementDomainEnum.Annotation; case CategoryDomainEnum.Symbol: return ElementDomainEnum.Symbol; default: @@ -113,5 +108,15 @@ public static ElementDomainEnum GetElementDomain( return ElementDomainEnum.Conceptual; } } + + public static ElementDomainEnum GetPhysicalDomain(int elementIndex, bool[] elementIsVisibleIn3dView) + => elementIsVisibleIn3dView[elementIndex] + ? ElementDomainEnum.PhysicalVisible + : ElementDomainEnum.PhysicalHidden; + + public static ElementDomainEnum GetLinkDomain(int elementIndex, bool[] elementIsVisibleIn3dView) + => elementIsVisibleIn3dView[elementIndex] + ? ElementDomainEnum.LinkVisible + : ElementDomainEnum.LinkHidden; } }