Transaction Roolback upon using forms.alert("Alert Message")

Hi all, as the title, I have a script that updates my door parameter based from an excel file and it’s working really well. I wanted to add a prompt to tell a user that the script was properly executed, but when I put this:

forms.alert('Door Parameters updated!', warn_icon=False, exitscript=True)

before or after the commit it doesn’t update the parameters, I’m wondering if there’s an attribute that controls the execution that I’m not aware of. thanks!

Can you show a bigger piece of the script?

Du you use the transaction in a context manager ‘with revit.Transaction(“blah”)’ or with a t.start … t.commit…
?

hi @Jean-Marc I use it like this:

with Transaction(doc, __title__) as t:
    t.Start()
    # 🟨 ASSIGN DOOR MARK AND NUMBERS
    doors_by_room = {}
    for door in door_list:
        room = selected_room
        if room:
            room_number = room.Number
            if room_number not in doors_by_room:
                doors_by_room[room_number] = []
            doors_by_room[room_number].append(door)

    # Generate a sequence for each group of doors and assign door numbers
    for room_number, doors in doors_by_room.items():
        for i, door in enumerate(doors):
            door_sequence = str(i + 1).zfill(2)
            door_mark = "{}-{}".format(room_number, door_sequence)
            door_number = "D{}".format(door_sequence)
            door.get_Parameter(BuiltInParameter.ALL_MODEL_MARK).Set(door_mark)
            door.LookupParameter('Door Number').Set(door_number)

    # 🟡 COPYING DOORS PARAM TO ROOM
    # GET THE LIST TO BE SET
    room_door_marks_list = []
    room_door_clear_heights_list = []
    room_door_clear_widths_list = []
    room_door_remarks_list = []

    for door in door_list:
        # 🟦 GET DOOR PARAMETERS TO COPY
        # -------xxx get the type first xxx------
        dr_type_id = door.GetTypeId()
        door_symbol = doc.GetElement(dr_type_id)
        # parameter
        door_mark_param = door.LookupParameter('Door Number')
        door_height_param = door_symbol.LookupParameter('Door Designated Clear Height')
        door_width1_param = door_symbol.LookupParameter('Door Designated Clear Width 1')
        door_width2_param = door_symbol.LookupParameter('Door Designated Clear Width 2')
        door_remarks_param = door_symbol.LookupParameter('Door Remarks')

        # 🟨 add string method
        door_mark = door_mark_param.AsValueString()
        door_height = door_height_param.AsValueString()
        if door_width1_param and door_width2_param:
            door_width1 = door_width1_param.AsValueString()
            door_width2 = door_width2_param.AsValueString()
            # append
            room_door_clear_widths_list.append(door_width1 + "+" + door_width2)
        else:
            door_width1 = door_width1_param.AsValueString()
            # append
            room_door_clear_widths_list.append(door_width1)
        door_remarks = door_remarks_param.AsValueString()

        # Append door parameters to lists
        room_door_marks_list.append(door_mark)
        room_door_clear_heights_list.append(door_height)
        room_door_remarks_list.append(door_remarks)

    # Convert lists to strings
    room_door_marks_str = '\n\n'.join(room_door_marks_list)
    room_door_clear_heights_str = '\n\n'.join(room_door_clear_heights_list)
    room_door_clear_widths_str = '\n\n'.join(room_door_clear_widths_list)
    room_door_remarks_str = '\n\n'.join(room_door_remarks_list)
    #
    # 🟪 ROOM PARAMETERS
    room = selected_room
    room_door_marks = room.LookupParameter('Room Door Marks')
    room_door_clear_widths = room.LookupParameter('Room Door Clear Widths')
    room_door_clear_heights = room.LookupParameter('Room Door Clear Heights')
    room_door_remarks = room.LookupParameter('Room Door Description')

    # ⭕SET
    # ---------------XXX--------------------
    # DOOR MARKS
    room_door_marks.Set(room_door_marks_str)
    room_door_clear_heights.Set(room_door_clear_heights_str)
    room_door_clear_widths.Set(room_door_clear_widths_str)
    room_door_remarks.Set(room_door_remarks_str)

    t.Commit()


forms.alert('Door Parameters updated!', warn_icon=False, exitscript=True)

try this one out:

from pyrevit import revit #if you did not import it in your boilerplate

