How to get From/ToRoom information from doors by phase?

Hello,

my code is a pit off… i want to get From/To Room information

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

def GetRooms(item, phase):
    if hasattr(item, "FromRoom") and str(phase.GetType()) == "Autodesk.Revit.DB.Phase":
        exits = 0
        try:
            if item.FromRoom[phase]: exits += 1
            if item.ToRoom[phase]: exits += 1
            return item.FromRoom[phase], item.ToRoom[phase], exits
        except:
            return None, None, 0
    else: return None, None, 0

items = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Doors)
phase = UnwrapElement(IN[0])


OUT = map(list, zip(*[GetRooms(x , phase) for x in items]))


2022-12-14_11h21_44

KR

Andreas

Hi @Draxl_Andreas,

I was gonna say you could take a look at the node from clockwork that does exactly what you are after, but I can see now that this is probably where you’ve gotten the inspiration :wink:

The code you wrote works if you specify in your collector, that it is only door instances you are after:

items = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Doors).WhereElementIsNotElementType().ToElements()

Try it and see if it works for you :slight_smile:

1 Like
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

def GetRooms(item, phase):
    if hasattr(item, "FromRoom") and str(phase.GetType()) == "Autodesk.Revit.DB.Phase":
        exits = 0
        try:
            if item.FromRoom[phase]: exits += 1
            if item.ToRoom[phase]: exits += 1
            return item.FromRoom[phase], item.ToRoom[phase], exits
        except:
            return None, None, 0
    else: return None, None, 0

items = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Doors).WhereElementIsNotElementType().ToElements()
phase = UnwrapElement(IN[0])


OUT = map(list, zip(*[GetRooms(x , phase) for x in items]))

@MartinSpence ,

it is still weard, i got the code from a book,… at least i should get some Ids ?

I copy+pasted your code and added the line i wrote earlier, and it outputted Rooms.

Do you have Rooms in Phase 01?

1 Like

@MartinSpence ,

there is only this phase …

this sentence is still weard for mi

OUT = map(list, zip(*[GetRooms(x , phase) for x in items]))

The map(list, zip… restructures the outputlist so you get a list with toRoom, fromRoom, counts. So it’s a different way to strcture the output for the node, but not necessary to get an output.

If you leave it out, you will get to/from/counter for each door element:

2 Likes

@MartinSpence ,

code works in 2022!

1 Like