Too much iterations (looking for elements in links)

Hi guys,

This is my first post here. I’m just trying to find out what elements in some links are (customizing a node from archi-lab and other one from Springs. Thanks Konrad Sobon and Dimitar Venkov), but I have some troubles: I have two rooms and two links, and I just want to get 2 lists (one of each room), but finally I get 4 lists (two of each room). I know it’s a silly question, but I’m not able to achieve this.

Thanks in advance.

Here is the code:

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

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

clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import FilteredElementCollector, ElementCategoryFilter, XYZ

def tolist(obj1):
    if hasattr(obj1,"__iter__"): return obj1
    else: return [obj1]
def output1(l1):
    if len(l1) == 1: return l1[0]
    else: return l1

Link1 = UnwrapElement(tolist(IN[0]))
Cat1 = UnwrapElement(IN[1])
elements = []
rooms = UnwrapElement(tolist(IN[2]))

for room in rooms:
    value = room.LookupParameter("AR_Test").AsString()
    elementsInRoom = []
    for rvtLink in Link1:
        typeName = rvtLink.Name 
        separated = (typeName[:29]).replace("K120","")
        if separated == value:
            LinkDoc = rvtLink.GetLinkDocument()
            fec = FilteredElementCollector(LinkDoc).OfCategoryId(Cat1.Id).WhereElementIsNotElementType()
            for e in fec:
            	transform = rvtLink.GetTotalTransform()
            	pt = transform.OfPoint(e.Location.Point)
            	if room.IsPointInRoom(pt):					            	
            		elementsInRoom.append(e) 		
	elements.append(elementsInRoom)
                
OUT = elements

Hi @fiamJ77H2,

You have to iterate first on the links.
I didn’t try wit h your parameter " AR_Test" but it should work :

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

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

clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import FilteredElementCollector, ElementCategoryFilter, XYZ

def tolist(obj1):
    if hasattr(obj1,'__iter__'): return obj1
    else: return [obj1]
def output1(l1):
    if len(l1) == 1: return l1[0]
    else: return l1

Link1 = UnwrapElement(tolist(IN[0]))
Cat1 = UnwrapElement(IN[1])
elements = []
rooms = UnwrapElement(tolist(IN[2]))

for rvtLink in Link1:
	elementsInRoom = []
	for room in rooms:
		value = room.LookupParameter("AR_Test").AsString()
		typeName = rvtLink.Name
		separated = (typeName[:29]).replace("K120","")		
		if separated == value:
			LinkDoc = rvtLink.GetLinkDocument()
			fec = FilteredElementCollector(LinkDoc).OfCategoryId(Cat1.Id).WhereElementIsNotElementType()
			for e in fec:
				transform = rvtLink.GetTotalTransform()
				pt = transform.OfPoint(e.Location.Point)
				if room.IsPointInRoom(pt):					           	
					elementsInRoom.append(e) 		
	elements.append(elementsInRoom)
                
OUT = elements

1 Like

Hi Alban,

Thank you very much for your reply, You are right, but there is something wrong in my file and I don’t get the same as you (maybe beacuse I have linked files with attached files). Finally I fixed it with the next line:

finalElements = elements[1::len(Link1)]

It’s not the best solution but it works for now (with a bigger project I think Dynamo would stuck).

Thanks again for your answer.

Regards!