What does Solid Intersection expect as input?

Solid Intersection documentation says it function is to: “Perform a solid intersection on two Brep sets”

The parameters A, B are described as “First Brep set”, and “Second Brep set” in the (almost nonexistent) documentation.

My thinking is that the term “sets” means that A and B can be lists of closed Breps.

I am trying to make a waffle structure by intersecting a bunch of simple boxes at the moment. I have 8 waffle segments in X-direction , and 11 in Y-direction.

If I use List Item to present a single Brep to each of A, B, it works.

If I use ListItem to present 2 Brep in A and 2 in B, it fails.

So I thought, OK, I am wrong when the documentation says “sets” means I have to take the Solid Union of the X set and the Y set. Nope, that doesn’t work.

Then I thought OK, the documentation is wrong about being “sets”. But it will still do them presented one a time in A, B, so I tried CrossReference to do that

So, I am mystified…

You got a file?

Peobably you mean somthing like this.

1.gh (8.6 KB)

The definition where this came up is large, so I hoped that somebody could answer based on what Solid Intersection expects. I have now made a small version.

An expert user showed me how to do it correctly - you need to graft up one of the two arguments to Solid Intersection. But there is nothing in the documentation that says this, and it is contrary to the behavior of other components.

The example that Mahan posted is not quite what I am doing - that makes something that looks like a waffle, but I meant waffle as the term is used in constructing shapes from two orthogonal sets of plates.

solid intersection problem.gh (16.1 KB)

It’s a bit tricky, but the components are working all the same way.
Let me try to explain (i hope i don’t make a mess, it’s 03:18 and i’m sleepy)

Each solid is a “set” by itself, and can intersect/unite/difference with another solid like a set would do.
Then… the parameters tooltip call the list of solids “set” again, and that can make confusion. (a set of sets)

This is an example scenario, “A” contains 1 solid and “B” 4 solids: (pic1)

With solid difference you get: (pic 2)

What happened?
Every solid in A was iteratively “subtracted” with every solids in B. And we like it this way. :laughing:
(((A \setminus B0) \setminus B1) \setminus B2) \setminus B3

If it didn’t work exactly that way, we would have been forced to do something like this: (pic 3)

Which is a mess!! And if the B amount is variable we couldn’t even have a proper solution!

So, we don’t want a behavior like this (fake): (pic 4)

Where the solid in A is intersected with the first solid in B and stop. Then A with the second in B and stop. etc…

Because then we would have the solid difference work the same way (fake): (pic 5)

Where the solid in A is subtracted with the first solid in B and stop. Then A minus the second in B and stop. etc…

No, the component are working all with the same logic, and we like it as in picture 2.
Every (1 by 1) object in A is “combined” with all the objects in B.

So, lastly, this behavior is correct: (pic 6)

Because following the same logic of picture 2:
(((A \cap B0 ) \cap B1 ) \cap B2 ) \cap B3 is nothing!
…because the elements in B don’t intersect each other… they don’t share a common solid volume.

If you want a particular intersection with an object in A and an object in B you have to do the proper branching and item selecting.

I might have done a mess… feel free to correct, but i’m enough sure the concept is there…

1 Like


I’m still struggling to understand how this block works exactly. I have posted about this before and I thought I had a grasp of it, but in a more complex example I am not getting the results I expected.
My previous post:

And my most recent problem:

I’m trying to find the overlapping areas between two sets of similar objects derived from sections through a torroid. One set of input objects (Breps A) has been flattened, I need to maintain the tree structure of the other input objects in the result (Breps B). I want to see all the intersections of each object in Breps B with any of the objects in Breps A.


The Solid Intersection block is not returning the expected intersections. One of the data-tree branches has a list of 2 Breps, and these are not showing any results.

I think there may be a solution involving the Cross Reference block but i haven’t been able to work it out so far. Any help would be greatly appreciated (Again!).

Solid Intersection Fail with Data Tree.gh (49.2 KB)

Probably that can be a way. I’ve used Longest List for the same effect, repeating objects.

Solid Intersection Fail with Data Tree_re.gh (47.0 KB)

There is a problem: you are trying to do solid operations with solids that have aligned/overlapping/tangent surfaces, or even exactly the same solid! I bypassed that problem with scale 1.1, to have fully-intersecting intersections.
That can make you misinterpret the quality of your algorythm, making you think the data structure is wrong, while instead it is actually failing the intersection part.

I suggest you to work with curve booleans (but even there there is similar problem with aligned/overlapping/tangent curves) as your solid seems to be simple extrusions.
Or rework everything going even back…

This doesn’t do that. It gets the intersection of each set (branch) of objects in Breps B with corresponding branches in Brep A. I don’t understand Param Viewers or how you got yourself into this dilemma. Are these sections (A and B) from two different torus shapes?

Solid Intersection_2021Feb4a.gh (52.9 KB)

Hi Riccardo, thanks for your help. I hadn’t realised that the solid intersection block could not handle intersections between identical objects, I expected the result to be a single copy of the object.

Yes these are simple extrusions, based on sections through a solid subject object. I’ve tried working with curves but I had issues when the subject object was hollow or had cavities, that is why I’ve been trying to make this work using solids.

Hi Joseph, what I am working on is similar to a waffle. I have a laser cutter that I am using to create 3d models, constructed by a number of flat pieces. The laser cutting head can only cut at 90 degrees, so each piece must have a square edge. I’ve seen plugins and examples of code where a section is taken through the object to give a curve, and the curve is then extruded to give a solid object. The reason I’m doing something different is that I need the pieces I cut to fit inside the original object without protruding at all.

The sections are from the same toroid.

I’m using the parameter viewer to visualise the tree structure. There’s nothing more to it than that.

The text panels are there to visualize the tree structure. Nothing more to say.