pyRevit Script Typologies

Templates to start from based on your script's purpose.

Metadata for scripts:

__title__ = 'Title of script'
__author__ = 'Thomas Goodwin'
__helpurl__ = ""
__min_revit_ver__= 2016
__max_revit_ver__ = 2023
__beta__ = True

Collect all instances of a category and iterate over a property of those instances

from Autodesk.Revit import DB

doc = __revit__.ActiveUIDocument.Document

#Collect all instances
instance_collector = DB.FilteredElementCollector(doc)\

# Iterate over them
total_volume = 0.0

for instance in instance_collector:
    parameter = wall.Parameter[DB.BuiltInParameter.HOST_VOLUME_COMPUTED]
    if parameter:
        total_volume = total_volume + parameter.AsDouble()

# Output
print("Total Volume of all walls in model is: {}".format(total_volume))

Edit the value of a parameter for selected objects:

from Autodesk.Revit import DB

parameter_name = '<parameter name>'
value = 'value'
__title__= f'Edit {parameter_name}'

doc = __revit__.ActiveUIDocument.Document
selection = __revit__.ActiveUIDocument.Selection
selected_items = [doc.GetElement(x) for x in selection.GetElementIds()]

# Create a Revit transaction
t = DB.Transaction(doc, __title__)
# Add change to transaction for each selected item
for item in selected_items
    parameter = item.LookupParameter(parameter_name)
# Commit the transaction to Revit

Dump document-specific information to a JSON file

from Autodesk.Revit import DB
from pyrevit import script
import json

doc = __revit__.ActiveUIDocument.Document
selection = __revit__.ActiveUIDocument.Selection

selection_ids = [x for x in selection.GetElementIds()]

data = {}
for item_id in selection_ids:
    element = doc.GetElement(item_id)
    key = element.UniqueId
    parameter = '<parameter name>'
    value = element.LookupParameter(parameter)
    data[key] = value

filename = script.get_document_data_file('<file name>', 'json', add_cmd_name=False)
with open(path, 'w') as f:
         json.dump(data, f)

-Published 9 am Thu, Feb 16 2023-