diff --git a/Revit_Core_Engine/Query/Level.cs b/Revit_Core_Engine/Query/Level.cs index 48b3ae5c1..6db691dd9 100644 --- a/Revit_Core_Engine/Query/Level.cs +++ b/Revit_Core_Engine/Query/Level.cs @@ -42,24 +42,33 @@ public static Level Level(this Element element) if (element == null) return null; + Level level = null; Document doc = element.Document; ElementId levelId = element.LevelId; // First priority: Check LevelId property (most direct way to get level) if (levelId.Value() != -1) - return doc.GetElement(levelId) as Level; + level = doc.GetElement(levelId) as Level; + if (level != null) + return level; // Second priority: Check level parameters (LevelParameter or BaseLevelParameter) Parameter levelParameter = element.LevelParameter() ?? element.BaseLevelParameter(); if (levelParameter != null) - return doc.GetElement(levelParameter.AsElementId()) as Level; + level = doc.GetElement(levelParameter?.AsElementId()) as Level; + if (level != null) + return level; // Third priority: Check if element is work plane-based and hosted on a level if (element.IsWorkPlaneLevelBased()) - return (element as FamilyInstance)?.Host as Level; + level = (element as FamilyInstance)?.Host as Level; + if (level != null) + return level; - // No level found - return null; + // Fourth priority: Use the LevelBelow method to find the level below the element's location point + level = element.Document.LevelBelow(element.LocationPoint()); + + return level; } /***************************************************/ diff --git a/Revit_Core_Engine/Query/LevelParameter.cs b/Revit_Core_Engine/Query/LevelParameter.cs index 6cffd7f3d..6edde8ff6 100644 --- a/Revit_Core_Engine/Query/LevelParameter.cs +++ b/Revit_Core_Engine/Query/LevelParameter.cs @@ -45,7 +45,8 @@ public static Parameter LevelParameter(this Element element) .Select(x => element.get_Parameter(x)) .Where(x => x != null) .OrderByDescending(x => x.AsElementId().Value() != -1) // Valid ElementIds first - .FirstOrDefault(x => !x.IsReadOnly); + .ThenByDescending(x => x.IsReadOnly) + .FirstOrDefault(); } /***************************************************/ @@ -62,7 +63,8 @@ public static Parameter BaseLevelParameter(this Element element) .Select(x => element.get_Parameter(x)) .Where(x => x != null) .OrderByDescending(x => x.AsElementId().Value() != -1) // Valid ElementIds first - .FirstOrDefault(x => !x.IsReadOnly); + .ThenByDescending(x => x.IsReadOnly) + .FirstOrDefault(); } /***************************************************/ @@ -79,7 +81,8 @@ public static Parameter TopLevelParameter(this Element element) .Select(x => element.get_Parameter(x)) .Where(x => x != null) .OrderByDescending(x => x.AsElementId().Value() != -1) // Valid ElementIds first - .FirstOrDefault(x => !x.IsReadOnly); + .ThenByDescending(x => x.IsReadOnly) + .FirstOrDefault(); } /***************************************************/