with revit.Transaction(doc, __title__): # the pyrevit.revit module has a nicer way to handle transaction

    # 🟨 ASSIGN DOOR MARK AND NUMBERS
    doors_by_room = {}
    for door in door_list:
        room = selected_room
        if room:
            room_number = room.Number
            if room_number not in doors_by_room:
                doors_by_room[room_number] = []
            doors_by_room[room_number].append(door)

    # Generate a sequence for each group of doors and assign door numbers
    for room_number, doors in doors_by_room.items():
        for i, door in enumerate(doors):
            door_sequence = str(i + 1).zfill(2)
            door_mark = "{}-{}".format(room_number, door_sequence)
            door_number = "D{}".format(door_sequence)
            door.get_Parameter(BuiltInParameter.ALL_MODEL_MARK).Set(door_mark)
            door.LookupParameter('Door Number').Set(door_number)

    # 🟡 COPYING DOORS PARAM TO ROOM
    # GET THE LIST TO BE SET
    room_door_marks_list = []
    room_door_clear_heights_list = []
    room_door_clear_widths_list = []
    room_door_remarks_list = []

    for door in door_list:
        # 🟦 GET DOOR PARAMETERS TO COPY
        # -------xxx get the type first xxx------
        dr_type_id = door.GetTypeId()
        door_symbol = doc.GetElement(dr_type_id)
        # parameter
        door_mark_param = door.LookupParameter('Door Number')
        door_height_param = door_symbol.LookupParameter('Door Designated Clear Height')
        door_width1_param = door_symbol.LookupParameter('Door Designated Clear Width 1')
        door_width2_param = door_symbol.LookupParameter('Door Designated Clear Width 2')
        door_remarks_param = door_symbol.LookupParameter('Door Remarks')

        # 🟨 add string method
        door_mark = door_mark_param.AsValueString()
        door_height = door_height_param.AsValueString()
        if door_width1_param and door_width2_param:
            door_width1 = door_width1_param.AsValueString()
            door_width2 = door_width2_param.AsValueString()
            # append
            room_door_clear_widths_list.append(door_width1 + "+" + door_width2)
        else:
            door_width1 = door_width1_param.AsValueString()
            # append
            room_door_clear_widths_list.append(door_width1)
        door_remarks = door_remarks_param.AsValueString()

        # Append door parameters to lists
        room_door_marks_list.append(door_mark)
        room_door_clear_heights_list.append(door_height)
        room_door_remarks_list.append(door_remarks)

    # Convert lists to strings
    room_door_marks_str = '\n\n'.join(room_door_marks_list)
    room_door_clear_heights_str = '\n\n'.join(room_door_clear_heights_list)
    room_door_clear_widths_str = '\n\n'.join(room_door_clear_widths_list)
    room_door_remarks_str = '\n\n'.join(room_door_remarks_list)
    #
    # 🟪 ROOM PARAMETERS
    room = selected_room
    room_door_marks = room.LookupParameter('Room Door Marks')
    room_door_clear_widths = room.LookupParameter('Room Door Clear Widths')
    room_door_clear_heights = room.LookupParameter('Room Door Clear Heights')
    room_door_remarks = room.LookupParameter('Room Door Description')

    # ⭕SET
    # ---------------XXX--------------------
    # DOOR MARKS
    room_door_marks.Set(room_door_marks_str)
    room_door_clear_heights.Set(room_door_clear_heights_str)
    room_door_clear_widths.Set(room_door_clear_widths_str)
    room_door_remarks.Set(room_door_remarks_str)

forms.alert('Door Parameters updated!', warn_icon=False, exitscript=True)

I tend to prefer the way the pyrevit revit module handles the transactions
https://ein.sh/pyRevit/reference/pyrevit/revit/db/transaction/#pyrevit.revit.db.transaction.Transaction

hi @Jean-Marc thank for this, but still the alert didn’t show but the script executed, i found out about output window so i guess that’ll do for now, thanks!

Got it;

from pyrevit import revit, forms, DB #if you did not import it in your boilerplate

doc = revit.doc

doors = DB.FilteredElementCollector(doc).OfCategory(DB.BuiltInCategory.OST_Doors).WhereElementIsNotElementType().ToElements()
phase = DB.FilteredElementCollector(doc).OfCategory(DB.BuiltInCategory.OST_Phases).WhereElementIsNotElementType().ToElements()

with revit.Transaction("blah"): 
    doors_by_room = {}
    for door in doors:
        room = door.ToRoom[phase[1]]
        if room:
            name = room.get_Parameter(DB.BuiltInParameter.ROOM_NAME).AsString()
            door.get_Parameter(DB.BuiltInParameter.	ALL_MODEL_INSTANCE_COMMENTS
).Set(name)

forms.alert('Door Parameters updated!', warn_icon=False, exitscript=False) # here is the important part, the exit script rolls back the transaction

the exitscript set to True rolls back the transaction

1 Like

Worked as intended! Thank you very much! :pray: