Getting loadbearing elements - structural, how?

Hello,

i want to filter al my structural elements, floors, walls, slabs, beams,…

so how can i do that well

my code works partly

import clr

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

clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *

clr.AddReference('System')
from System.Collections.Generic import List

clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)
clr.ImportExtensions(Revit.Elements)

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

doc = DocumentManager.Instance.CurrentDBDocument
uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument

collectorWalls = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls)
placedWalls = collectorWalls.WhereElementIsNotElementType().ToElements()

collectorColumns = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StructuralColumns)
placedColumns = collectorColumns.WhereElementIsNotElementType().ToElements()

collectorFloors = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Floors)
placedFloors = collectorColumns.WhereElementIsNotElementType().ToElements()

staticFloors = []

for i in UnwrapElement(placedFloors):
	if i.get_Parameter(BuiltInParameter.FLOOR_PARAM_IS_STRUCTURAL).AsBoolean() == True:
		staticFloors.append(i)
	else:
		pass

OUT = placedWalls,placedColumns, placedFloors, staticFloors

grafik


KR

Andreas

Parameters don’t have an AsBoolean() method. Use AsInteger() instead.

1 Like

@Nick_Boyts

for any reason it still remains as an error


is there any other error? or a better way to handle it?

You still have an issue with at least one element not having that parameter, which is why it’s returning NoneType. It looks like you copied the line from placedColumns and didn’t change it for floors, so you’re using the collector for columns in line 33.

@Nick_Boyts ,

collectorFloors = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Floors)
placedFloors = collectorFloors.WhereElementIsNotElementType().ToElements()

staticFloors = []

for i in UnwrapElement(placedFloors):
	if i.get_Parameter(BuiltInParameter.FLOOR_PARAM_IS_STRUCTURAL).AsInteger() == 1:
		staticFloors.append(i)
	else:
		pass

OUT = staticFloors

it is missing the step to collect the elements ?
or do i precheck my elements and based on that collect my load beariing elements?


collectorFloors = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Floors)
placedFloors = collectorFloors.WhereElementIsNotElementType().ToElements()

staticFloors = []

for i in UnwrapElement(placedFloors):
	p = i.get_Parameter(BuiltInParameter.FLOOR_PARAM_IS_STRUCTURAL).AsInteger()
	if p == 1:
		staticFloors.append(i)
	else:
		pass

OUT = staticFloors

Your initial code was using the wrong collector. It looks like you’ve since fixed it? Are you still getting the same NoneType error?

1 Like

@Nick_Boyts ,

the error remains

So first I’d just return my list of floors to make sure that’s giving me the elements I expect. I’m not aware of a scenario where a floor doesn’t have that parameter but it may exist. In that case you would have to check for the parameter before getting the value.

1 Like