List Process, list map in python

Hello,
could you help me with some coding?.
I’m trying to code the same logic as in red circle in python.
Basically I don’t know how to processList intersection def.
Need output like from “list.map” after does.intersect node. Hope it does make sense to you :smiley:

Python warning:
"
Warning: IronPythonEvaluator.EvaluateIronPythonScript operation failed.
Traceback (most recent call last):
File “”, line 10, in
File “”, line 5, in ProcessList
File “”, line 5, in <lambda$170>
File “”, line 8, in Intersection
TypeError: Solid is not iterable
"

Tomasz,

The ProcessList() method takes care of zipping the two arguments from lists. You don’t have to perform that inside your Intersection() method. Basically change it to:

def Intersection(elA, elB):
    return elA.DoesIntersect(elB) 

Then call it like so:

OUT = ProcessList(Intersection, ducts, walls)

Make sure that the two lists ducts and walls are exactly of the same structure. It works like this:

ducts = [duct1, duct2, duct3]
walls = [wall1, wall2, wall3]

Calling ProcessList(Intersection, ducts, walls) would result in a list [bool, bool, bool] where bool is a true/false if duct1 intersected wall1, duct2 intersected wall2 and duct3 intersected wall3.

It WILL NOT run duct1 against ALL walls, just pair them up. That’s how Zip() works.

1 Like

That makes sense. Thank you!

As already explained by Konrad your ProcessList and zip() are comparable to how List.Combine works in Dynamo.

If you need List.map you can use a nested for loop:

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

solids1 = IN[0]
solids2 = IN[1]
OUT = []

for s1 in solids1:
	sublist = []
	for s2 in solids2:
		sublist.append(s1.DoesIntersect(s2))
	OUT.append(sublist)

List.map, cross-product lacing and this python script will return the same:

If you like map(), this will do the same:

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

OUT = map(lambda s1: map(lambda s2: s1.DoesIntersect(s2), IN[0]), IN[1])
7 Likes

That’s perfect. Thank you guys!