Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 14 additions & 5 deletions Revit_Core_Engine/Query/Level.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

/***************************************************/
Expand Down
9 changes: 6 additions & 3 deletions Revit_Core_Engine/Query/LevelParameter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

/***************************************************/
Expand All @@ -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();
}

/***************************************************/
Expand All @@ -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();
}

/***************************************************/
Expand Down
Loading