☀️
C# / Revit API Solved

How to extract the Reference Level from a FamilyInstance in Revit API 2025/2026?

bimusers.com
bimusers.com API Specialist • 327 pts
148 views 1 answers
Technical Context
SoftwareRevit 2025
Language / APIC#
Reported ErrorNullReferenceException on LevelId

When iterating through FamilyInstances (such as mechanical equipment or structural framing), instance.LevelId occasionally returns ElementId.InvalidElementId for face-based or hosted families.

What is the most reliable way in C# to resolve the actual host or reference level?

1 Answers

ACCEPTED SOLUTION
bimusers
bimusers API Specialist 1 week ago

For face-based or hosted families, instance.LevelId is often null or invalid. Use the built-in parameter fallback hierarchy:

public Level GetInstanceLevel(Document doc, FamilyInstance fi)
{
    // 1. Try direct LevelId
    if (fi.LevelId != ElementId.InvalidElementId)
        return doc.GetElement(fi.LevelId) as Level;

    // 2. Check INSTANCE_REFERENCE_LEVEL_PARAM
    Parameter refLvlParam = fi.get_Parameter(BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM);
    if (refLvlParam != null && refLvlParam.AsElementId() != ElementId.InvalidElementId)
        return doc.GetElement(refLvlParam.AsElementId()) as Level;

    // 3. Check SCHEDULE_LEVEL_PARAM
    Parameter schLvlParam = fi.get_Parameter(BuiltInParameter.INSTANCE_SCHEDULE_ONLY_LEVEL_PARAM);
    if (schLvlParam != null && schLvlParam.AsElementId() != ElementId.InvalidElementId)
        return doc.GetElement(schLvlParam.AsElementId()) as Level;

    return null;
}

This guarantees resolution across face-based, workplane-based, and standard family placements!