Naar de inhoud
PyPath

Revit-parameters lezen en wijzigen met Python (met Transaction)

Parameters zijn de gegevens van je model. Zo lees je ze, zo vul je ze in bulk in, en dit zijn de valkuilen waardoor Set niets doet of een fout geeft.

5 min lezenBijgewerkt op 10 oktober 2026Gecontroleerd tegen de Revit API 2025-documentatie

Kort antwoord: haal een parameter op met element.get_Parameter(BuiltInParameter...) (of LookupParameter("naam") voor eigen parameters), lees hem met AsString(), AsDouble(), AsInteger() of AsValueString(), en wijzig hem met Set(waarde). Wijzigen mag alleen binnen een Transaction; in pyRevit schrijf je daarvoor with revit.Transaction("naam"):.

Een parameter ophalen

Er zijn twee manieren:

  • get_Parameter(BuiltInParameter.X) voor parameters die Revit zelf heeft, zoals lengte, diameter, merk, opmerkingen of systeemnaam. De namen staan in de enum BuiltInParameter, bijvoorbeeld CURVE_ELEM_LENGTH, RBS_PIPE_DIAMETER_PARAM, ALL_MODEL_MARK en ALL_MODEL_INSTANCE_COMMENTS.
  • LookupParameter("naam") voor parameters die jullie zelf hebben toegevoegd: projectparameters en shared parameters.

Weet je niet hoe een parameter in de API heet? Klik het element aan met de gratis add-in RevitLookup en kijk bij de parameters.

Waarom LookupParameter breekt in een Nederlandse Revit

LookupParameter zoekt op de naam die je in Revit ziet. Die hangt af van de taal van Revit: wat in een Engelse Revit "Length" heet, heet in een Nederlandse Revit "Lengte". Een script met LookupParameter("Length") werkt dan bij de ene collega wel en bij de andere niet. Gebruik voor ingebouwde parameters daarom altijd get_Parameter met een BuiltInParameter: die naam is in elke taal hetzelfde.

Een waarde lezen

Een parameter heeft een opslagtype (StorageType): tekst, kommagetal, geheel getal of een verwijzing naar een ander element. Daar hoort de leesfunctie bij:

Leesparameters.pushbutton/script.py
from Autodesk.Revit.DB import *

doc = __revit__.ActiveUIDocument.Document

leiding = (FilteredElementCollector(doc)
           .OfCategory(BuiltInCategory.OST_PipeCurves)
           .WhereElementIsNotElementType()
           .FirstElement())

diameter = leiding.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM)
print(diameter.StorageType)        # Double
print(diameter.AsDouble())         # in voet
print(diameter.AsValueString())    # zoals Revit hem toont
systeem = leiding.get_Parameter(BuiltInParameter.RBS_SYSTEM_NAME_PARAM)
print(systeem.AsString())
print(leiding.get_Parameter(BuiltInParameter.ELEM_TYPE_PARAM).AsValueString())
Uitvoer op het nagebootste kasmodel
Double
0.13123359580052493
40 mm
CV Aanvoer
Staal gelast
  • AsDouble() geeft het getal in de interne eenheid van Revit: voet. 0,131 voet is 40 mm.
  • AsValueString() geeft de tekst zoals Revit hem toont, met de eenheden van het project. Handig voor een lijst, niet om mee te rekenen.
  • AsString() is voor tekstparameters, AsInteger() voor gehele getallen en ja/nee, AsElementId() voor verwijzingen.

Een waarde wijzigen: altijd in een Transaction

Alles wat het model verandert, moet binnen een transaction. Met de hulpmodule van pyRevit is dat één regel. Dit script zet een opmerking op alle leidingen en telt hoe vaak het lukte:

Opmerking.pushbutton/script.py
from pyrevit import revit, DB

leidingen = (DB.FilteredElementCollector(revit.doc)
             .OfCategory(DB.BuiltInCategory.OST_PipeCurves)
             .WhereElementIsNotElementType()
             .ToElements())

gewijzigd = 0
with revit.Transaction("Opmerking invullen"):
    for leiding in leidingen:
        p = leiding.get_Parameter(DB.BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS)
        if p and not p.IsReadOnly:
            if p.Set("gecontroleerd"):
                gewijzigd += 1

print("Opmerking gezet op {} leidingen".format(gewijzigd))
Uitvoer op het nagebootste kasmodel
Opmerking gezet op 45 leidingen

Het hele with-blok is in Revit één stap die je met Ctrl+Z ongedaan maakt. Gaat er halverwege iets mis, dan draait pyRevit alles terug.

Zonder pyRevit-hulp: een kale Transaction

Buiten pyRevit, of als je liever alles zelf regelt, gebruik je de klasse Transaction uit de Revit-API. Vergeet dan het terugdraaien bij een fout niet:

script.py
from Autodesk.Revit.DB import *

doc = __revit__.ActiveUIDocument.Document
leiding = (FilteredElementCollector(doc)
           .OfCategory(BuiltInCategory.OST_PipeCurves)
           .WhereElementIsNotElementType()
           .FirstElement())
p = leiding.get_Parameter(BuiltInParameter.ALL_MODEL_INSTANCE_COMMENTS)

t = Transaction(doc, "Opmerking invullen")
t.Start()
try:
    p.Set("gecontroleerd")
    t.Commit()
except Exception:
    t.RollBack()
    raise
print(t.GetStatus())
Uitvoer op het nagebootste kasmodel
Committed

Valkuilen

Set geeft geen fout, maar False

Geef je een waarde van het verkeerde type, dan doet Set niets en geeft False. Een klassieker: een geheel getal op een parameter met kommagetallen.

script.py
from Autodesk.Revit.DB import *

doc = __revit__.ActiveUIDocument.Document
leiding = (FilteredElementCollector(doc)
           .OfCategory(BuiltInCategory.OST_PipeCurves)
           .WhereElementIsNotElementType()
           .FirstElement())
d = leiding.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM)

t = Transaction(doc, "Diameter")
t.Start()
print(d.Set(5))                     # geheel getal op een Double-parameter
nieuw = UnitUtils.ConvertToInternalUnits(50, UnitTypeId.Millimeters)
print(d.Set(nieuw))                 # Double: in voet
print(d.AsValueString())
t.RollBack()
Uitvoer op het nagebootste kasmodel
False
True
50 mm

Controleer daarom de uitkomst van Set, zoals in het voorbeeld met de opmerkingen hierboven.

Alleen-lezen parameters

Sommige parameters rekent Revit zelf uit, zoals de systeemnaam van een leiding. IsReadOnly is dan True, en Set geeft een fout: The parameter is read-only. Kijk dus eerst naar IsReadOnly.

Typeparameters

Een deel van de gegevens zit niet op het element, maar op zijn type. Het type haal je op met doc.GetElement(element.GetTypeId()). Wijzig je een typeparameter, dan verandert hij voor alle elementen van dat type. Doe dat dus bewust.

Eenheden

Lengtes en diameters staan intern in voet. Reken om met UnitUtils.ConvertToInternalUnits en UnitUtils.ConvertFromInternalUnits, met bijvoorbeeld UnitTypeId.Millimeters.

Wat er precies gebeurt als je de transaction vergeet, lees je in "Attempt to modify the model outside of transaction".