Get elements in active view from revit links

i have this code - i get all rooms from link file, but how can i get rooms just in active view ?

import clr
clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)
clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
doc = DocumentManager.Instance.CurrentDBDocument
###
collector = FilteredElementCollector(doc)
filter = ElementCategoryFilter(BuiltInCategory.OST_RvtLinks) 
linkinst=collector.WherePasses(filter).WhereElementIsNotElementType().ToElements()

linkdoc = []
for i in linkinst:
    linkdoc.append(i.GetLinkDocument()) 

for i in linkdoc:    
    rooms = FilteredElementCollector(i).OfCategory(BuiltInCategory.OST_Rooms).WhereElementIsNotElementType().ToElements()


OUT = rooms

hi @til.shviger
try filter the rooms by level, get ones thats the same level of active view

@khuzaimah.ElecEng , good day!

Yes, I did. but we get the names of the levels from the linked file , which may not coincide with the names of the levels of the active file. need to control names of the levels. I would like to filter out of the room by this method:

FilteredElementCollector(doc,doc.ActiveView.Id).WherePasses(filter).ToElements()

but with elements from the linked files is not working :confused:

Hi @til.shviger

1 Like

@Kulkul, thank you for the solution, but I got the following error

@til.shviger If you could, please copy and paste your Python code as preformatted text. See below post
is a gif showing how you can post it as preformatted text.

import clr

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

linkdoc=IN[0]
category=IN[1]
if isinstance(IN[2],list):
	views=IN[2]
else:
	views=[IN[2]]
	
els=[]
fec=ElementCategoryFilter(System.Enum.ToObject(BuiltInCategory, category.Id))
ids=[v.Id for v in views]
idlist=[ElementId(i) for i in ids] [0]
#for i in idlist:
#	els.append(FilteredElementCollector(linkdoc,idlist).WherePasses(fec).WhereElementIsNotElementType().ToElements())
	
OUT= FilteredElementCollector(linkdoc,idlist).WherePasses(fec).WhereElementIsNotElementType().ToElements()

now i get the list of revit link documents
that

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

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

doc=DocumentManager.Instance.CurrentDBDocument

collector=FilteredElementCollector(doc)

link_inst=collector.OfCategory(BuiltInCategory.OST_RvtLinks).WhereElementIsNotElementType().ToElements()

OUT=[[i.Name, i, i.GetLinkDocument()] for i in link_inst]

for example when I use all your code without any changes I get this:

import clr

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

linkdoc=IN[0]
category=IN[1]
if isinstance(IN[2],list):
	views=IN[2]
else:
	views=[IN[2]]
	
els=[]
fec=ElementCategoryFilter(System.Enum.ToObject(BuiltInCategory, category.Id))
ids=[v.Id for v in views]
idlist=[ElementId(i) for i in ids] 
for i in idlist:
	els.append(FilteredElementCollector(linkdoc,idlist).WherePasses(fec).WhereElementIsNotElementType().ToElements())
	
OUT= els

@til.shviger You didn’t completely followed my code:
image

import clr

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

linkdoc=IN[0]
category=IN[1]
if isinstance(IN[2],list):
	views=IN[2]
else:
	views=[IN[2]]
	
els=[]
fec=ElementCategoryFilter(System.Enum.ToObject(BuiltInCategory, category.Id))
ids=[v.Id for v in views]
idlist=[ElementId(i) for i in ids] 
for i in idlist:
	els.append(FilteredElementCollector(linkdoc,i).WherePasses(fec).WhereElementIsNotElementType().ToElements())
	
OUT= els

image

I haven’t thought of anything better than this :thinking:

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

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

doc=DocumentManager.Instance.CurrentDBDocument

link_doc = IN[0]

link_collector=FilteredElementCollector(link_doc)
rooms=link_collector.OfCategory(BuiltInCategory.OST_Rooms).ToElements()

view_name=doc.ActiveView.get_Parameter(BuiltInParameter.PLAN_VIEW_LEVEL).AsString()

els_view=[i for i in rooms if UnwrapElement(i).get_Parameter(BuiltInParameter.LEVEL_NAME).AsString()==view_name ] 

OUT=els_view
3 Likes

is it possible to get list in one INPUT