Collecting all types of a family available in document

python
#1

Hello guys,
I am facing a problem in a python script. I want to collect all types of a certain family using the FIlteredElementCollector method. Any suggestions?

Thank you

#2

You can use the WhereElementIsElementType() method for the FilteredElementCollector, e.g.:
elements = FilteredElementCollector(doc).WhereElementIsElementType().ToElements()
Keep in mind that this will get all types currently loaded into the document, not necessarily those which also have instances in the document.

#3

Hello @cgartland,
Thank you for your reply. I tried this and it is actually giving the families not the types. I defined a function to get all the families in the document in a certain category(see image). But what I want next is to get all the types of the selected family and that’s what I didn’t achieve.

Any help will be appreciated.

#4

Hmm…when directly outputting from Dynamo, it looks like it’s providing the correct information, but the actual object is a FamilySymbol. I’m not sure what the correct method is for getting the isolated types from each of these elements. Here’s what I’ve output so far:

image

import clr

clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *

clr.AddReference('RevitServices')
from RevitServices.Persistence import DocumentManager

doc = DocumentManager.Instance.CurrentDBDocument
id = UnwrapElement(IN[0]).Id

fam_types = FilteredElementCollector(doc)\
	.OfCategoryId(id)\
	.WhereElementIsElementType()\
	.ToElements()

OUT = fam_types
#5

Not sure if you have seen these or not but its a good place to start. These are posts I have started in the past with similar topics. I think the first one should be close to what you want. The solution allows you to select all instances of a particular type.

#6

I actually have a node for this in my MEPover package (although it does not use the FilteredElementCollector, but you can probably incorporate the code into your own):
image

This is the code for it:

import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

# Import DocumentManager and TransactionManager
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager

doc = DocumentManager.Instance.CurrentDBDocument

#The inputs to this node will be stored as a list in the IN variables.
if isinstance(IN[0], list):
	toggle = 0
	family = UnwrapElement(IN[0])
else:
	toggle = 1
	family = [UnwrapElement(IN[0])]

listout = []
for fam in family:
	ids = fam.GetFamilySymbolIds()
	types = []
	for i in ids:
		type = doc.GetElement(i)
		types.append(type)
	listout.append(types)

#Assign your output to the OUT variable.
if toggle == 0:
	OUT = listout
else:
	OUT = types
#7

Hello guys, thank you all for your contribution!
Actually I don’t know if things are different between writing python code in a dynamo node and writing the code in a separate IDE. Because I tried the function UnwrapElement and it is not working!

Anyway, I found a solution for my problem, maybe it is a workaround method but at least I achieved what I want.

The method is the following:

Step1 : I defined a function to get all the available types of a certain category and then get their families (of course I prevented family duplication in the returned dictionary)

Step 2: I defined another function that will filter types according to the desired family selected by user.


feedback is appreciated

#8

If your input is going to be the family then the fastest way to get all of its types is as follows:

ids = family.GetFamilySymbolIds()
types = []
for i in ids:
	type = doc.GetElement(i)
	types.append(type)
listout.append(types)

UnwrapElement is indeed only used in Dynamo python nodes.

2 Likes
#9

@T_Pover Thank you man I can change my code now. appreciated :slight_smile:

1 Like