Skip to content

Level Assign

Level Assign scans elements in a Revit model and identifies those whose assigned level does not match the closest level to their actual elevation. It provides a visual review of all mismatched elements with the ability to reassign them automatically (to the closest level) or to a specific target level, while preserving each element’s absolute position by adjusting offsets accordingly.

From the developer

This one started because I kept finding elements on the wrong level after importing geometry from other tools. Fixing them one by one in Revit was painful, so I built a way to scan and fix them in bulk. It’s still Experimental, so if you run into anything unexpected, let me know on GitHub.

Find Level Assign on the Amorphous ribbon tab in the Model QA panel.

If you have elements pre-selected in Revit, the tool will automatically scan them when the window opens.


  • Scan Scope Options - Analyze selected elements, all elements in the active view, or the entire model
  • Mismatch Detection - Identifies elements assigned to the wrong level by comparing their absolute elevation against all project levels
  • Dual Constraint Handling - Correctly handles elements with both base and top level constraints (walls, shaft openings, structural columns)
  • Auto-assign Mode - Reassigns each element to its closest level and recalculates offsets to maintain position
  • Specific Level Mode - Reassigns all checked elements to a single target level
  • Category and Search Filtering - Filter scan results by category, text search, or mismatched-only view
  • Select in Revit - Push checked elements back to the Revit selection, or double-click a row to zoom to an individual element

  1. Open a project - Open a Revit project containing elements you want to audit
  2. Click “Level Assign” on the ribbon
  3. Choose scan scope - Select which elements to analyze
  4. Click Scan - Review the results in the data grid
  5. Filter and select - Narrow down the list and check elements to reassign
  6. Choose assignment mode - Auto-assign to closest level, or pick a specific level
  7. Click Apply - Reassign all checked elements in a single transaction

Select the scan scope using the radio buttons at the top of the window:

ScopeDescription
Selected ElementsOnly scans elements currently selected in Revit
Active ViewScans all visible elements in the current view
Entire ModelScans all view-independent model elements in the project

Click Scan to analyze each element’s level assignment. The tool compares every element’s absolute elevation against all project levels and identifies mismatches.

After scanning, a summary line reports:

StatisticDescription
TotalNumber of elements scanned
MismatchedElements assigned to the wrong level
CorrectElements already on the correct level
SkippedElements without a writable level parameter

The data grid displays detailed information for each element:

ColumnDescription
CategoryThe element’s Revit category
Family / TypeThe element’s family and type name
Current LevelThe level currently assigned to the element
Closest LevelThe level closest to the element’s actual elevation
ConstraintWhether it is a base or top constraint
OffsetThe current offset value from the assigned level

Mismatched rows are highlighted in amber with an alert icon. Correct assignments show a green check icon.

Use the filtering tools to narrow down the results:

  • Search box - Type to filter by any text in the grid (family name, type, level name)
  • Category dropdown - Show only elements of a specific category
  • Mismatched only - Check this to hide correctly assigned elements and focus on problems

Select elements for reassignment using checkboxes:

  • Individual checkboxes - Toggle specific elements
  • Category group headers - Check or uncheck all elements in a category at once
  • Header checkbox - Select or deselect all visible elements

Select how elements should be reassigned:

ModeDescription
Auto-assign closestEach checked element is reassigned to its geometrically closest level. Different elements may end up on different levels.
Reassign to: [Level]All checked elements are reassigned to a single target level selected from the dropdown.

Click Apply to reassign all checked elements. The tool processes everything in a single Revit transaction, adjusting offsets to preserve each element’s absolute position. The grid automatically re-scans afterward to reflect the updated state.


After importing or linking geometry, elements may be assigned to incorrect levels. Level Assign quickly identifies and corrects these mismatches in bulk.

Run a whole-model scan to verify that all elements are associated with the correct level before submitting for coordination or documentation. The mismatched-only filter makes it easy to focus on problems.

When levels are added, removed, or renamed during design changes, elements can end up on outdated levels. Use Level Assign to reassign them to the updated level structure.

Ensure elements are on the correct level before exporting to Navisworks, IFC, or other coordination formats where level associations affect clash grouping and model organization.


The tool processes all model-category elements that have a writable level parameter. This includes, but is not limited to:

Element TypeConstraint Handling
Walls and Shaft OpeningsBase Constraint and Top Constraint (when connected to a level)
Structural ColumnsBase Level and Top Level
Floors, Ceilings, and RoofsReference Level with offset adjustment
Family InstancesFurniture, equipment, plumbing fixtures, MEP elements (pipes, ducts, conduits, cable trays), structural framing (beams), and generic models
Any element with a writable level parameterStandard Revit built-in parameter set
From the developer

Getting the offset math right for every element type was the hardest part of building this. Revit treats system families and loadable families differently when you change their level via the API, so the tool has to detect which kind it’s dealing with and adjust accordingly. If you ever see an element shift position after reassignment, that’s a bug I want to hear about.


OptionDescriptionDefault
Scope: Selected ElementsScans only the current Revit selectionSelected (if elements are pre-selected)
Scope: Active ViewScans all elements visible in the active view-
Scope: Entire ModelScans all model elements in the project-
Mismatched onlyFilters the grid to show only elements whose level does not match the closest levelUnchecked
Auto-assign closestReassigns each element to its geometrically closest levelSelected
Reassign to: [Level]Reassigns all checked elements to a single target level-

  • Scan by view or selection for large models - For very large models, scan by active view or selection rather than the entire model to keep scan times manageable
  • Double-click to zoom - Double-click any row in the data grid to select that element in Revit and zoom to it for visual verification before applying changes
  • Use group checkboxes - Click the checkbox on category group headers to quickly check or uncheck all elements in that category
  • Verify after applying - The grid automatically re-scans after applying changes, so you can verify the results immediately without re-running the scan
  • Undo if needed - All changes are applied within a single Revit transaction that can be undone via Ctrl+Z
  • Use Escape to close - Press the Escape key to close the window at any time

LimitationDetails
Elements without writable level parameterElements such as model lines and room separation lines are skipped during scanning
Camera and viewer elements excludedThese element types are excluded from scanning
Annotation and analytical elements excludedOnly model categories are processed
Unresolvable levels skippedElements whose current level cannot be resolved are skipped
Specific level mode assigns both constraintsThe “Reassign to” specific level mode assigns both base and top constraints to the same level. This is useful mainly for moving elements between major levels, not for elements spanning multiple levels.
From the developer

Persistent settings (remembering your last scope and filter choices) and a tolerance threshold for mismatch detection are both on my list for when this graduates out of Experimental. If there’s something else that would make this more useful for your team, open an issue on GitHub.


Possible causes:

  • The selected scope contains no model elements (e.g., an empty view or no selection)
  • All elements in the scope lack writable level parameters

Solution: Switch to a broader scope (Active View or Entire Model) and verify that the view contains model elements, not just annotations or linked elements.

Possible causes:

  • The element does not have a writable level parameter (e.g., model lines, room separation lines)
  • The element is a camera, viewer, annotation, or analytical element
  • The element’s current level cannot be resolved

Solution: Check the element’s properties in Revit to confirm it has a level parameter. Elements without level assignments cannot be processed by this tool.

Possible causes:

  • The element’s elevation is very close to its assigned level, within the detection threshold
  • The element has unusual parameter configurations

Solution: Double-click the element in the grid to zoom to it in Revit and verify its actual position relative to its assigned level.

Possible causes:

  • The element was not checked in the grid
  • The element is on a read-only workset or is owned by another user in a workshared environment

Solution: Ensure the element’s checkbox is checked. In workshared projects, verify you have edit permissions for the element.