Hi all,
I’m new to here and it’s my first post. If this topic has been covered already, I apologies in advance.
The image above is my first simple tools by using pyrevit.forms.SelectFromList to display all the rooms in the project and select them.
Is there a way to remain this pop-up window after clicking the “Select Room” button? Basically, I need to re-run this script every single time when I selected the room but if this window remains until clicking the x button in top-right corner then I don’t have to re-run this script over and over again.
Below is my source code for this function and appreciate any comments on this;
from Autodesk.Revit.DB import *
from pyrevit import forms
from System.Collections.Generic import List
uidoc = __revit__.ActiveUIDocument
# Retrieve rooms from the document
allrooms = FilteredElementCollector(uidoc.Document)\
.OfCategory(BuiltInCategory.OST_Rooms)\
.ToElements()
# Filter out rooms without a value in the "Number" parameter
valid_rooms = [room for room in allrooms if room.get_Parameter(BuiltInParameter.ROOM_NUMBER).AsString()]
# Sort valid rooms by room number value
sorted_rooms = sorted(valid_rooms, key=lambda room: room.get_Parameter(BuiltInParameter.ROOM_NUMBER).AsString())
# Create a list to store room IDs
room_ids = []
# Define a function to get room number and name as a string
def get_room_number_and_name(room):
room_number = room.get_Parameter(BuiltInParameter.ROOM_NUMBER).AsString()
room_name = room.get_Parameter(BuiltInParameter.ROOM_NAME).AsString()
return room_number + " - " + room_name
# Get the list of room number and name combinations
room_number_name_list = [get_room_number_and_name(room) for room in sorted_rooms]
# Display a selection dialog for the list of room numbers and names
selected_room_numbers_names = forms.SelectFromList.show(room_number_name_list, title='Select Room by Number', multiselect=True, button_name='Select Room')
# Check if rooms are selected
if selected_room_numbers_names:
for selected_room_number_name in selected_room_numbers_names:
# Find the corresponding room element based on the selected room number and name
selected_room = next(room for room in sorted_rooms if get_room_number_and_name(room) == selected_room_number_name)
room_ids.append(selected_room.Id)
# Select the rooms in the Revit UI
uidoc.Selection.SetElementIds(List[ElementId](room_ids))