‘get rooms by level’ makes a comeback

I have gotten a request to upgrade my Get Rooms by Level node to Dynamo 0.7.1, so here it is:

You need to feed it a Level and a Boolean Toggle. If Boolean is set to True, this node will filter out unplaced and redundant rooms; else, it will include them in the selection.

Make sure to check out my [Dynamo download page](/content/?page_id=47 "Dynamo"/index.html).

Good luck!

#Copyright(c) 2014, Konrad K Sobon
# Archi-lab, http://wwww.archi-lab.net
# Default imports
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
# Import RevitAPI
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *
# Import DocumentManager and TransactionManager
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
# Import ToDSType(bool) extension method
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.ImportExtensions(Revit.GeometryConversion)
#Import Collections
from System.Collections.Generic import *
#The inputs to this node will be stored as a list in the IN variable.
dataEnteringNode = IN
doc = DocumentManager.Instance.CurrentDBDocument
app = DocumentManager.Instance.CurrentUIApplication.Application
levelInput = IN[0]
filterToggle = IN[1]
roomNames, validRooms = [], []
collector = FilteredElementCollector(doc)
levelFilter = ElementLevelFilter(UnwrapElement(levelInput).Id)
areaFilter = AreaFilter()
areaExcludes = collector.WherePasses(areaFilter).ToElements()
areaExcludes = list(areaExcludes)
element_set = ElementSet()
excludes = ListElementId
if len(areaExcludes) == 0:
logicalFilter = levelFilter
else:
for i in areaExcludes:
element_set.Insert(i)
elemIter = element_set.ForwardIterator()
elemIter.Reset()
while elemIter.MoveNext():
curElem = elemIter.Current
excludes.Add(curElem.Id)
filter = ExclusionFilter(excludes)
logicalFilter = LogicalAndFilter(levelFilter, filter)
if filterToggle == False:
allRoomsOnLevel = FilteredElementCollector(doc).OfClass(Autodesk.Revit.DB.SpatialElement).WherePasses(logicalFilter).ToElements()
for i in allRoomsOnLevel:
roomNames.append(i.get_Parameter("Name").AsString())
OUT = allRoomsOnLevel, roomNames
else:
allRoomsOnLevel = FilteredElementCollector(doc).OfClass(Autodesk.Revit.DB.SpatialElement).WherePasses(logicalFilter).ToElements()
for i in allRoomsOnLevel:
if i.Area != 0:
validRooms.append(i)
for i in invalidRooms:
roomNames.append(i.get_Parameter("Name").AsString())
OUT = validRooms, roomNames

view raw getRoomsByLevel.py