I ran into several methods now that return ElementId. My current one is trying to get filters from view templates. I used GetOrderedFilters and it returns ElementId. When I use RevitLookup and click on the value, which says “List” it gives me ParameterFilterElement where I can see all the values I would expect form the filters.
However when I try to get any of the info I get an AttributeError: ‘ElementId’ object has no attribute ‘Name’.
When I check out the ElementId class I don’t see anything about how I’m supposed to get the actual element from it. I’m I missing something here? What is the purpose of these methods returning ElementId?
ElementIds don’t have names, they are just a string of numbers. Whenever you have an ElementID and you want to get the actual element associated with it, you just have to call document.GetElement() like this:
import pyrevit
doc = pyrevit.revit.doc
element = doc.GetElement(YOUR ELEMENT ID)
Name = element.Name
Once you have the actual element, you can access all the associated Properties and Methods from there.
Getting the categories from a document is a little different. The way I get those is like this:
doc = revit.doc
allCategories = doc.Settings.Categories
usefulCategories = []
for c in allCategories:
if c.AllowsBoundParameters:
usefulCategories.append(c)
print c.Name
The “AllowsBoundParameters” property filters out so you only see categories that allow Project Parameters. You can skip that part, but you’ll get a bunch of categories that you probably won’t need.
I’m not trying to get all categories. Just the ones provided from GetCategories from filters which provides the elementId. As far as I know the only way to get a filter’s categories is using this method which returns elementId which I can’t seem to use with GetElement when it comes to categories.
This isn’t my final code, I’m just testing stuff out right now:
for f in filterList:
print("___________")
print(f.Name)
categoriesId = f.GetCategories()
print("Cat IDs :")
print(categoriesId)
categories = []
for cI in categoriesId:
print(cI)
categories.append(doc.GetElement(cI))
try:
for c in categories:
print("Categories are: " + str(c))
except:
print("No Categories?!?!")
I just tried this. Rather than using doc.GetElement() on the category Ids that come out of the GetCategories(), I loop through the list of categories and try to match the ids.
doc = revit.doc
allCategories = doc.Settings.Categories
filters = DB.FilteredElementCollector(doc).OfClass(DB.ParameterFilterElement).ToElements()
for filter in filters:
catIds = filter.GetCategories()
if len(catIds) > 0:
print "###{}###".format(filter.Name)
print "### Categories ###"
for id in catIds:
for cat in allCategories:
if cat.Id == id:
print cat.Name