Skip to content

category.type

The category field on a FamilySymbol contains three subfields:

"category": {
  "name": "Doors",
  "label": "OST_Doors",
  "type": "Model"
}

category.type is Revit's internal category classification. It tells you what kind of category something belongs to — not which specific category, but what role that category plays in Revit.


The possible values

Value Revit name What it contains
"Model" Model 3D elements placed in the model — doors, walls, beams, equipment
"Annotation" Annotation 2D view-specific content — tags, dimensions, text notes, detail items
"Internal" Internal Revit-internal categories — model groups, reference planes
"Invalid" Invalid Categories Revit cannot classify

In practice, DAQS rules almost exclusively work with "Model".


Why it matters in filters

A Revit model contains a large number of FamilySymbol objects across all category types. Without filtering on category.type, your query includes annotation families, detail component families, and internal categories — most of which are irrelevant to data quality rules.

Filtering to "Model" restricts the scope to loadable families that produce physical 3D elements:

$[type = "FamilySymbol" and values.category.type = "Model"]

This is often the first condition in production filters because it removes a large portion of irrelevant objects in one step.


Typical combined filter

In real rules, category.type is combined with a category inclusion or exclusion list:

(
  $CategoryExclusion := ["OST_DetailComponents"];

  $symbols := $[
    type = "FamilySymbol"
    and values.category.type = "Model"
    and $not(values.category.label in $CategoryExclusion)
  ];

  $[type = "FamilyInstance" and parent.id in $symbols.id].{
    "id": id,
    "name": name,
    "mark": values.mark
  }
)

The category.type = "Model" condition runs first as a broad scope filter. The label-based exclusion list then removes specific unwanted categories within that scope.


Relation to the other category fields

Field Example Use for
category.type "Model" Broad scope — include/exclude entire category classes
category.label "OST_Doors" Specific filtering — target one or more named categories
category.name "Doors" Display only — do not use in filter conditions

Use category.type for the broad first pass. Use category.label for the specific category conditions that follow.